From 57b181690c37b2262173986fc5e55abf183fab9a Mon Sep 17 00:00:00 2001 From: aelmanaa Date: Fri, 14 Nov 2025 15:53:15 +0100 Subject: [PATCH 001/214] mock data --- src/config/cdn.ts | 14 ++ src/config/data/ccip/data.ts | 238 ++++++++++++++++++ src/config/data/ccip/types.ts | 21 ++ .../data/ccip/v1_2_0/mainnet/verifiers.json | 60 +++++ .../data/ccip/v1_2_0/testnet/verifiers.json | 55 ++++ src/features/utils/index.ts | 4 +- src/scripts/data/detect-new-data.ts | 3 +- 7 files changed, 393 insertions(+), 2 deletions(-) create mode 100644 src/config/cdn.ts create mode 100644 src/config/data/ccip/v1_2_0/mainnet/verifiers.json create mode 100644 src/config/data/ccip/v1_2_0/testnet/verifiers.json diff --git a/src/config/cdn.ts b/src/config/cdn.ts new file mode 100644 index 00000000000..43eb8fbb53c --- /dev/null +++ b/src/config/cdn.ts @@ -0,0 +1,14 @@ +/** + * CDN Base URLs and asset path configuration + * Centralized configuration for all CDN-hosted assets + */ + +// CloudFront CDN base URL +export const CLOUDFRONT_CDN_BASE = "https://d2f70xi62kby8n.cloudfront.net" + +// Asset-specific paths +export const TOKEN_ICONS_PATH = `${CLOUDFRONT_CDN_BASE}/tokens` +export const VERIFIER_LOGOS_PATH = `${CLOUDFRONT_CDN_BASE}/verifiers` + +// Other CDNs (for future centralization if needed) +export const IMGIX_CDN_BASE = "https://smartcontract.imgix.net" diff --git a/src/config/data/ccip/data.ts b/src/config/data/ccip/data.ts index 3eec6d88f9e..cfc55662854 100644 --- a/src/config/data/ccip/data.ts +++ b/src/config/data/ccip/data.ts @@ -13,9 +13,13 @@ import { Network, DecomConfig, DecommissionedNetwork, + VerifiersConfig, + Verifier, + VerifierType, } from "./types.ts" import { determineTokenMechanism } from "./utils.ts" import { ExplorerInfo, SupportedChain, ChainType } from "@config/types.ts" +import { VERIFIER_LOGOS_PATH } from "@config/cdn.ts" import { directoryToSupportedChain, getChainIcon, @@ -42,6 +46,10 @@ import tokensTestnetv120 from "@config/data/ccip/v1_2_0/testnet/tokens.json" wit import decomMainnetv120 from "@config/data/ccip/v1_2_0/mainnet/decom.json" with { type: "json" } import decomTestnetv120 from "@config/data/ccip/v1_2_0/testnet/decom.json" with { type: "json" } +// For verifiers +import verifiersMainnetv120 from "@config/data/ccip/v1_2_0/mainnet/verifiers.json" with { type: "json" } +import verifiersTestnetv120 from "@config/data/ccip/v1_2_0/testnet/verifiers.json" with { type: "json" } + // Import errors by version // eslint-disable-next-line camelcase import * as errors_v1_5_0 from "./errors/v1_5_0/index.ts" @@ -815,3 +823,233 @@ export const getDecommissionedNetwork = ({ chain, filter }: { chain: string; fil const decommissionedChains = getAllDecommissionedNetworks({ filter }) return decommissionedChains.find((network) => network.chain === chain) } + +// ============================================================================ +// Verifier utilities +// ============================================================================ + +/** + * Load verifiers data for a specific environment and version + */ +export const loadVerifiersData = ({ environment, version }: { environment: Environment; version: Version }) => { + let verifiersReferenceData: VerifiersConfig + + if (environment === Environment.Mainnet && version === Version.V1_2_0) { + verifiersReferenceData = verifiersMainnetv120 as unknown as VerifiersConfig + } else if (environment === Environment.Testnet && version === Version.V1_2_0) { + verifiersReferenceData = verifiersTestnetv120 as unknown as VerifiersConfig + } else { + throw new Error(`Invalid environment/version combination for verifiers: ${environment}/${version}`) + } + + return { verifiersReferenceData } +} + +/** + * Get logo URL for a verifier by ID + * Uses CloudFront CDN, same infrastructure as token icons + */ +export const getVerifierLogoUrl = (verifierId: string): string => { + return `${VERIFIER_LOGOS_PATH}/${verifierId}.svg` +} + +/** + * Map verifier type to display-friendly name + */ +export const getVerifierTypeDisplay = (type: VerifierType): string => { + const VERIFIER_TYPE_DISPLAY: Record = { + committee: "Committee", + api: "API", + } + + return VERIFIER_TYPE_DISPLAY[type] || type +} + +/** + * Get all verifiers for a specific environment as a flattened list + */ +export const getAllVerifiers = ({ + environment, + version = Version.V1_2_0, +}: { + environment: Environment + version?: Version +}): Verifier[] => { + const { verifiersReferenceData } = loadVerifiersData({ environment, version }) + + const verifiers: Verifier[] = [] + + // Flatten the network -> address -> metadata structure + for (const [networkId, addressMap] of Object.entries(verifiersReferenceData)) { + for (const [address, metadata] of Object.entries(addressMap)) { + verifiers.push({ + ...metadata, + network: networkId, + address, + logo: getVerifierLogoUrl(metadata.id), + }) + } + } + + // Sort by verifier name, then by network + return verifiers.sort((a, b) => { + const nameComparison = a.name.localeCompare(b.name) + if (nameComparison !== 0) return nameComparison + return a.network.localeCompare(b.network) + }) +} + +/** + * Get all verifiers for a specific network + */ +export const getVerifiersByNetwork = ({ + networkId, + environment, + version = Version.V1_2_0, +}: { + networkId: string + environment: Environment + version?: Version +}): Verifier[] => { + const { verifiersReferenceData } = loadVerifiersData({ environment, version }) + + const addressMap = verifiersReferenceData[networkId] + if (!addressMap) { + return [] + } + + const verifiers: Verifier[] = [] + for (const [address, metadata] of Object.entries(addressMap)) { + verifiers.push({ + ...metadata, + network: networkId, + address, + logo: getVerifierLogoUrl(metadata.id), + }) + } + + return verifiers.sort((a, b) => a.name.localeCompare(b.name)) +} + +/** + * Get all verifiers of a specific type (committee or api) + */ +export const getVerifiersByType = ({ + type, + environment, + version = Version.V1_2_0, +}: { + type: VerifierType + environment: Environment + version?: Version +}): Verifier[] => { + const allVerifiers = getAllVerifiers({ environment, version }) + return allVerifiers.filter((verifier) => verifier.type === type) +} + +/** + * Get all networks where a specific verifier exists (by verifier ID) + */ +export const getVerifierById = ({ + id, + environment, + version = Version.V1_2_0, +}: { + id: string + environment: Environment + version?: Version +}): Verifier[] => { + const allVerifiers = getAllVerifiers({ environment, version }) + return allVerifiers.filter((verifier) => verifier.id === id) +} + +/** + * Get a specific verifier by network and address + */ +export const getVerifier = ({ + networkId, + address, + environment, + version = Version.V1_2_0, +}: { + networkId: string + address: string + environment: Environment + version?: Version +}): Verifier | undefined => { + const { verifiersReferenceData } = loadVerifiersData({ environment, version }) + + const addressMap = verifiersReferenceData[networkId] + if (!addressMap) { + return undefined + } + + const metadata = addressMap[address] + if (!metadata) { + return undefined + } + + return { + ...metadata, + network: networkId, + address, + logo: getVerifierLogoUrl(metadata.id), + } +} + +/** + * Get all network IDs where a specific verifier exists + * Similar to getChainsOfToken for tokens + */ +export const getNetworksOfVerifier = ({ + id, + environment, + version = Version.V1_2_0, +}: { + id: string + environment: Environment + version?: Version +}): string[] => { + const verifiers = getVerifierById({ id, environment, version }) + return verifiers.map((v) => v.network) +} + +/** + * Get unique verifiers for display (deduplicated by ID) + * Returns one entry per verifier with totalNetworks count + * Useful for landing page display where each verifier should appear once + */ +export const getAllUniqueVerifiers = ({ + environment, + version = Version.V1_2_0, +}: { + environment: Environment + version?: Version +}): Array<{ + id: string + name: string + type: VerifierType + logo: string + totalNetworks: number +}> => { + const allVerifiers = getAllVerifiers({ environment, version }) + + // Get unique verifier IDs + const uniqueIds = Array.from(new Set(allVerifiers.map((v) => v.id))) + + // Map to display format with network count + return uniqueIds + .map((id) => { + const instances = allVerifiers.filter((v) => v.id === id) + const firstInstance = instances[0] + + return { + id, + name: firstInstance.name, + type: firstInstance.type, + logo: firstInstance.logo, + totalNetworks: instances.length, + } + }) + .sort((a, b) => a.name.localeCompare(b.name)) +} diff --git a/src/config/data/ccip/types.ts b/src/config/data/ccip/types.ts index e12d25d1828..2c208a4220d 100644 --- a/src/config/data/ccip/types.ts +++ b/src/config/data/ccip/types.ts @@ -232,3 +232,24 @@ export interface DecommissionedNetwork { explorer: ExplorerInfo chainType: ChainType } + +// Verifier types +export type VerifierType = "committee" | "api" + +export interface VerifierMetadata { + id: string + name: string + type: VerifierType +} + +export interface VerifiersConfig { + [networkId: string]: { + [address: string]: VerifierMetadata + } +} + +export interface Verifier extends VerifierMetadata { + network: string + address: string + logo: string +} diff --git a/src/config/data/ccip/v1_2_0/mainnet/verifiers.json b/src/config/data/ccip/v1_2_0/mainnet/verifiers.json new file mode 100644 index 00000000000..5bac359e6ed --- /dev/null +++ b/src/config/data/ccip/v1_2_0/mainnet/verifiers.json @@ -0,0 +1,60 @@ +{ + "mainnet": { + "0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D": { + "id": "chainlink", + "name": "Chainlink", + "type": "committee" + }, + "0xF4c7E640EdA248ef95972845a62bdC74237805dB": { + "id": "lombard", + "name": "Lombard", + "type": "api" + }, + "0x768a1a3B321126A8B214d7376D48465C7f6Fa061": { + "id": "cctp", + "name": "CCTP", + "type": "api" + }, + "0xcBD48A8eB077381c3c4Eb36b402d7283aB2b11Bc": { + "id": "symbiotic", + "name": "Symbiotic", + "type": "api" + } + }, + "ethereum-mainnet-base-1": { + "0x0aA145a62153190B8f0D3cA00c441e451529f755": { + "id": "chainlink-labs", + "name": "Chainlink Labs", + "type": "committee" + }, + "0x09521B0B5BB2d4406124c0207Cf551829B45f84d": { + "id": "cctp", + "name": "CCTP", + "type": "api" + } + }, + "ethereum-mainnet-arbitrum-1": { + "0xe9c6945281028cb6530d43F998eE539dFE2a9191": { + "id": "chainlink-labs", + "name": "Chainlink Labs", + "type": "committee" + }, + "0xBF38331E34ef7f248020611bB31Be0576D06413D": { + "id": "lombard", + "name": "Lombard", + "type": "api" + } + }, + "ethereum-mainnet-optimism-1": { + "0x2edAc8B8928c4e1Ed559e619b6A8a4aaCe9Ef18A": { + "id": "cctp", + "name": "CCTP", + "type": "api" + }, + "0x76Aa17dCda9E8529149E76e9ffaE4aD1C4AD701B": { + "id": "symbiotic", + "name": "Symbiotic", + "type": "api" + } + } +} diff --git a/src/config/data/ccip/v1_2_0/testnet/verifiers.json b/src/config/data/ccip/v1_2_0/testnet/verifiers.json new file mode 100644 index 00000000000..2614058b4bd --- /dev/null +++ b/src/config/data/ccip/v1_2_0/testnet/verifiers.json @@ -0,0 +1,55 @@ +{ + "ethereum-testnet-sepolia": { + "0x91339eb99C4c2Be9A071203DD99E014A3189FD29": { + "id": "chainlink", + "name": "Chainlink", + "type": "committee" + }, + "0x56c4b06A0F59AcFAAb58FEA0d7Ca4090695F683f": { + "id": "lombard", + "name": "Lombard", + "type": "api" + }, + "0x051665f2455116e929b9972c36d23070F5054Ce0": { + "id": "cctp", + "name": "CCTP", + "type": "api" + } + }, + "ethereum-testnet-sepolia-base-1": { + "0x7EEdf2DBC74924Cb1f23fC8845CD35bF18b697de": { + "id": "chainlink-labs", + "name": "Chainlink Labs", + "type": "committee" + }, + "0xD3ED6fC9fd22412764ac2Ef64fB664b9393dF9F2": { + "id": "cctp", + "name": "CCTP", + "type": "api" + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "0xa132F089492CcE5f1D79483a9e4552f37266ed01": { + "id": "chainlink-labs", + "name": "Chainlink Labs", + "type": "committee" + }, + "0xb0B4b5847E35033766d5B49CD9C0fC40F459321F": { + "id": "lombard", + "name": "Lombard", + "type": "api" + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "0x0B8B717f8D65DeC5c9e440A9eD51f48887E83c1b": { + "id": "cctp", + "name": "CCTP", + "type": "api" + }, + "0x34E63B2B9491570FCc01CC0b288569851EF47B27": { + "id": "symbiotic", + "name": "Symbiotic", + "type": "api" + } + } +} diff --git a/src/features/utils/index.ts b/src/features/utils/index.ts index 6ee29217a5f..4a473148f7d 100644 --- a/src/features/utils/index.ts +++ b/src/features/utils/index.ts @@ -9,6 +9,7 @@ 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" } @@ -156,10 +157,11 @@ export const getTokenIconUrl = (token: string, size = 40) => { // Request appropriately sized images from CloudFront // For 40x40 display, request 80x80 for retina displays (2x) - return `https://d2f70xi62kby8n.cloudfront.net/tokens/${transformTokenName(iconIdentifier)}.webp?auto=compress%2Cformat&q=60&w=${size}&h=${size}&fit=cover` + return `${TOKEN_ICONS_PATH}/${transformTokenName(iconIdentifier)}.webp?auto=compress%2Cformat&q=60&w=${size}&h=${size}&fit=cover` } export const fallbackTokenIconUrl = "/assets/icons/generic-token.svg" +export const fallbackVerifierIconUrl = "/assets/icons/generic-verifier.svg" export const getChainId = (supportedChain: SupportedChain) => { const technology = chainToTechnology[supportedChain] diff --git a/src/scripts/data/detect-new-data.ts b/src/scripts/data/detect-new-data.ts index 4be709817f6..fecdd6576fe 100644 --- a/src/scripts/data/detect-new-data.ts +++ b/src/scripts/data/detect-new-data.ts @@ -12,6 +12,7 @@ import fs from "fs" import path from "path" import fetch from "node-fetch" import prettier from "prettier" +import { TOKEN_ICONS_PATH } from "../../config/cdn.js" // Network endpoints mapping for different blockchain networks // Each endpoint provides a JSON file containing feed definitions for that network @@ -79,7 +80,7 @@ interface DataItem { * @returns URL to the asset's icon image */ function buildIconUrl(baseAsset: string): string { - return `https://d2f70xi62kby8n.cloudfront.net/tokens/${baseAsset.toLowerCase()}.webp` + return `${TOKEN_ICONS_PATH}/${baseAsset.toLowerCase()}.webp` } /** From c3a19626617418e491d4eb3aef947a436dd3e52f Mon Sep 17 00:00:00 2001 From: Simone Cuomo Date: Wed, 26 Nov 2025 08:00:44 +0000 Subject: [PATCH 002/214] Squash work (#166) * Feat/82 update packages (#94) * chore: add blocks package * feat: install tailwind * chore: install tailwind v3 * fix: remove autoprefixer * Restore package-lock * fix: disable preflight * Feat/83 remove secondary header (#95) * Remove DocsNavigation from DocsLayout. Update styling to accomodate. * fix: adjust left grid sticky and padding * Update leftSidebar.module.css * fix: remove docs from tutoriallayout * checkpoint: added block styling * Update left sidebar style and add quick links * remove bg from left sidebar * remove additional links from right sidebar * fix styling * fix tailwind rendering for blocks components. spot fix styling overrides from tailwind * Update docsHeaderTitle.module.css * Update leftSidebar.module.css * Update LeftSidebar.astro * Update PageContent.astro * Update DocsHeaderTitle.astro * Adds DocsV3Layout skeleton (#102) * fix spacing * Feat: Add cards (#101) * add cards * update styling * adjust types * fix heading * cleanup grid styling * Feat/93 layout tutorials (#104) * add tutorial foundation * Add tutorial components * add README * support N number of columns and add arrow icon * Update index.astro * remove unused import * Update GridCard.module.css * change how we add borders * make grid responsive --------- Co-authored-by: Simone Cuomo * Feat/91 layout hero (#103) * add layout hero * use button component styles for the button links * removing unused styles * Feat/108 info tab (#120) * add info card * Update QuickLinkCard.module.css * Update QuickLinkCard.module.css * Feat/112 image (#118) * add media structure * Create README.md --------- Co-authored-by: Simone Cuomo * Add resources grid (#117) * add resources grid * adjust image linking --------- Co-authored-by: Simone Cuomo * Feat/110 tools utilities (#116) * add grid * Update DocsV3Layout.astro * Update DocsV3Layout.astro * rwd * Update DocsV3Layout.astro * Update DocsV3Layout.astro * Update ToolsUtilitiesGrid.astro * add readme --------- Co-authored-by: Simone Cuomo * Feat/make overview page (#122) * move all new components to overview (index mdx) page * fix css rule * update example links to real links * fix linkchecker * Feat/115 mobile components (#119) * RWD layout hero * RWD cards and tutorials * improve mobile spacing * fix tab trigger jump * Add chainlink journey (#133) * add journey cards * move components --------- Co-authored-by: Simone Cuomo * Feat/127 tech standards (#134) * add journey cards * add tech standards * Update TechnicalStandards.astro * Update TechnicalStandards.astro * Update TechnicalStandards.astro * Update TechnicalStandards.astro * Feat/128 demos (#136) * add demos * add hover effects * update styling * wrap up * fixes merge conflicts * add anchor tags * Feat/114 changelog (#135) * add changelog stylin and elements * Add footer masking * Update ChangelogCard.module.css * mobile improvements * Update ChangelogCard.astro * wrap up * add prop for query * add README * add fade to show more * Update ChangelogSnippet.astro * add query types * fix merge conflicts * Update ChangelogSnippet.astro * clarify comment * add mobile journeys (#141) * add mobile journeys * remove old grid card css * Feat/86 megamenu (#137) * add basic megamenu structure and add missing icons * update megamenu desktop design * Update MegaMenu.tsx * Feat/85 hero (#132) * add hero * fix styling * fix css issue on dropdown menu * Update ProductNavigation.tsx * Update landingHero.module.css * add truncate * fix some styling * cleaned up old components and fixed some mobile styling * format megamenu and remove dead code * Update productNavigation.module.css * Update index.astro * Feat/129 community (#143) * html foundation * finish * Update CommunityEvents.module.css * Update CommunityEvents.astro * update styling * Update fetchEvents.ts * Update CommunityEvents.astro * Update CommunityEvents.module.css * Add get certified page (#151) * add certified base * Update certification.astro * Update certification.astro * Update certification.astro * Update certification.astro * update colour token * Update ProductNavigation.tsx * Feat/130 try it (#142) * add component * styling * update try it out component * Update MegaMenu.tsx * wrap up tryit * add README * Update TryItOutAccordion.tsx * add dynamic code samples and accordian control * prerender code * Update CodeSampleReact.tsx * Update styles.module.css --------- Co-authored-by: Simone Cuomo * Support video in resources section (#147) * support video * Update ResourceCard.astro * Update ResourceCard.astro * Update Package.json * Fixes from merge with main (#165) * fixes from merge with main * fix directory header * Update Package.json after merge --------- Co-authored-by: Tyrel Chambers --- astro.config.ts | 2 + package-lock.json | 9313 ++++++++++++----- package.json | 7 + public/assets/icons/Arrow Right.svg | 3 + public/assets/icons/upper-right-arrow.svg | 3 + public/images/architecture.png | Bin 0 -> 86094 bytes public/images/ccip-logo.svg | 3 + public/images/ccip/ccip-hero-bg.png | Bin 0 -> 151643 bytes public/images/ccip/ccip-hero.png | Bin 0 -> 19767 bytes .../certification/Imagedevhubresources.png | Bin 0 -> 81634 bytes .../images/certification/Imagedevhubvideo.png | Bin 0 -> 79940 bytes .../certification/Tailless--Arrow-Down.svg | 3 + public/images/certification/image-1.png | Bin 0 -> 30293 bytes public/images/certification/image-200.png | Bin 0 -> 207526 bytes public/images/certification/image-201.png | Bin 0 -> 73109 bytes .../certification/image-certificate.svg | 248 + .../images/certification/image-learnings.svg | 62 + public/images/code-sample.png | Bin 0 -> 76453 bytes public/images/demos/Demos thumbnails 1.png | Bin 0 -> 15339 bytes public/images/demos/Demos thumbnails 2.png | Bin 0 -> 17402 bytes public/images/demos/Demos thumbnails 3.png | Bin 0 -> 27777 bytes public/images/demos/Demos thumbnails 4.png | Bin 0 -> 46300 bytes public/images/direct-stacking-logo.svg | 8 + public/images/foundry-logo.svg | 11 + public/images/hardhat-logo.svg | 20 + public/images/hero-1.png | Bin 0 -> 902720 bytes public/images/hero-dotted.png | Bin 0 -> 138976 bytes public/images/info-sidebar-img.png | Bin 0 -> 72666 bytes public/images/js-logo.svg | 4 + public/images/npm-logo.png | Bin 0 -> 493 bytes public/images/tryitout.png | Bin 0 -> 121198 bytes public/images/ts-logo.svg | 5 + src/assets/icons/remix-logo.svg | 13 + src/assets/icons/token-icon.svg | 19 + .../automated-compliance-engine.svg | 5 + .../product-logos/chainlink-local-2-logo.svg | 5 + src/assets/product-logos/data-link-vault.svg | 13 + .../product-logos/general-globe-logo.svg | 7 + src/assets/product-logos/nodes-logo.svg | 22 + src/components/CCIP/Hero/Hero.css | 9 + src/components/CCIP/Hero/Hero.tsx | 5 +- src/components/Cards/Card.astro | 17 + src/components/Cards/CardLink.astro | 27 + src/components/Cards/CardsWrapper.astro | 15 + src/components/Cards/cards.module.css | 66 + src/components/Cards/types.ts | 12 + .../ChainTypeSelector.module.css | 3 +- .../ChangelogSnippet/ChangelogCard.astro | 313 + .../ChangelogSnippet/ChangelogCard.module.css | 150 + .../ChangelogSnippet/ChangelogSnippet.astro | 65 + .../ChangelogSnippet.module.css | 46 + src/components/ChangelogSnippet/README.md | 37 + src/components/ChangelogSnippet/types.ts | 31 + src/components/CodeSample/CodeSample.astro | 5 +- src/components/CodeSample/CodeSampleReact.tsx | 1 - .../CommunityEvents/CommunityEvents.astro | 110 + .../CommunityEvents.module.css | 87 + .../CommunityEvents/EventCard.astro | 32 + .../CommunityEvents/EventCard.module.css | 80 + .../CommunityEvents/ImageGallery.astro | 42 + .../CommunityEvents/ImageGallery.module.css | 70 + src/components/CommunityEvents/fetchEvents.ts | 53 + src/components/CommunityEvents/types.ts | 18 + src/components/Demos.astro | 90 + src/components/Demos.module.css | 99 + .../DocsHeaderTitle/DocsHeaderTitle.astro | 24 + .../docsHeaderTitle.module.css | 11 + .../DocsNavigationDesktop.tsx | 6 +- .../DocsPickerDesktop.tsx | 63 - src/components/Footer/Footer.astro | 6 + src/components/Footer/NewsletterCTA.css | 9 + src/components/HeadCommon.astro | 1 + .../ProductNavigation/Desktop/MegaMenu.tsx | 467 +- .../Desktop/MegaMenuContainer.tsx | 27 + .../Desktop/ProductNavigation.tsx | 24 +- .../Desktop/megaMenu.module.css | 167 +- .../Desktop/productNavigation.module.css | 13 - .../Nav/ProductNavigation/Mobile/MegaMenu.tsx | 94 - .../Mobile/ProductNavigation.tsx | 16 +- .../Mobile/megaMenu.module.css | 142 - .../Mobile/productNavigation.module.css | 3 +- src/components/Header/Nav/navBar.module.css | 7 +- src/components/Header/NavBar.tsx | 10 +- .../JourneyCards/JourneyCards.astro | 258 + .../JourneyCards/JourneyTabGrid.module.css | 124 + .../JourneyCards/JourneyTabGrid.tsx | 71 + src/components/LandingHero/LandingHero.astro | 21 + .../LandingHero/landingHero.module.css | 69 + src/components/LayoutHero/LayoutHero.astro | 45 + .../LayoutHero/LayoutHero.module.css | 99 + src/components/LayoutHero/README.md | 84 + src/components/LeftSidebar/LeftSidebar.astro | 42 +- .../LeftSidebar/leftSidebar.module.css | 81 +- .../LeftSidebar/recursiveSidebar.module.css | 50 +- .../MediaSection/MediaSection.astro | 46 + .../MediaSection/MediaSection.module.css | 25 + src/components/MediaSection/README.md | 44 + src/components/OverviewWrapper.astro | 20 + src/components/PageContent/PageContent.astro | 312 +- src/components/PageContent/WhatsNext.astro | 7 +- .../QuickLinkCard/QuickLinkCard.astro | 44 + .../QuickLinkCard/QuickLinkCard.module.css | 66 + src/components/QuickLinkCard/README.md | 214 + src/components/Resource/README.md | 106 + src/components/Resource/ResourceCard.astro | 47 + .../Resource/ResourceCard.module.css | 104 + src/components/Resource/ResourceGrid.astro | 24 + .../Resource/ResourceGrid.module.css | 17 + src/components/Resource/ResourceSection.astro | 23 + .../Resource/ResourceSection.module.css | 11 + src/components/RightSidebar/MoreMenu.astro | 42 - src/components/TabGrid/GridCard.module.css | 80 + src/components/TabGrid/GridCard.tsx | 27 + src/components/TabGrid/ItemGrid.tsx | 17 + src/components/TabGrid/README.md | 90 + src/components/TabGrid/TabGrid.module.css | 84 + src/components/TabGrid/TabGrid.tsx | 47 + .../TechnicalStandards.astro | 132 + src/components/ToolsUtilitiesGrid/README.md | 82 + .../ToolsUtilitiesGrid/ToolItem.astro | 28 + .../ToolsUtilitiesGrid.astro | 26 + .../toolsUtilities.module.css | 60 + src/components/ToolsUtilitiesGrid/types.ts | 7 + src/components/TryItOut/README.md | 92 + src/components/TryItOut/TryItOut.astro | 106 + src/components/TryItOut/TryItOutAccordion.tsx | 37 + src/components/TryItOut/styles.module.css | 124 + src/config/sidebar.ts | 1 + src/content.config.ts | 2 + src/content/ccip/index.mdx | 384 +- .../landing/sections/ProductTabs.astro | 8 - .../landing/sections/ProductTabs.module.css | 4 - src/layouts/BaseLayout.astro | 2 + src/layouts/DocsLayout.astro | 8 +- src/layouts/DocsV3Layout/DocsV3Layout.astro | 149 + src/layouts/DocsV3Layout/README.md | 110 + src/layouts/TutorialLayout.astro | 2 - src/pages/ccip/index.astro | 6 +- src/pages/certification.astro | 933 ++ src/pages/index.astro | 111 +- src/stores/tryItOutStore.ts | 3 + src/styles/index.css | 4 +- tailwind.config.js | 4 + tsconfig.json | 1 + 144 files changed, 13406 insertions(+), 3810 deletions(-) create mode 100644 public/assets/icons/Arrow Right.svg create mode 100644 public/assets/icons/upper-right-arrow.svg create mode 100644 public/images/architecture.png create mode 100644 public/images/ccip-logo.svg create mode 100644 public/images/ccip/ccip-hero-bg.png create mode 100644 public/images/ccip/ccip-hero.png create mode 100644 public/images/certification/Imagedevhubresources.png create mode 100644 public/images/certification/Imagedevhubvideo.png create mode 100644 public/images/certification/Tailless--Arrow-Down.svg create mode 100644 public/images/certification/image-1.png create mode 100644 public/images/certification/image-200.png create mode 100644 public/images/certification/image-201.png create mode 100644 public/images/certification/image-certificate.svg create mode 100644 public/images/certification/image-learnings.svg create mode 100644 public/images/code-sample.png create mode 100644 public/images/demos/Demos thumbnails 1.png create mode 100644 public/images/demos/Demos thumbnails 2.png create mode 100644 public/images/demos/Demos thumbnails 3.png create mode 100644 public/images/demos/Demos thumbnails 4.png create mode 100644 public/images/direct-stacking-logo.svg create mode 100644 public/images/foundry-logo.svg create mode 100644 public/images/hardhat-logo.svg create mode 100644 public/images/hero-1.png create mode 100644 public/images/hero-dotted.png create mode 100644 public/images/info-sidebar-img.png create mode 100644 public/images/js-logo.svg create mode 100644 public/images/npm-logo.png create mode 100644 public/images/tryitout.png create mode 100644 public/images/ts-logo.svg create mode 100644 src/assets/icons/remix-logo.svg create mode 100644 src/assets/icons/token-icon.svg create mode 100644 src/assets/product-logos/automated-compliance-engine.svg create mode 100644 src/assets/product-logos/chainlink-local-2-logo.svg create mode 100644 src/assets/product-logos/data-link-vault.svg create mode 100644 src/assets/product-logos/general-globe-logo.svg create mode 100644 src/assets/product-logos/nodes-logo.svg create mode 100644 src/components/Cards/Card.astro create mode 100644 src/components/Cards/CardLink.astro create mode 100644 src/components/Cards/CardsWrapper.astro create mode 100644 src/components/Cards/cards.module.css create mode 100644 src/components/Cards/types.ts create mode 100644 src/components/ChangelogSnippet/ChangelogCard.astro create mode 100644 src/components/ChangelogSnippet/ChangelogCard.module.css create mode 100644 src/components/ChangelogSnippet/ChangelogSnippet.astro create mode 100644 src/components/ChangelogSnippet/ChangelogSnippet.module.css create mode 100644 src/components/ChangelogSnippet/README.md create mode 100644 src/components/ChangelogSnippet/types.ts create mode 100644 src/components/CommunityEvents/CommunityEvents.astro create mode 100644 src/components/CommunityEvents/CommunityEvents.module.css create mode 100644 src/components/CommunityEvents/EventCard.astro create mode 100644 src/components/CommunityEvents/EventCard.module.css create mode 100644 src/components/CommunityEvents/ImageGallery.astro create mode 100644 src/components/CommunityEvents/ImageGallery.module.css create mode 100644 src/components/CommunityEvents/fetchEvents.ts create mode 100644 src/components/CommunityEvents/types.ts create mode 100644 src/components/Demos.astro create mode 100644 src/components/Demos.module.css create mode 100644 src/components/DocsHeaderTitle/DocsHeaderTitle.astro create mode 100644 src/components/DocsHeaderTitle/docsHeaderTitle.module.css delete mode 100644 src/components/DocsNavigation/DocsNavigationDesktop/DocsPickerDesktop.tsx create mode 100644 src/components/Header/Nav/ProductNavigation/Desktop/MegaMenuContainer.tsx delete mode 100644 src/components/Header/Nav/ProductNavigation/Mobile/MegaMenu.tsx delete mode 100644 src/components/Header/Nav/ProductNavigation/Mobile/megaMenu.module.css create mode 100644 src/components/JourneyCards/JourneyCards.astro create mode 100644 src/components/JourneyCards/JourneyTabGrid.module.css create mode 100644 src/components/JourneyCards/JourneyTabGrid.tsx create mode 100644 src/components/LandingHero/LandingHero.astro create mode 100644 src/components/LandingHero/landingHero.module.css create mode 100644 src/components/LayoutHero/LayoutHero.astro create mode 100644 src/components/LayoutHero/LayoutHero.module.css create mode 100644 src/components/LayoutHero/README.md create mode 100644 src/components/MediaSection/MediaSection.astro create mode 100644 src/components/MediaSection/MediaSection.module.css create mode 100644 src/components/MediaSection/README.md create mode 100644 src/components/OverviewWrapper.astro create mode 100644 src/components/QuickLinkCard/QuickLinkCard.astro create mode 100644 src/components/QuickLinkCard/QuickLinkCard.module.css create mode 100644 src/components/QuickLinkCard/README.md create mode 100644 src/components/Resource/README.md create mode 100644 src/components/Resource/ResourceCard.astro create mode 100644 src/components/Resource/ResourceCard.module.css create mode 100644 src/components/Resource/ResourceGrid.astro create mode 100644 src/components/Resource/ResourceGrid.module.css create mode 100644 src/components/Resource/ResourceSection.astro create mode 100644 src/components/Resource/ResourceSection.module.css create mode 100644 src/components/TabGrid/GridCard.module.css create mode 100644 src/components/TabGrid/GridCard.tsx create mode 100644 src/components/TabGrid/ItemGrid.tsx create mode 100644 src/components/TabGrid/README.md create mode 100644 src/components/TabGrid/TabGrid.module.css create mode 100644 src/components/TabGrid/TabGrid.tsx create mode 100644 src/components/TechnicalStandards/TechnicalStandards.astro create mode 100644 src/components/ToolsUtilitiesGrid/README.md create mode 100644 src/components/ToolsUtilitiesGrid/ToolItem.astro create mode 100644 src/components/ToolsUtilitiesGrid/ToolsUtilitiesGrid.astro create mode 100644 src/components/ToolsUtilitiesGrid/toolsUtilities.module.css create mode 100644 src/components/ToolsUtilitiesGrid/types.ts create mode 100644 src/components/TryItOut/README.md create mode 100644 src/components/TryItOut/TryItOut.astro create mode 100644 src/components/TryItOut/TryItOutAccordion.tsx create mode 100644 src/components/TryItOut/styles.module.css delete mode 100644 src/features/landing/sections/ProductTabs.astro delete mode 100644 src/features/landing/sections/ProductTabs.module.css create mode 100644 src/layouts/DocsV3Layout/DocsV3Layout.astro create mode 100644 src/layouts/DocsV3Layout/README.md create mode 100644 src/pages/certification.astro create mode 100644 src/stores/tryItOutStore.ts create mode 100644 tailwind.config.js diff --git a/astro.config.ts b/astro.config.ts index bafbd5b77a2..16ae5388f55 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -13,6 +13,7 @@ import yaml from "@rollup/plugin-yaml" import { ccipRedirects } from "./src/config/redirects/ccip" import trailingSlashMiddleware from "./src/integrations/trailing-slash-middleware" import redirectsJson from "./src/features/redirects/redirects.json" +import tailwind from "@astrojs/tailwind" import { extractCanonicalUrlsWithLanguageVariants } from "./src/utils/sidebar" config() // Load .env file @@ -46,6 +47,7 @@ export default defineConfig({ ...ccipRedirects, }, integrations: [ + tailwind(), trailingSlashMiddleware(), preact({ include: ["**/preact/*"], diff --git a/package-lock.json b/package-lock.json index 878480f9781..c76e8b670d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,8 @@ "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", @@ -17,7 +19,9 @@ "@astrojs/prism": "^3.3.0", "@astrojs/react": "^4.4.2", "@astrojs/sitemap": "^3.6.0", + "@astrojs/tailwind": "^6.0.2", "@astrojs/vercel": "^8.2.11", + "@chainlink/blocks": "^1.3.1", "@chainlink/cl-search-frontend": "^0.12.1", "@chainlink/components": "^0.4.18", "@chainlink/contracts": "1.5.0", @@ -98,12 +102,15 @@ "pino-pretty": "^13.1.2", "prettier": "^3.5.3", "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-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", "tsconfig-paths": "^4.2.0", "tsx": "^4.20.6", @@ -472,6 +479,47 @@ "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", @@ -649,6 +697,49 @@ "zod": "^3.25.76" } }, + "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", + "postcss-load-config": "^4.0.2" + }, + "peerDependencies": { + "astro": "^3.0.0 || ^4.0.0 || ^5.0.0", + "tailwindcss": "^3.0.24" + } + }, + "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==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/@astrojs/telemetry": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", @@ -1299,683 +1390,653 @@ "node": ">=18" } }, - "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", - "integrity": "sha512-l/5hz8qsoIXpFt82iX0Hrw6tQC/CSaKXmZKah8A8XkC+REmMyC6FtQLNKBdHsLnuJ/EwnjyEGGhMNe26RjLsQA==", - "dependencies": { - "@algolia/client-search": "^5.17.1", - "dompurify": "^3.2.6", - "hast-util-sanitize": "^5.0.2", - "react-markdown": "^10.1.0", - "rehype-autolink-headings": "^7.1.0", - "rehype-prism-plus": "^2.0.0", - "rehype-sanitize": "^6.0.0", - "rehype-slug": "^6.0.0", - "remark-gfm": "^4.0.1" - }, - "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, - "node_modules/@chainlink/components": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/@chainlink/components/-/components-0.4.18.tgz", - "integrity": "sha512-x6DGq4YHPnLVY1Cwe0hYqj4T+6ekX8wDl7Jwxz91N2nubVp/pZCNOJVFcGTnIrcf+y5PEgPJZHu1qtob2ewqhQ==", + "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==", "license": "ISC", "dependencies": { - "@chainlink/design-system": "0.2.8", "@floating-ui/react": "0.22.2", - "@radix-ui/react-dialog": "1.0.5", + "@hookform/resolvers": "3.9.1", + "@radix-ui/react-accordion": "1.2.1", + "@radix-ui/react-checkbox": "1.1.2", + "@radix-ui/react-dialog": "1.1.6", "@radix-ui/react-dropdown-menu": "2.0.6", + "@radix-ui/react-label": "2.1.0", "@radix-ui/react-navigation-menu": "1.1.3", "@radix-ui/react-popover": "1.1.1", + "@radix-ui/react-radio-group": "1.2.1", + "@radix-ui/react-select": "2.1.2", "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-switch": "1.1.1", + "@radix-ui/react-tabs": "1.1.3", + "@radix-ui/react-toast": "1.2.4", + "@radix-ui/react-toggle": "1.1.9", + "@radix-ui/react-toggle-group": "1.1.9", "@radix-ui/react-tooltip": "1.0.7", "@tailwindcss/container-queries": "0.1.1", + "@tanstack/react-query": "5.69.0", + "@tanstack/react-table": "8.20.5", + "apexcharts": "4.5.0", "class-variance-authority": "0.7.0", "clsx": "2.1.1", - "ethers": "5.7.2", "lucide-react": "0.390.0", "react": "18.3.1", + "react-apexcharts": "1.7.0", "react-dom": "18.3.1", + "react-hook-form": "7.53.1", "react-modal": "3.16.1", "react-transition-group": "4.4.5", + "sonner": "1.7.3", "tailwind-merge": "2.3.0", "tailwindcss": "3.4.4", - "tailwindcss-animate": "1.0.7" + "tailwindcss-animate": "1.0.7", + "zod": "3.25.76" }, "peerDependencies": { - "next": "^14.2.4" - } - }, - "node_modules/@chainlink/components/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "react": ">=18.0.0 <19.0.0", + "react-dom": ">=18.0.0 <19.0.0", + "tailwindcss": ">=3.0.0 <4.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": false }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "react-dom": { + "optional": false } - ], - "license": "MIT", - "dependencies": { - "@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", + "node_modules/@chainlink/blocks/node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.6.tgz", + "integrity": "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==", + "license": "MIT", "dependencies": { - "@arbitrum/nitro-contracts": "3.0.0", - "@changesets/cli": "^2.29.6", - "@changesets/get-github-info": "^0.6.0", - "@eslint/eslintrc": "^3.3.1", - "@eth-optimism/contracts": "0.6.0", - "@openzeppelin/contracts-4.7.3": "npm:@openzeppelin/contracts@4.7.3", - "@openzeppelin/contracts-4.8.3": "npm:@openzeppelin/contracts@4.8.3", - "@openzeppelin/contracts-4.9.6": "npm:@openzeppelin/contracts@4.9.6", - "@openzeppelin/contracts-5.0.2": "npm:@openzeppelin/contracts@5.0.2", - "@openzeppelin/contracts-5.1.0": "npm:@openzeppelin/contracts@5.1.0", - "@openzeppelin/contracts-upgradeable": "4.9.6", - "@scroll-tech/contracts": "2.0.0", - "@zksync/contracts": "github:matter-labs/era-contracts#446d391d34bdb48255d5f8fef8a8248925fc98b9", - "semver": "^7.7.2" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.2", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.4", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" }, - "engines": { - "node": ">=22", - "pnpm": ">=10" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0": { - "name": "@chainlink/contracts", - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@chainlink/contracts/-/contracts-1.4.0.tgz", - "integrity": "sha512-SpNCJ0TPOI6pa2l702Wk4WIP8ccw5ARcRP1E/ZTqaFffXNoZeF03WhsVL8f3l3OTRFA9Z40O5KcZzmJmZQkoFA==", - "license": "BUSL-1.1", - "dependencies": { - "@arbitrum/nitro-contracts": "3.0.0", - "@changesets/cli": "~2.28.1", - "@changesets/get-github-info": "^0.6.0", - "@eth-optimism/contracts": "0.6.0", - "@openzeppelin/contracts": "4.9.6", - "@openzeppelin/contracts-upgradeable": "4.9.6", - "@scroll-tech/contracts": "0.1.0", - "@zksync/contracts": "github:matter-labs/era-contracts#446d391d34bdb48255d5f8fef8a8248925fc98b9", - "semver": "^7.7.1" + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=18", - "pnpm": ">=10" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@changesets/cli": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.28.1.tgz", - "integrity": "sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA==", + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", "license": "MIT", - "dependencies": { - "@changesets/apply-release-plan": "^7.0.10", - "@changesets/assemble-release-plan": "^6.0.6", - "@changesets/changelog-git": "^0.2.1", - "@changesets/config": "^3.1.1", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", - "@changesets/get-release-plan": "^4.0.8", - "@changesets/git": "^3.0.2", - "@changesets/logger": "^0.1.1", - "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.3", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@changesets/write": "^0.4.0", - "@manypkg/get-packages": "^1.1.3", - "ansi-colors": "^4.1.3", - "ci-info": "^3.7.0", - "enquirer": "^2.4.1", - "external-editor": "^3.1.0", - "fs-extra": "^7.0.1", - "mri": "^1.2.0", - "p-limit": "^2.2.0", - "package-manager-detector": "^0.2.0", - "picocolors": "^1.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.3", - "spawndamnit": "^3.0.1", - "term-size": "^2.1.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "bin": { - "changeset": "bin.js" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@eth-optimism/contracts": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.6.0.tgz", - "integrity": "sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==", + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.5.tgz", + "integrity": "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==", "license": "MIT", "dependencies": { - "@eth-optimism/core-utils": "0.12.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { - "ethers": "^5" - } - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/abi": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz", - "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "@types/react-dom": { + "optional": true } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/address": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/hash": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/abstract-provider": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz", - "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/networks": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/transactions": "^5.8.0", - "@ethersproject/web": "^5.8.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/abstract-signer": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz", - "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", "license": "MIT", "dependencies": { - "@ethersproject/abstract-provider": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0" + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/address": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz", - "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/rlp": "^5.8.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/base64": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz", - "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.2.tgz", + "integrity": "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==", "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.8.0" - } - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/basex": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz", - "integrity": "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "@types/react-dom": { + "optional": true } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/properties": "^5.8.0" } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/bignumber": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", - "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "bn.js": "^5.2.1" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/bytes": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", - "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.8.0" + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/constants": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", - "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.8.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/contracts": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz", - "integrity": "sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.4.tgz", + "integrity": "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==", "license": "MIT", - "peer": true, "dependencies": { - "@ethersproject/abi": "^5.8.0", - "@ethersproject/abstract-provider": "^5.8.0", - "@ethersproject/abstract-signer": "^5.8.0", - "@ethersproject/address": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/transactions": "^5.8.0" - } - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/hash": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz", - "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "@types/react-dom": { + "optional": true } - ], + } + }, + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/abstract-signer": "^5.8.0", - "@ethersproject/address": "^5.8.0", - "@ethersproject/base64": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/strings": "^5.8.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/hdnode": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz", - "integrity": "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "@types/react-dom": { + "optional": true } - ], + } + }, + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/abstract-signer": "^5.8.0", - "@ethersproject/basex": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/pbkdf2": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/sha2": "^5.8.0", - "@ethersproject/signing-key": "^5.8.0", - "@ethersproject/strings": "^5.8.0", - "@ethersproject/transactions": "^5.8.0", - "@ethersproject/wordlists": "^5.8.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/json-wallets": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz", - "integrity": "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz", + "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "@types/react-dom": { + "optional": true } - ], + } + }, + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", + "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", "license": "MIT", - "peer": true, "dependencies": { - "@ethersproject/abstract-signer": "^5.8.0", - "@ethersproject/address": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/hdnode": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/pbkdf2": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/random": "^5.8.0", - "@ethersproject/strings": "^5.8.0", - "@ethersproject/transactions": "^5.8.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/keccak256": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", - "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "js-sha3": "0.8.0" + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/logger": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", - "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "node_modules/@chainlink/blocks/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true } - ], - "license": "MIT" + } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/networks": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", - "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "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==", "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.8.0" + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/pbkdf2": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz", - "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "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", - "peer": true, "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/sha2": "^5.8.0" + "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/contracts-1.4.0/node_modules/@ethersproject/properties": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", - "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "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": { - "@ethersproject/logger": "^5.8.0" + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/providers": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz", - "integrity": "sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "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", - "peer": true, "dependencies": { - "@ethersproject/abstract-provider": "^5.8.0", - "@ethersproject/abstract-signer": "^5.8.0", - "@ethersproject/address": "^5.8.0", - "@ethersproject/base64": "^5.8.0", - "@ethersproject/basex": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/hash": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/networks": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/random": "^5.8.0", - "@ethersproject/rlp": "^5.8.0", - "@ethersproject/sha2": "^5.8.0", - "@ethersproject/strings": "^5.8.0", - "@ethersproject/transactions": "^5.8.0", - "@ethersproject/web": "^5.8.0", - "bech32": "1.1.4", - "ws": "8.18.0" + "@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/contracts-1.4.0/node_modules/@ethersproject/random": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz", - "integrity": "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "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", + "integrity": "sha512-l/5hz8qsoIXpFt82iX0Hrw6tQC/CSaKXmZKah8A8XkC+REmMyC6FtQLNKBdHsLnuJ/EwnjyEGGhMNe26RjLsQA==", + "dependencies": { + "@algolia/client-search": "^5.17.1", + "dompurify": "^3.2.6", + "hast-util-sanitize": "^5.0.2", + "react-markdown": "^10.1.0", + "rehype-autolink-headings": "^7.1.0", + "rehype-prism-plus": "^2.0.0", + "rehype-sanitize": "^6.0.0", + "rehype-slug": "^6.0.0", + "remark-gfm": "^4.0.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@chainlink/components": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/@chainlink/components/-/components-0.4.18.tgz", + "integrity": "sha512-x6DGq4YHPnLVY1Cwe0hYqj4T+6ekX8wDl7Jwxz91N2nubVp/pZCNOJVFcGTnIrcf+y5PEgPJZHu1qtob2ewqhQ==", + "license": "ISC", + "dependencies": { + "@chainlink/design-system": "0.2.8", + "@floating-ui/react": "0.22.2", + "@radix-ui/react-dialog": "1.0.5", + "@radix-ui/react-dropdown-menu": "2.0.6", + "@radix-ui/react-navigation-menu": "1.1.3", + "@radix-ui/react-popover": "1.1.1", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-tooltip": "1.0.7", + "@tailwindcss/container-queries": "0.1.1", + "class-variance-authority": "0.7.0", + "clsx": "2.1.1", + "ethers": "5.7.2", + "lucide-react": "0.390.0", + "react": "18.3.1", + "react-dom": "18.3.1", + "react-modal": "3.16.1", + "react-transition-group": "4.4.5", + "tailwind-merge": "2.3.0", + "tailwindcss": "3.4.4", + "tailwindcss-animate": "1.0.7" + }, + "peerDependencies": { + "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", - "peer": true, "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0" + "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/contracts-1.4.0/node_modules/@ethersproject/rlp": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz", - "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==", + "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", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "funding": [ { "type": "individual", @@ -1989,371 +2050,102 @@ "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0" + "@ethersproject/sha2": "^5.8.0" } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/sha2": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz", - "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/signing-key": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", - "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==", - "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.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "bn.js": "^5.2.1", - "elliptic": "6.6.1", - "hash.js": "1.1.7" - } - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/solidity": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.8.0.tgz", - "integrity": "sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==", - "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/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/sha2": "^5.8.0", - "@ethersproject/strings": "^5.8.0" - } - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/strings": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", - "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==", - "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.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/transactions": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz", - "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==", - "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/address": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/rlp": "^5.8.0", - "@ethersproject/signing-key": "^5.8.0" - } - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/units": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz", - "integrity": "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==", - "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/bignumber": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/wallet": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz", - "integrity": "sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==", - "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/abstract-provider": "^5.8.0", - "@ethersproject/abstract-signer": "^5.8.0", - "@ethersproject/address": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/hash": "^5.8.0", - "@ethersproject/hdnode": "^5.8.0", - "@ethersproject/json-wallets": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/random": "^5.8.0", - "@ethersproject/signing-key": "^5.8.0", - "@ethersproject/transactions": "^5.8.0", - "@ethersproject/wordlists": "^5.8.0" - } - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/web": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", - "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==", - "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/base64": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/strings": "^5.8.0" - } - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/wordlists": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz", - "integrity": "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==", - "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/hash": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/strings": "^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/contracts-1.4.0/node_modules/@openzeppelin/contracts": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", - "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==", - "license": "MIT" - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/@scroll-tech/contracts": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@scroll-tech/contracts/-/contracts-0.1.0.tgz", - "integrity": "sha512-aBbDOc3WB/WveZdpJYcrfvMYMz7ZTEiW8M9XMJLba8p9FAR5KGYB/cV+8+EUsq3MKt7C1BfR+WnXoTVdvwIY6w==", - "license": "MIT" - }, - "node_modules/@chainlink/contracts-1.4.0/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", - "peer": true - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "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", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "engines": { + "node": ">=10" } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "license": "MIT" - }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/ethers": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", - "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "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", - "peer": true, "dependencies": { - "@ethersproject/abi": "5.8.0", - "@ethersproject/abstract-provider": "5.8.0", - "@ethersproject/abstract-signer": "5.8.0", - "@ethersproject/address": "5.8.0", - "@ethersproject/base64": "5.8.0", - "@ethersproject/basex": "5.8.0", - "@ethersproject/bignumber": "5.8.0", - "@ethersproject/bytes": "5.8.0", - "@ethersproject/constants": "5.8.0", - "@ethersproject/contracts": "5.8.0", - "@ethersproject/hash": "5.8.0", - "@ethersproject/hdnode": "5.8.0", - "@ethersproject/json-wallets": "5.8.0", - "@ethersproject/keccak256": "5.8.0", - "@ethersproject/logger": "5.8.0", - "@ethersproject/networks": "5.8.0", - "@ethersproject/pbkdf2": "5.8.0", - "@ethersproject/properties": "5.8.0", - "@ethersproject/providers": "5.8.0", - "@ethersproject/random": "5.8.0", - "@ethersproject/rlp": "5.8.0", - "@ethersproject/sha2": "5.8.0", - "@ethersproject/signing-key": "5.8.0", - "@ethersproject/solidity": "5.8.0", - "@ethersproject/strings": "5.8.0", - "@ethersproject/transactions": "5.8.0", - "@ethersproject/units": "5.8.0", - "@ethersproject/wallet": "5.8.0", - "@ethersproject/web": "5.8.0", - "@ethersproject/wordlists": "5.8.0" - } - }, - "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", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=10" + "node": ">=8.10.0" } }, - "node_modules/@chainlink/contracts-1.4.0/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "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", - "peer": true, - "engines": { - "node": ">=10.0.0" + "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" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@chainlink/contracts-ccip": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@chainlink/contracts-ccip/-/contracts-ccip-1.6.1.tgz", - "integrity": "sha512-2ainz7DhzSPyUTD01e0roRHQ4V895peJ6rlu+GgxOYCZVFVtuwXEbT27ByyaJSFsB9ZubAtu1zhAijuL0OwPzw==", - "license": "BUSL-1.1", + "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==", "dependencies": { - "@chainlink/contracts": "1.4.0", - "@changesets/cli": "^2.29.5", + "@arbitrum/nitro-contracts": "3.0.0", + "@changesets/cli": "^2.29.6", "@changesets/get-github-info": "^0.6.0", + "@eslint/eslintrc": "^3.3.1", + "@eth-optimism/contracts": "0.6.0", + "@openzeppelin/contracts-4.7.3": "npm:@openzeppelin/contracts@4.7.3", + "@openzeppelin/contracts-4.8.3": "npm:@openzeppelin/contracts@4.8.3", + "@openzeppelin/contracts-4.9.6": "npm:@openzeppelin/contracts@4.9.6", + "@openzeppelin/contracts-5.0.2": "npm:@openzeppelin/contracts@5.0.2", + "@openzeppelin/contracts-5.1.0": "npm:@openzeppelin/contracts@5.1.0", + "@openzeppelin/contracts-upgradeable": "4.9.6", + "@scroll-tech/contracts": "2.0.0", + "@zksync/contracts": "github:matter-labs/era-contracts#446d391d34bdb48255d5f8fef8a8248925fc98b9", "semver": "^7.7.2" }, "engines": { - "node": ">=20", + "node": ">=22", "pnpm": ">=10" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@chainlink/contracts": { + "node_modules/@chainlink/contracts-1.4.0": { + "name": "@chainlink/contracts", "version": "1.4.0", "resolved": "https://registry.npmjs.org/@chainlink/contracts/-/contracts-1.4.0.tgz", "integrity": "sha512-SpNCJ0TPOI6pa2l702Wk4WIP8ccw5ARcRP1E/ZTqaFffXNoZeF03WhsVL8f3l3OTRFA9Z40O5KcZzmJmZQkoFA==", @@ -2374,7 +2166,7 @@ "pnpm": ">=10" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@chainlink/contracts/node_modules/@changesets/cli": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@changesets/cli": { "version": "2.28.1", "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.28.1.tgz", "integrity": "sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA==", @@ -2413,7 +2205,7 @@ "changeset": "bin.js" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@eth-optimism/contracts": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@eth-optimism/contracts": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.6.0.tgz", "integrity": "sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==", @@ -2427,7 +2219,7 @@ "ethers": "^5" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/abi": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/abi": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz", "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==", @@ -2455,7 +2247,7 @@ "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/abstract-provider": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/abstract-provider": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz", "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==", @@ -2480,7 +2272,7 @@ "@ethersproject/web": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/abstract-signer": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/abstract-signer": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz", "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==", @@ -2503,7 +2295,7 @@ "@ethersproject/properties": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/address": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/address": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz", "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==", @@ -2526,7 +2318,7 @@ "@ethersproject/rlp": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/base64": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/base64": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz", "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==", @@ -2545,7 +2337,7 @@ "@ethersproject/bytes": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/basex": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/basex": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz", "integrity": "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==", @@ -2566,7 +2358,7 @@ "@ethersproject/properties": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/bignumber": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/bignumber": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==", @@ -2587,7 +2379,7 @@ "bn.js": "^5.2.1" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/bytes": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/bytes": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", @@ -2606,7 +2398,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/constants": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/constants": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==", @@ -2625,7 +2417,7 @@ "@ethersproject/bignumber": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/contracts": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/contracts": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz", "integrity": "sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==", @@ -2654,7 +2446,7 @@ "@ethersproject/transactions": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/hash": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/hash": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz", "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==", @@ -2682,7 +2474,7 @@ "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/hdnode": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/hdnode": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz", "integrity": "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==", @@ -2713,7 +2505,7 @@ "@ethersproject/wordlists": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/json-wallets": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/json-wallets": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz", "integrity": "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==", @@ -2745,7 +2537,7 @@ "scrypt-js": "3.0.1" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/keccak256": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/keccak256": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==", @@ -2765,7 +2557,7 @@ "js-sha3": "0.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/logger": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/logger": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", @@ -2781,7 +2573,7 @@ ], "license": "MIT" }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/networks": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/networks": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==", @@ -2800,7 +2592,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/pbkdf2": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/pbkdf2": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz", "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==", @@ -2821,7 +2613,7 @@ "@ethersproject/sha2": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/properties": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/properties": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", @@ -2840,7 +2632,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/providers": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/providers": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz", "integrity": "sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==", @@ -2879,7 +2671,7 @@ "ws": "8.18.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/random": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/random": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz", "integrity": "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==", @@ -2900,7 +2692,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/rlp": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/rlp": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz", "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==", @@ -2920,7 +2712,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/sha2": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/sha2": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz", "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==", @@ -2942,7 +2734,7 @@ "hash.js": "1.1.7" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/signing-key": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/signing-key": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==", @@ -2966,7 +2758,7 @@ "hash.js": "1.1.7" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/solidity": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/solidity": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.8.0.tgz", "integrity": "sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==", @@ -2991,7 +2783,7 @@ "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/strings": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/strings": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==", @@ -3012,7 +2804,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/transactions": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/transactions": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz", "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==", @@ -3039,7 +2831,7 @@ "@ethersproject/signing-key": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/units": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/units": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz", "integrity": "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==", @@ -3061,7 +2853,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/wallet": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/wallet": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz", "integrity": "sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==", @@ -3095,7 +2887,7 @@ "@ethersproject/wordlists": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/web": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/web": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==", @@ -3118,7 +2910,7 @@ "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/wordlists": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@ethersproject/wordlists": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz", "integrity": "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==", @@ -3142,26 +2934,26 @@ "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/@openzeppelin/contracts": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@openzeppelin/contracts": { "version": "4.9.6", "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==", "license": "MIT" }, - "node_modules/@chainlink/contracts-ccip/node_modules/@scroll-tech/contracts": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/@scroll-tech/contracts": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@scroll-tech/contracts/-/contracts-0.1.0.tgz", "integrity": "sha512-aBbDOc3WB/WveZdpJYcrfvMYMz7ZTEiW8M9XMJLba8p9FAR5KGYB/cV+8+EUsq3MKt7C1BfR+WnXoTVdvwIY6w==", "license": "MIT" }, - "node_modules/@chainlink/contracts-ccip/node_modules/aes-js": { + "node_modules/@chainlink/contracts-1.4.0/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", "peer": true }, - "node_modules/@chainlink/contracts-ccip/node_modules/elliptic": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/elliptic": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", @@ -3176,13 +2968,13 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/elliptic/node_modules/bn.js": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/elliptic/node_modules/bn.js": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", "license": "MIT" }, - "node_modules/@chainlink/contracts-ccip/node_modules/ethers": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/ethers": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", @@ -3231,7 +3023,7 @@ "@ethersproject/wordlists": "5.8.0" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/semver": { + "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", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", @@ -3243,7 +3035,7 @@ "node": ">=10" } }, - "node_modules/@chainlink/contracts-ccip/node_modules/ws": { + "node_modules/@chainlink/contracts-1.4.0/node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", @@ -3265,7 +3057,83 @@ } } }, - "node_modules/@chainlink/contracts/node_modules/@eth-optimism/contracts": { + "node_modules/@chainlink/contracts-ccip": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@chainlink/contracts-ccip/-/contracts-ccip-1.6.1.tgz", + "integrity": "sha512-2ainz7DhzSPyUTD01e0roRHQ4V895peJ6rlu+GgxOYCZVFVtuwXEbT27ByyaJSFsB9ZubAtu1zhAijuL0OwPzw==", + "license": "BUSL-1.1", + "dependencies": { + "@chainlink/contracts": "1.4.0", + "@changesets/cli": "^2.29.5", + "@changesets/get-github-info": "^0.6.0", + "semver": "^7.7.2" + }, + "engines": { + "node": ">=20", + "pnpm": ">=10" + } + }, + "node_modules/@chainlink/contracts-ccip/node_modules/@chainlink/contracts": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@chainlink/contracts/-/contracts-1.4.0.tgz", + "integrity": "sha512-SpNCJ0TPOI6pa2l702Wk4WIP8ccw5ARcRP1E/ZTqaFffXNoZeF03WhsVL8f3l3OTRFA9Z40O5KcZzmJmZQkoFA==", + "license": "BUSL-1.1", + "dependencies": { + "@arbitrum/nitro-contracts": "3.0.0", + "@changesets/cli": "~2.28.1", + "@changesets/get-github-info": "^0.6.0", + "@eth-optimism/contracts": "0.6.0", + "@openzeppelin/contracts": "4.9.6", + "@openzeppelin/contracts-upgradeable": "4.9.6", + "@scroll-tech/contracts": "0.1.0", + "@zksync/contracts": "github:matter-labs/era-contracts#446d391d34bdb48255d5f8fef8a8248925fc98b9", + "semver": "^7.7.1" + }, + "engines": { + "node": ">=18", + "pnpm": ">=10" + } + }, + "node_modules/@chainlink/contracts-ccip/node_modules/@chainlink/contracts/node_modules/@changesets/cli": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.28.1.tgz", + "integrity": "sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA==", + "license": "MIT", + "dependencies": { + "@changesets/apply-release-plan": "^7.0.10", + "@changesets/assemble-release-plan": "^6.0.6", + "@changesets/changelog-git": "^0.2.1", + "@changesets/config": "^3.1.1", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.3", + "@changesets/get-release-plan": "^4.0.8", + "@changesets/git": "^3.0.2", + "@changesets/logger": "^0.1.1", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.3", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@changesets/write": "^0.4.0", + "@manypkg/get-packages": "^1.1.3", + "ansi-colors": "^4.1.3", + "ci-info": "^3.7.0", + "enquirer": "^2.4.1", + "external-editor": "^3.1.0", + "fs-extra": "^7.0.1", + "mri": "^1.2.0", + "p-limit": "^2.2.0", + "package-manager-detector": "^0.2.0", + "picocolors": "^1.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^3.0.1", + "term-size": "^2.1.0" + }, + "bin": { + "changeset": "bin.js" + } + }, + "node_modules/@chainlink/contracts-ccip/node_modules/@eth-optimism/contracts": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.6.0.tgz", "integrity": "sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==", @@ -3279,7 +3147,7 @@ "ethers": "^5" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/abi": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/abi": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz", "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==", @@ -3307,7 +3175,7 @@ "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/abstract-provider": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/abstract-provider": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz", "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==", @@ -3332,7 +3200,7 @@ "@ethersproject/web": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/abstract-signer": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/abstract-signer": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz", "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==", @@ -3355,7 +3223,7 @@ "@ethersproject/properties": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/address": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/address": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz", "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==", @@ -3378,7 +3246,7 @@ "@ethersproject/rlp": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/base64": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/base64": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz", "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==", @@ -3397,7 +3265,7 @@ "@ethersproject/bytes": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/basex": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/basex": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz", "integrity": "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==", @@ -3418,7 +3286,7 @@ "@ethersproject/properties": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/bignumber": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/bignumber": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==", @@ -3439,7 +3307,7 @@ "bn.js": "^5.2.1" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/bytes": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/bytes": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", @@ -3458,7 +3326,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/constants": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/constants": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==", @@ -3477,7 +3345,7 @@ "@ethersproject/bignumber": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/contracts": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/contracts": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz", "integrity": "sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==", @@ -3506,7 +3374,7 @@ "@ethersproject/transactions": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/hash": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/hash": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz", "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==", @@ -3534,7 +3402,7 @@ "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/hdnode": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/hdnode": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz", "integrity": "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==", @@ -3565,7 +3433,7 @@ "@ethersproject/wordlists": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/json-wallets": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/json-wallets": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz", "integrity": "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==", @@ -3597,7 +3465,7 @@ "scrypt-js": "3.0.1" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/keccak256": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/keccak256": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==", @@ -3617,7 +3485,7 @@ "js-sha3": "0.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/logger": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/logger": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", @@ -3633,7 +3501,7 @@ ], "license": "MIT" }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/networks": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/networks": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==", @@ -3652,7 +3520,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/pbkdf2": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/pbkdf2": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz", "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==", @@ -3673,7 +3541,7 @@ "@ethersproject/sha2": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/properties": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/properties": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", @@ -3692,7 +3560,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/providers": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/providers": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz", "integrity": "sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==", @@ -3731,7 +3599,7 @@ "ws": "8.18.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/random": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/random": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz", "integrity": "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==", @@ -3752,7 +3620,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/rlp": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/rlp": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz", "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==", @@ -3772,7 +3640,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/sha2": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/sha2": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz", "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==", @@ -3794,7 +3662,7 @@ "hash.js": "1.1.7" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/signing-key": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/signing-key": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==", @@ -3818,7 +3686,7 @@ "hash.js": "1.1.7" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/solidity": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/solidity": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.8.0.tgz", "integrity": "sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==", @@ -3843,7 +3711,7 @@ "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/strings": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/strings": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==", @@ -3864,7 +3732,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/transactions": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/transactions": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz", "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==", @@ -3891,7 +3759,7 @@ "@ethersproject/signing-key": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/units": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/units": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz", "integrity": "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==", @@ -3913,7 +3781,7 @@ "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/wallet": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/wallet": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz", "integrity": "sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==", @@ -3947,7 +3815,7 @@ "@ethersproject/wordlists": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/web": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/web": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==", @@ -3970,7 +3838,7 @@ "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/@ethersproject/wordlists": { + "node_modules/@chainlink/contracts-ccip/node_modules/@ethersproject/wordlists": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz", "integrity": "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==", @@ -3994,14 +3862,26 @@ "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/aes-js": { + "node_modules/@chainlink/contracts-ccip/node_modules/@openzeppelin/contracts": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", + "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==", + "license": "MIT" + }, + "node_modules/@chainlink/contracts-ccip/node_modules/@scroll-tech/contracts": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@scroll-tech/contracts/-/contracts-0.1.0.tgz", + "integrity": "sha512-aBbDOc3WB/WveZdpJYcrfvMYMz7ZTEiW8M9XMJLba8p9FAR5KGYB/cV+8+EUsq3MKt7C1BfR+WnXoTVdvwIY6w==", + "license": "MIT" + }, + "node_modules/@chainlink/contracts-ccip/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", "peer": true }, - "node_modules/@chainlink/contracts/node_modules/elliptic": { + "node_modules/@chainlink/contracts-ccip/node_modules/elliptic": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", @@ -4016,13 +3896,13 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/@chainlink/contracts/node_modules/elliptic/node_modules/bn.js": { + "node_modules/@chainlink/contracts-ccip/node_modules/elliptic/node_modules/bn.js": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", "license": "MIT" }, - "node_modules/@chainlink/contracts/node_modules/ethers": { + "node_modules/@chainlink/contracts-ccip/node_modules/ethers": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", @@ -4071,11 +3951,10 @@ "@ethersproject/wordlists": "5.8.0" } }, - "node_modules/@chainlink/contracts/node_modules/semver": { + "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" }, @@ -4083,7 +3962,7 @@ "node": ">=10" } }, - "node_modules/@chainlink/contracts/node_modules/ws": { + "node_modules/@chainlink/contracts-ccip/node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", @@ -4105,591 +3984,715 @@ } } }, - "node_modules/@chainlink/design-system": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@chainlink/design-system/-/design-system-0.2.8.tgz", - "integrity": "sha512-fi5t/EpwpLR3ZItYFynMW1PIuoW37+CUTa9FIr4n7XH+aa1A43m+uwTildZHrvkF0B45c7Lb065KyRRnFR1Q/Q==", - "dependencies": { - "@tailwindcss/container-queries": "0.1.1", - "postcss": "8.4.38", - "tailwindcss": "3.4.4", - "tailwindcss-animate": "1.0.7" - } - }, - "node_modules/@chainlink/local": { - "version": "0.2.7-beta", - "resolved": "https://registry.npmjs.org/@chainlink/local/-/local-0.2.7-beta.tgz", - "integrity": "sha512-rZXUer6bSaWRw9KZO1FNuZE/vLQRGDIwAiA5clkTkmtuiflHOW3ghj+Z0E5U7/23GKLNrkJItCkR6LNXyX+Byw==", + "node_modules/@chainlink/contracts/node_modules/@eth-optimism/contracts": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.6.0.tgz", + "integrity": "sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==", "license": "MIT", "dependencies": { - "@chainlink/contracts": "1.5.0", - "@chainlink/contracts-ccip": "1.6.2" + "@eth-optimism/core-utils": "0.12.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0" }, "peerDependencies": { - "@chainlink/contracts": ">=1.5.0 <2.0.0", - "@chainlink/contracts-ccip": ">=1.6.0 <2.0.0" - } - }, - "node_modules/@chainlink/local/node_modules/@chainlink/contracts-ccip": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@chainlink/contracts-ccip/-/contracts-ccip-1.6.2.tgz", - "integrity": "sha512-dHAOxhpTo9Dp1S5wFeSEN3hV9t2gy7iCXNdnZxmskD+gRVb7qGpTqoXPXXu8qEf2zVmRsrs/nSbrTU/UpqfHQg==", - "license": "BUSL-1.1", - "dependencies": { - "@chainlink/contracts": "1.5.0", - "@changesets/cli": "^2.29.5", - "@changesets/get-github-info": "^0.6.0", - "@openzeppelin/contracts-4.8.3": "npm:@openzeppelin/contracts@4.8.3", - "@openzeppelin/contracts-5.0.2": "npm:@openzeppelin/contracts@5.0.2", - "semver": "^7.7.2" - }, - "engines": { - "node": ">=20", - "pnpm": ">=10" - } - }, - "node_modules/@chainlink/local/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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@chainlink/solana-sdk": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@chainlink/solana-sdk/-/solana-sdk-0.2.2.tgz", - "integrity": "sha512-ILBRFnnE+mZOp3tQFRWwqyryq725VaDE6858vsnRv1sm/rc3yW+Jb9mgjKZCay9xWQY5hzNeV3wRXIXDbbmqfw==", - "license": "MIT", - "dependencies": { - "@project-serum/anchor": "^0.24.2", - "@solana/web3.js": "1.31.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@chainlink/solana-sdk/node_modules/@project-serum/anchor": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.24.2.tgz", - "integrity": "sha512-0/718g8/DnEuwAidUwh5wLYphUYXhUbiClkuRNhvNoa+1Y8a4g2tJyxoae+emV+PG/Gikd/QUBNMkIcimiIRTA==", - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "@project-serum/borsh": "^0.2.5", - "@solana/web3.js": "^1.36.0", - "base64-js": "^1.5.1", - "bn.js": "^5.1.2", - "bs58": "^4.0.1", - "buffer-layout": "^1.2.2", - "camelcase": "^5.3.1", - "cross-fetch": "^3.1.5", - "crypto-hash": "^1.3.0", - "eventemitter3": "^4.0.7", - "js-sha256": "^0.9.0", - "pako": "^2.0.3", - "snake-case": "^3.0.4", - "toml": "^3.0.0" - }, - "engines": { - "node": ">=11" - } - }, - "node_modules/@chainlink/solana-sdk/node_modules/@project-serum/anchor/node_modules/@solana/web3.js": { - "version": "1.98.4", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz", - "integrity": "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.0", - "@noble/curves": "^1.4.2", - "@noble/hashes": "^1.4.0", - "@solana/buffer-layout": "^4.0.1", - "@solana/codecs-numbers": "^2.1.0", - "agentkeepalive": "^4.5.0", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.1", - "node-fetch": "^2.7.0", - "rpc-websockets": "^9.0.2", - "superstruct": "^2.0.2" - } - }, - "node_modules/@chainlink/solana-sdk/node_modules/@project-serum/anchor/node_modules/superstruct": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", - "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" + "ethers": "^5" } }, - "node_modules/@chainlink/solana-sdk/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.3.0.tgz", - "integrity": "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/abi": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz", + "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==", + "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": { - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/solana-sdk/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz", - "integrity": "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/abstract-provider": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz", + "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==", + "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": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/networks": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/web": "^5.8.0" } }, - "node_modules/@chainlink/solana-sdk/node_modules/@solana/errors": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.3.0.tgz", - "integrity": "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/abstract-signer": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz", + "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==", + "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": { - "chalk": "^5.4.1", - "commander": "^14.0.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5.3.3" + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0" } }, - "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js": { - "version": "1.31.0", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.31.0.tgz", - "integrity": "sha512-7nHHx1JNFnrt15e9y8m38I/EJCbaB+bFC3KZVM1+QhybCikFxGMtGA5r7PDC3GEL1R2RZA8yKoLkDKo3vzzqnw==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/address": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz", + "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==", + "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": { - "@babel/runtime": "^7.12.5", - "@ethersproject/sha2": "^5.5.0", - "@solana/buffer-layout": "^3.0.0", - "bn.js": "^5.0.0", - "borsh": "^0.4.0", - "bs58": "^4.0.1", - "buffer": "6.0.1", - "cross-fetch": "^3.1.4", - "jayson": "^3.4.4", - "js-sha3": "^0.8.0", - "rpc-websockets": "^7.4.2", - "secp256k1": "^4.0.2", - "superstruct": "^0.14.2", - "tweetnacl": "^1.0.0" - }, - "engines": { - "node": ">=12.20.0" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/rlp": "^5.8.0" } }, - "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/@solana/buffer-layout": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz", - "integrity": "sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/base64": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz", + "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==", + "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": { - "buffer": "~6.0.3" - }, - "engines": { - "node": ">=5.10" + "@ethersproject/bytes": "^5.8.0" } }, - "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/@solana/buffer-layout/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], "license": "MIT", + "peer": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/borsh": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.4.0.tgz", - "integrity": "sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g==", - "license": "Apache-2.0", - "dependencies": { - "@types/bn.js": "^4.11.5", - "bn.js": "^5.0.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/buffer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", - "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/bignumber": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", + "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "bn.js": "^5.2.1" } }, - "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/jayson": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz", - "integrity": "sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/constants": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", + "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==", + "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": { - "@types/connect": "^3.4.33", - "@types/node": "^12.12.54", - "@types/ws": "^7.4.4", - "commander": "^2.20.3", - "delay": "^5.0.0", - "es6-promisify": "^5.0.0", - "eyes": "^0.1.8", - "isomorphic-ws": "^4.0.1", - "json-stringify-safe": "^5.0.1", - "JSONStream": "^1.3.5", - "lodash": "^4.17.20", - "uuid": "^8.3.2", - "ws": "^7.4.5" - }, - "bin": { - "jayson": "bin/jayson.js" - }, - "engines": { - "node": ">=8" + "@ethersproject/bignumber": "^5.8.0" } }, - "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/jayson/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true + "node_modules/@chainlink/contracts/node_modules/@ethersproject/contracts": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz", + "integrity": "sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, - "utf-8-validate": { - "optional": true + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } - } - }, - "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/rpc-websockets": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.11.2.tgz", - "integrity": "sha512-pL9r5N6AVHlMN/vT98+fcO+5+/UcPLf/4tq+WUaid/PPUGS/ttJ3y8e9IqmaWKtShNAysMSjkczuEA49NuV7UQ==", - "license": "LGPL-3.0-only", + ], + "license": "MIT", + "peer": true, "dependencies": { - "eventemitter3": "^4.0.7", - "uuid": "^8.3.2", - "ws": "^8.5.0" - }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/kozjak" - }, - "optionalDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "@ethersproject/abi": "^5.8.0", + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/transactions": "^5.8.0" } }, - "node_modules/@chainlink/solana-sdk/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "license": "MIT" - }, - "node_modules/@chainlink/solana-sdk/node_modules/@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/hash": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz", + "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==", + "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": { - "@types/node": "*" + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/base64": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@chainlink/solana-sdk/node_modules/base-x": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", - "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/hdnode": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz", + "integrity": "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==", + "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": { - "safe-buffer": "^5.0.1" + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/basex": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/pbkdf2": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/wordlists": "^5.8.0" } }, - "node_modules/@chainlink/solana-sdk/node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/json-wallets": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz", + "integrity": "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==", + "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": { - "base-x": "^3.0.2" + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hdnode": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/pbkdf2": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" } }, - "node_modules/@chainlink/solana-sdk/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/keccak256": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", + "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==", + "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", - "engines": { - "node": ">=6" + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "js-sha3": "0.8.0" } }, - "node_modules/@chainlink/solana-sdk/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/networks": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", + "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==", + "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", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "dependencies": { + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@chainlink/solana-sdk/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", - "license": "MIT" - }, - "node_modules/@chainlink/solana-sdk/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/providers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz", + "integrity": "sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==", + "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", - "bin": { - "uuid": "dist/bin/uuid" + "peer": true, + "dependencies": { + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/base64": "^5.8.0", + "@ethersproject/basex": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/networks": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/rlp": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/web": "^5.8.0", + "bech32": "1.1.4", + "ws": "8.18.0" } }, - "node_modules/@changesets/apply-release-plan": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.13.tgz", - "integrity": "sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/random": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz", + "integrity": "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==", + "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": { - "@changesets/config": "^3.1.1", - "@changesets/get-version-range-type": "^0.4.0", - "@changesets/git": "^3.0.4", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "detect-indent": "^6.0.0", - "fs-extra": "^7.0.1", - "lodash.startcase": "^4.4.0", - "outdent": "^0.5.0", - "prettier": "^2.7.1", - "resolve-from": "^5.0.0", - "semver": "^7.5.3" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@changesets/apply-release-plan/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/@chainlink/contracts/node_modules/@ethersproject/rlp": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz", + "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==", + "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", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@changesets/apply-release-plan/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" - }, - "engines": { - "node": ">=10" + "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", + "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==", + "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.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "bn.js": "^5.2.1", + "elliptic": "6.6.1", + "hash.js": "1.1.7" } }, - "node_modules/@changesets/assemble-release-plan": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.9.tgz", - "integrity": "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/solidity": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.8.0.tgz", + "integrity": "sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==", + "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": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "semver": "^7.5.3" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@changesets/assemble-release-plan/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" - }, - "engines": { - "node": ">=10" + "node_modules/@chainlink/contracts/node_modules/@ethersproject/strings": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", + "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==", + "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.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@changesets/changelog-git": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", - "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/transactions": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz", + "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==", + "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": { - "@changesets/types": "^6.1.0" + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/rlp": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0" } }, - "node_modules/@changesets/cli": { - "version": "2.29.7", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.29.7.tgz", - "integrity": "sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/units": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz", + "integrity": "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==", + "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": { - "@changesets/apply-release-plan": "^7.0.13", - "@changesets/assemble-release-plan": "^6.0.9", - "@changesets/changelog-git": "^0.2.1", - "@changesets/config": "^3.1.1", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", - "@changesets/get-release-plan": "^4.0.13", - "@changesets/git": "^3.0.4", - "@changesets/logger": "^0.1.1", - "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.5", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@changesets/write": "^0.4.0", - "@inquirer/external-editor": "^1.0.0", - "@manypkg/get-packages": "^1.1.3", - "ansi-colors": "^4.1.3", - "ci-info": "^3.7.0", - "enquirer": "^2.4.1", - "fs-extra": "^7.0.1", - "mri": "^1.2.0", - "p-limit": "^2.2.0", - "package-manager-detector": "^0.2.0", - "picocolors": "^1.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.3", - "spawndamnit": "^3.0.1", - "term-size": "^2.1.0" - }, - "bin": { - "changeset": "bin.js" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, - "node_modules/@changesets/cli/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" - }, - "engines": { - "node": ">=10" + "node_modules/@chainlink/contracts/node_modules/@ethersproject/wallet": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz", + "integrity": "sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==", + "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/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/hdnode": "^5.8.0", + "@ethersproject/json-wallets": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/wordlists": "^5.8.0" } }, - "node_modules/@changesets/config": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.1.tgz", - "integrity": "sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/web": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", + "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==", + "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": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", - "@changesets/logger": "^0.1.1", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1", - "micromatch": "^4.0.8" + "@ethersproject/base64": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@changesets/errors": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", - "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", + "node_modules/@chainlink/contracts/node_modules/@ethersproject/wordlists": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz", + "integrity": "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==", + "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": { - "extendable-error": "^0.1.5" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@changesets/get-dependents-graph": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.3.tgz", - "integrity": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==", + "node_modules/@chainlink/contracts/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", + "peer": true + }, + "node_modules/@chainlink/contracts/node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "license": "MIT", "dependencies": { - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "picocolors": "^1.1.0", - "semver": "^7.5.3" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/semver": { + "node_modules/@chainlink/contracts/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, + "node_modules/@chainlink/contracts/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "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/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" + } + }, + "node_modules/@chainlink/contracts/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", @@ -4701,666 +4704,1386 @@ "node": ">=10" } }, - "node_modules/@changesets/get-github-info": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.6.0.tgz", - "integrity": "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==", + "node_modules/@chainlink/contracts/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", - "dependencies": { - "dataloader": "^1.4.0", - "node-fetch": "^2.5.0" + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/@changesets/get-release-plan": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.13.tgz", - "integrity": "sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==", - "license": "MIT", + "node_modules/@chainlink/design-system": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@chainlink/design-system/-/design-system-0.2.8.tgz", + "integrity": "sha512-fi5t/EpwpLR3ZItYFynMW1PIuoW37+CUTa9FIr4n7XH+aa1A43m+uwTildZHrvkF0B45c7Lb065KyRRnFR1Q/Q==", "dependencies": { - "@changesets/assemble-release-plan": "^6.0.9", - "@changesets/config": "^3.1.1", - "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.5", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3" + "@tailwindcss/container-queries": "0.1.1", + "postcss": "8.4.38", + "tailwindcss": "3.4.4", + "tailwindcss-animate": "1.0.7" } }, - "node_modules/@changesets/get-version-range-type": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", - "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", - "license": "MIT" - }, - "node_modules/@changesets/git": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz", - "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==", + "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": { - "@changesets/errors": "^0.2.0", - "@manypkg/get-packages": "^1.1.3", - "is-subdir": "^1.1.1", - "micromatch": "^4.0.8", - "spawndamnit": "^3.0.1" + "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/@changesets/logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", - "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", - "license": "MIT", + "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": { - "picocolors": "^1.1.0" + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/@changesets/parse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.1.tgz", - "integrity": "sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==", - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "js-yaml": "^3.13.1" + "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/@changesets/parse/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "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", - "dependencies": { - "sprintf-js": "~1.0.2" + "engines": { + "node": ">=10" } }, - "node_modules/@changesets/parse/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "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": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "picomatch": "^2.2.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8.10.0" } }, - "node_modules/@changesets/pre": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", - "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", + "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": { - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1" + "@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/@changesets/read": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.5.tgz", - "integrity": "sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==", + "node_modules/@chainlink/local": { + "version": "0.2.7-beta", + "resolved": "https://registry.npmjs.org/@chainlink/local/-/local-0.2.7-beta.tgz", + "integrity": "sha512-rZXUer6bSaWRw9KZO1FNuZE/vLQRGDIwAiA5clkTkmtuiflHOW3ghj+Z0E5U7/23GKLNrkJItCkR6LNXyX+Byw==", "license": "MIT", "dependencies": { - "@changesets/git": "^3.0.4", - "@changesets/logger": "^0.1.1", - "@changesets/parse": "^0.4.1", - "@changesets/types": "^6.1.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0", - "picocolors": "^1.1.0" + "@chainlink/contracts": "1.5.0", + "@chainlink/contracts-ccip": "1.6.2" + }, + "peerDependencies": { + "@chainlink/contracts": ">=1.5.0 <2.0.0", + "@chainlink/contracts-ccip": ">=1.6.0 <2.0.0" } }, - "node_modules/@changesets/should-skip-package": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", - "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", - "license": "MIT", + "node_modules/@chainlink/local/node_modules/@chainlink/contracts-ccip": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@chainlink/contracts-ccip/-/contracts-ccip-1.6.2.tgz", + "integrity": "sha512-dHAOxhpTo9Dp1S5wFeSEN3hV9t2gy7iCXNdnZxmskD+gRVb7qGpTqoXPXXu8qEf2zVmRsrs/nSbrTU/UpqfHQg==", + "license": "BUSL-1.1", "dependencies": { - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3" + "@chainlink/contracts": "1.5.0", + "@changesets/cli": "^2.29.5", + "@changesets/get-github-info": "^0.6.0", + "@openzeppelin/contracts-4.8.3": "npm:@openzeppelin/contracts@4.8.3", + "@openzeppelin/contracts-5.0.2": "npm:@openzeppelin/contracts@5.0.2", + "semver": "^7.7.2" + }, + "engines": { + "node": ">=20", + "pnpm": ">=10" } }, - "node_modules/@changesets/types": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", - "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", - "license": "MIT" - }, - "node_modules/@changesets/write": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", - "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "fs-extra": "^7.0.1", - "human-id": "^4.1.1", - "prettier": "^2.7.1" + "node_modules/@chainlink/local/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" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@changesets/write/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/@chainlink/solana-sdk": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@chainlink/solana-sdk/-/solana-sdk-0.2.2.tgz", + "integrity": "sha512-ILBRFnnE+mZOp3tQFRWwqyryq725VaDE6858vsnRv1sm/rc3yW+Jb9mgjKZCay9xWQY5hzNeV3wRXIXDbbmqfw==", "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" + "dependencies": { + "@project-serum/anchor": "^0.24.2", + "@solana/web3.js": "1.31.0" }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">= 14" } }, - "node_modules/@coral-xyz/borsh": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.26.0.tgz", - "integrity": "sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@chainlink/solana-sdk/node_modules/@project-serum/anchor": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.24.2.tgz", + "integrity": "sha512-0/718g8/DnEuwAidUwh5wLYphUYXhUbiClkuRNhvNoa+1Y8a4g2tJyxoae+emV+PG/Gikd/QUBNMkIcimiIRTA==", + "license": "(MIT OR Apache-2.0)", "dependencies": { + "@project-serum/borsh": "^0.2.5", + "@solana/web3.js": "^1.36.0", + "base64-js": "^1.5.1", "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^5.3.1", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "js-sha256": "^0.9.0", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "toml": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@solana/web3.js": "^1.68.0" + "node": ">=11" } }, - "node_modules/@emnapi/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", - "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", - "dev": true, + "node_modules/@chainlink/solana-sdk/node_modules/@project-serum/anchor/node_modules/@solana/web3.js": { + "version": "1.98.4", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz", + "integrity": "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==", "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "@babel/runtime": "^7.25.0", + "@noble/curves": "^1.4.2", + "@noble/hashes": "^1.4.0", + "@solana/buffer-layout": "^4.0.1", + "@solana/codecs-numbers": "^2.1.0", + "agentkeepalive": "^4.5.0", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.1", + "node-fetch": "^2.7.0", + "rpc-websockets": "^9.0.2", + "superstruct": "^2.0.2" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "dev": true, + "node_modules/@chainlink/solana-sdk/node_modules/@project-serum/anchor/node_modules/superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "engines": { + "node": ">=14.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", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], + "node_modules/@chainlink/solana-sdk/node_modules/@solana/codecs-core": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.3.0.tgz", + "integrity": "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==", "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "dependencies": { + "@solana/errors": "2.3.0" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], + "node_modules/@chainlink/solana-sdk/node_modules/@solana/codecs-numbers": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz", + "integrity": "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], + "node_modules/@chainlink/solana-sdk/node_modules/@solana/errors": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.3.0.tgz", + "integrity": "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], + "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js": { + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.31.0.tgz", + "integrity": "sha512-7nHHx1JNFnrt15e9y8m38I/EJCbaB+bFC3KZVM1+QhybCikFxGMtGA5r7PDC3GEL1R2RZA8yKoLkDKo3vzzqnw==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/runtime": "^7.12.5", + "@ethersproject/sha2": "^5.5.0", + "@solana/buffer-layout": "^3.0.0", + "bn.js": "^5.0.0", + "borsh": "^0.4.0", + "bs58": "^4.0.1", + "buffer": "6.0.1", + "cross-fetch": "^3.1.4", + "jayson": "^3.4.4", + "js-sha3": "^0.8.0", + "rpc-websockets": "^7.4.2", + "secp256k1": "^4.0.2", + "superstruct": "^0.14.2", + "tweetnacl": "^1.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12.20.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], + "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/@solana/buffer-layout": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz", + "integrity": "sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "buffer": "~6.0.3" + }, "engines": { - "node": ">=18" + "node": ">=5.10" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" + "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/@solana/buffer-layout/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } ], "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" + "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/borsh": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.4.0.tgz", + "integrity": "sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g==", + "license": "Apache-2.0", + "dependencies": { + "@types/bn.js": "^4.11.5", + "bn.js": "^5.0.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" + "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/buffer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", + "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } ], "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], + "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/jayson": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz", + "integrity": "sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.5", + "lodash": "^4.17.20", + "uuid": "^8.3.2", + "ws": "^7.4.5" + }, + "bin": { + "jayson": "bin/jayson.js" + }, "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], + "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/jayson/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "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/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "node_modules/@chainlink/solana-sdk/node_modules/@solana/web3.js/node_modules/rpc-websockets": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.11.2.tgz", + "integrity": "sha512-pL9r5N6AVHlMN/vT98+fcO+5+/UcPLf/4tq+WUaid/PPUGS/ttJ3y8e9IqmaWKtShNAysMSjkczuEA49NuV7UQ==", + "license": "LGPL-3.0-only", + "dependencies": { + "eventemitter3": "^4.0.7", + "uuid": "^8.3.2", + "ws": "^8.5.0" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], + "node_modules/@chainlink/solana-sdk/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "license": "MIT" + }, + "node_modules/@chainlink/solana-sdk/node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@types/node": "*" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], + "node_modules/@chainlink/solana-sdk/node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "safe-buffer": "^5.0.1" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], + "node_modules/@chainlink/solana-sdk/node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "base-x": "^3.0.2" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], + "node_modules/@chainlink/solana-sdk/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], + "node_modules/@chainlink/solana-sdk/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], + "node_modules/@chainlink/solana-sdk/node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", + "license": "MIT" + }, + "node_modules/@chainlink/solana-sdk/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], + "node_modules/@changesets/apply-release-plan": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.13.tgz", + "integrity": "sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@changesets/config": "^3.1.1", + "@changesets/get-version-range-type": "^0.4.0", + "@changesets/git": "^3.0.4", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^7.5.3" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], + "node_modules/@changesets/apply-release-plan/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@changesets/apply-release-plan/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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@changesets/assemble-release-plan": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.9.tgz", + "integrity": "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==", + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.3", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/assemble-release-plan/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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@changesets/changelog-git": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", + "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0" + } + }, + "node_modules/@changesets/cli": { + "version": "2.29.7", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.29.7.tgz", + "integrity": "sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==", + "license": "MIT", + "dependencies": { + "@changesets/apply-release-plan": "^7.0.13", + "@changesets/assemble-release-plan": "^6.0.9", + "@changesets/changelog-git": "^0.2.1", + "@changesets/config": "^3.1.1", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.3", + "@changesets/get-release-plan": "^4.0.13", + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.5", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@changesets/write": "^0.4.0", + "@inquirer/external-editor": "^1.0.0", + "@manypkg/get-packages": "^1.1.3", + "ansi-colors": "^4.1.3", + "ci-info": "^3.7.0", + "enquirer": "^2.4.1", + "fs-extra": "^7.0.1", + "mri": "^1.2.0", + "p-limit": "^2.2.0", + "package-manager-detector": "^0.2.0", + "picocolors": "^1.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^3.0.1", + "term-size": "^2.1.0" + }, + "bin": { + "changeset": "bin.js" + } + }, + "node_modules/@changesets/cli/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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@changesets/config": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.1.tgz", + "integrity": "sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==", + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.3", + "@changesets/logger": "^0.1.1", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.8" + } + }, + "node_modules/@changesets/errors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", + "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", + "license": "MIT", + "dependencies": { + "extendable-error": "^0.1.5" + } + }, + "node_modules/@changesets/get-dependents-graph": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.3.tgz", + "integrity": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==", + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "picocolors": "^1.1.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/get-dependents-graph/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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@changesets/get-github-info": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.6.0.tgz", + "integrity": "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==", + "license": "MIT", + "dependencies": { + "dataloader": "^1.4.0", + "node-fetch": "^2.5.0" + } + }, + "node_modules/@changesets/get-release-plan": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.13.tgz", + "integrity": "sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==", + "license": "MIT", + "dependencies": { + "@changesets/assemble-release-plan": "^6.0.9", + "@changesets/config": "^3.1.1", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.5", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/get-version-range-type": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", + "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", + "license": "MIT" + }, + "node_modules/@changesets/git": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz", + "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==", + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.8", + "spawndamnit": "^3.0.1" + } + }, + "node_modules/@changesets/logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", + "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/parse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.1.tgz", + "integrity": "sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==", + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "js-yaml": "^3.13.1" + } + }, + "node_modules/@changesets/parse/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@changesets/parse/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@changesets/pre": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", + "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" + } + }, + "node_modules/@changesets/read": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.5.tgz", + "integrity": "sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==", + "license": "MIT", + "dependencies": { + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/parse": "^0.4.1", + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0", + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/should-skip-package": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", + "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "license": "MIT" + }, + "node_modules/@changesets/write": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", + "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "human-id": "^4.1.1", + "prettier": "^2.7.1" + } + }, + "node_modules/@changesets/write/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@coral-xyz/borsh": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.26.0.tgz", + "integrity": "sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", + "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], "license": "MIT", "optional": true, "os": [ - "netbsd" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/openbsd-arm64": { + "node_modules/@esbuild/android-arm": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "openbsd" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/openbsd-x64": { + "node_modules/@esbuild/android-x64": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "openbsd" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/openharmony-arm64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "openharmony" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/sunos-x64": { + "node_modules/@esbuild/darwin-x64": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "sunos" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-arm64": { + "node_modules/@esbuild/freebsd-arm64": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "freebsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-ia32": { + "node_modules/@esbuild/freebsd-x64": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ - "ia32" + "x64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "freebsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-x64": { + "node_modules/@esbuild/linux-arm": { "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ - "x64" + "arm" ], "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=18" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", @@ -5639,9 +6362,9 @@ } }, "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "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", @@ -5652,9 +6375,8 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/constants": { @@ -5731,73 +6453,6 @@ "@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", @@ -5819,9 +6474,9 @@ } }, "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "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", @@ -5831,8 +6486,7 @@ "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } - ], - "license": "MIT" + ] }, "node_modules/@ethersproject/networks": { "version": "5.7.1", @@ -5854,9 +6508,9 @@ } }, "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz", + "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==", "funding": [ { "type": "individual", @@ -5867,16 +6521,16 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", + "peer": true, "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/sha2": "^5.8.0" } }, "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "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", @@ -5887,9 +6541,8 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/providers": { @@ -5992,9 +6645,9 @@ } }, "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz", + "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==", "funding": [ { "type": "individual", @@ -6005,10 +6658,9 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, @@ -6036,30 +6688,6 @@ "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", @@ -6108,60 +6736,6 @@ "@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", @@ -6185,29 +6759,6 @@ "@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/@floating-ui/core": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", @@ -6261,6 +6812,24 @@ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "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==", + "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", @@ -8997,377 +9566,2863 @@ ], "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "optional": true, + "os": [ + "linux" + ] + }, + "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==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.0.7" + }, + "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==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@preact/preset-vite": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.10.2.tgz", + "integrity": "sha512-K9wHlJOtkE+cGqlyQ5v9kL3Ge0Ql4LlIZjkUTL+1zf3nNdF88F9UZN6VTV8jdzBX9Fl7WSzeNMSDG7qECPmSmg==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@prefresh/vite": "^2.4.1", + "@rollup/pluginutils": "^4.1.1", + "babel-plugin-transform-hook-names": "^1.0.2", + "debug": "^4.3.4", + "picocolors": "^1.1.1", + "vite-prerender-plugin": "^0.5.3" + }, + "peerDependencies": { + "@babel/core": "7.x", + "vite": "2.x || 3.x || 4.x || 5.x || 6.x || 7.x" + } + }, + "node_modules/@preact/signals": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@preact/signals/-/signals-2.5.1.tgz", + "integrity": "sha512-VPjk5YFt7i11Fi4UK0tzaEe5xLwfhUxXL3l89ocxQ5aPz7bRo8M5+N73LjBMPklyXKYKz6YsNo4Smp8n6nplng==", + "license": "MIT", + "dependencies": { + "@preact/signals-core": "^1.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + }, + "peerDependencies": { + "preact": ">= 10.25.0 || >=11.0.0-0" + } + }, + "node_modules/@preact/signals-core": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.12.1.tgz", + "integrity": "sha512-BwbTXpj+9QutoZLQvbttRg5x3l5468qaV2kufh+51yha1c53ep5dY4kTuZR35+3pAZxpfQerGJiQqg34ZNZ6uA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/@prefresh/babel-plugin": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.2.tgz", + "integrity": "sha512-AOl4HG6dAxWkJ5ndPHBgBa49oo/9bOiJuRDKHLSTyH+Fd9x00shTXpdiTj1W41l6oQIwUOAgJeHMn4QwIDpHkA==", + "license": "MIT" + }, + "node_modules/@prefresh/core": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.9.tgz", + "integrity": "sha512-IKBKCPaz34OFVC+adiQ2qaTF5qdztO2/4ZPf4KsRTgjKosWqxVXmEbxCiUydYZRY8GVie+DQlKzQr9gt6HQ+EQ==", + "license": "MIT", + "peerDependencies": { + "preact": "^10.0.0 || ^11.0.0-0" + } + }, + "node_modules/@prefresh/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==", + "license": "MIT" + }, + "node_modules/@prefresh/vite": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.11.tgz", + "integrity": "sha512-/XjURQqdRiCG3NpMmWqE9kJwrg9IchIOWHzulCfqg2sRe/8oQ1g5De7xrk9lbqPIQLn7ntBkKdqWXIj4E9YXyg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.22.1", + "@prefresh/babel-plugin": "0.5.2", + "@prefresh/core": "^1.5.0", + "@prefresh/utils": "^1.2.0", + "@rollup/pluginutils": "^4.2.1" + }, + "peerDependencies": { + "preact": "^10.4.0 || ^11.0.0-0", + "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", + "integrity": "sha512-Nq+COIjE1135T7qfnOHEn7E0q39bQTgXLFk837/rgFe6Hkew9WML7eHsS+lSYD2p3OJaTiUOHTAq1lHy36oIqQ==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@coral-xyz/borsh": "^0.26.0", + "@solana/web3.js": "^1.68.0", + "base64-js": "^1.5.1", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "js-sha256": "^0.9.0", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@project-serum/anchor/node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@project-serum/anchor/node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/@project-serum/borsh": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz", + "integrity": "sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.2.0" + } + }, + "node_modules/@qwik.dev/partytown": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@qwik.dev/partytown/-/partytown-0.11.2.tgz", + "integrity": "sha512-795y49CqBiKiwKAD+QBZlzlqEK275hVcazZ7wBPSfgC23L+vWuA7PJmMpgxojOucZHzYi5rAAQ+IP1I3BKVZxw==", + "license": "MIT", + "dependencies": { + "dotenv": "^16.4.7" + }, + "bin": { + "partytown": "bin/partytown.cjs" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.1.tgz", + "integrity": "sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collapsible": "1.1.1", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", + "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.2.tgz", + "integrity": "sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-presence": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz", + "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz", + "integrity": "sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-presence": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz", + "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", + "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", + "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", + "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz", + "integrity": "sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-menu": "2.0.6", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", + "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz", + "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.6.tgz", + "integrity": "sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-callback-ref": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.1.3.tgz", + "integrity": "sha512-x4Uv0N47ABx3/frJazYXxvMpZeKJe0qmRIgQ2o3lhTqnTVg+CaZfVVO4nQLn3QJcDkTz8icElKffhFng47XIBA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", + "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.1.tgz", + "integrity": "sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/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==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-popover/node_modules/react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", + "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-rect": "1.0.1", + "@radix-ui/react-use-size": "1.0.1", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper/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==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", + "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.2.1.tgz", + "integrity": "sha512-kdbv54g4vfRjja9DNWPMxKvXblzqbpEC8kspEkZ6dVP7kQksGCn+iZHkcCz2nb00+lPdRvxrqy4WrvvV1cNqrQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-presence": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz", + "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "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==", - "cpu": [ - "wasm32" - ], - "dev": true, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "license": "MIT", - "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.7" + "@radix-ui/react-compose-refs": "1.1.0" }, - "engines": { - "node": ">=14.0.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "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==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "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==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "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==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "node_modules/@pinojs/redact": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", - "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", - "license": "MIT" + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@radix-ui/react-radio-group/node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", - "dev": true, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", + "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1" }, - "funding": { - "url": "https://opencollective.com/pkgr" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, + "node_modules/@radix-ui/react-select": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.2.tgz", + "integrity": "sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==", "license": "MIT", - "engines": { - "node": ">=12.22.0" + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "graceful-fs": "4.2.10" + "@floating-ui/dom": "^1.7.4" }, - "engines": { - "node": ">=12.22.0" + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true, - "license": "ISC" + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "dev": true, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", "license": "MIT", "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "@radix-ui/react-primitive": "2.0.0" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@preact/preset-vite": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.10.2.tgz", - "integrity": "sha512-K9wHlJOtkE+cGqlyQ5v9kL3Ge0Ql4LlIZjkUTL+1zf3nNdF88F9UZN6VTV8jdzBX9Fl7WSzeNMSDG7qECPmSmg==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@prefresh/vite": "^2.4.1", - "@rollup/pluginutils": "^4.1.1", - "babel-plugin-transform-hook-names": "^1.0.2", - "debug": "^4.3.4", - "picocolors": "^1.1.1", - "vite-prerender-plugin": "^0.5.3" + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" }, "peerDependencies": { - "@babel/core": "7.x", - "vite": "2.x || 3.x || 4.x || 5.x || 6.x || 7.x" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@preact/signals": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@preact/signals/-/signals-2.5.1.tgz", - "integrity": "sha512-VPjk5YFt7i11Fi4UK0tzaEe5xLwfhUxXL3l89ocxQ5aPz7bRo8M5+N73LjBMPklyXKYKz6YsNo4Smp8n6nplng==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", "license": "MIT", - "dependencies": { - "@preact/signals-core": "^1.12.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", "peerDependencies": { - "preact": ">= 10.25.0 || >=11.0.0-0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@preact/signals-core": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.12.1.tgz", - "integrity": "sha512-BwbTXpj+9QutoZLQvbttRg5x3l5468qaV2kufh+51yha1c53ep5dY4kTuZR35+3pAZxpfQerGJiQqg34ZNZ6uA==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@prefresh/babel-plugin": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.2.tgz", - "integrity": "sha512-AOl4HG6dAxWkJ5ndPHBgBa49oo/9bOiJuRDKHLSTyH+Fd9x00shTXpdiTj1W41l6oQIwUOAgJeHMn4QwIDpHkA==", - "license": "MIT" + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz", + "integrity": "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } }, - "node_modules/@prefresh/core": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.9.tgz", - "integrity": "sha512-IKBKCPaz34OFVC+adiQ2qaTF5qdztO2/4ZPf4KsRTgjKosWqxVXmEbxCiUydYZRY8GVie+DQlKzQr9gt6HQ+EQ==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", "license": "MIT", "peerDependencies": { - "preact": "^10.0.0 || ^11.0.0-0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@prefresh/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==", - "license": "MIT" + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } }, - "node_modules/@prefresh/vite": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.11.tgz", - "integrity": "sha512-/XjURQqdRiCG3NpMmWqE9kJwrg9IchIOWHzulCfqg2sRe/8oQ1g5De7xrk9lbqPIQLn7ntBkKdqWXIj4E9YXyg==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", "license": "MIT", "dependencies": { - "@babel/core": "^7.22.1", - "@prefresh/babel-plugin": "0.5.2", - "@prefresh/core": "^1.5.0", - "@prefresh/utils": "^1.2.0", - "@rollup/pluginutils": "^4.2.1" + "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { - "preact": "^10.4.0 || ^11.0.0-0", - "vite": ">=2.0.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@project-serum/anchor": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.26.0.tgz", - "integrity": "sha512-Nq+COIjE1135T7qfnOHEn7E0q39bQTgXLFk837/rgFe6Hkew9WML7eHsS+lSYD2p3OJaTiUOHTAq1lHy36oIqQ==", - "dev": true, - "license": "(MIT OR Apache-2.0)", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "license": "MIT", "dependencies": { - "@coral-xyz/borsh": "^0.26.0", - "@solana/web3.js": "^1.68.0", - "base64-js": "^1.5.1", - "bn.js": "^5.1.2", - "bs58": "^4.0.1", - "buffer-layout": "^1.2.2", - "camelcase": "^6.3.0", - "cross-fetch": "^3.1.5", - "crypto-hash": "^1.3.0", - "eventemitter3": "^4.0.7", - "js-sha256": "^0.9.0", - "pako": "^2.0.3", - "snake-case": "^3.0.4", - "superstruct": "^0.15.4", - "toml": "^3.0.0" + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" }, - "engines": { - "node": ">=11" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@project-serum/anchor/node_modules/base-x": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", - "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", - "dev": true, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", "license": "MIT", - "dependencies": { - "safe-buffer": "^5.0.1" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@project-serum/anchor/node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dev": true, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz", + "integrity": "sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==", "license": "MIT", "dependencies": { - "base-x": "^3.0.2" + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@project-serum/borsh": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz", - "integrity": "sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==", - "license": "Apache-2.0", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - }, - "engines": { - "node": ">=10" + "@radix-ui/react-slot": "1.1.0" }, "peerDependencies": { - "@solana/web3.js": "^1.2.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@qwik.dev/partytown": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@qwik.dev/partytown/-/partytown-0.11.2.tgz", - "integrity": "sha512-795y49CqBiKiwKAD+QBZlzlqEK275hVcazZ7wBPSfgC23L+vWuA7PJmMpgxojOucZHzYi5rAAQ+IP1I3BKVZxw==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "license": "MIT", "dependencies": { - "dotenv": "^16.4.7" + "@radix-ui/react-compose-refs": "1.1.0" }, - "bin": { - "partytown": "bin/partytown.cjs" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=18.0.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@radix-ui/primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", - "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", - "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" + "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-collection": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", - "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2" + "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { "optional": true } } }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", - "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10" + "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -9375,17 +12430,17 @@ } } }, - "node_modules/@radix-ui/react-context": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", - "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10" + "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -9393,33 +12448,19 @@ } } }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", - "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-controllable-state": "1.0.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" + "@radix-ui/react-primitive": "2.0.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -9430,13 +12471,19 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/react-remove-scroll": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-select/node_modules/react-remove-scroll": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz", + "integrity": "sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==", "license": "MIT", "dependencies": { - "react-remove-scroll-bar": "^2.3.3", + "react-remove-scroll-bar": "^2.3.6", "react-style-singleton": "^2.2.1", "tslib": "^2.1.0", "use-callback-ref": "^1.3.0", @@ -9455,13 +12502,14 @@ } } }, - "node_modules/@radix-ui/react-direction": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", - "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", + "node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" }, "peerDependencies": { "@types/react": "*", @@ -9473,24 +12521,25 @@ } } }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", - "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", + "node_modules/@radix-ui/react-switch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.1.tgz", + "integrity": "sha512-diPqDDoBcZPSicYoMWdWx+bCPuTRH4QSp9J+65IvtdS0Kuzt67bI6n32vCj8q6NZmYW/ah+2orOtMwcX5eQwIg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-escape-keydown": "1.0.3" + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -9501,26 +12550,55 @@ } } }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz", - "integrity": "sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==", + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-menu": "2.0.6", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" + "@radix-ui/react-slot": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -9531,17 +12609,17 @@ } } }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", - "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10" + "@radix-ui/react-compose-refs": "1.1.0" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -9549,44 +12627,80 @@ } } }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", - "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1" + "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { "optional": true } } }, - "node_modules/@radix-ui/react-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", - "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" + "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -9594,37 +12708,26 @@ } } }, - "node_modules/@radix-ui/react-menu": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.6.tgz", - "integrity": "sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==", + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.3.tgz", + "integrity": "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.3", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-callback-ref": "1.0.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-roving-focus": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -9635,24 +12738,46 @@ } } }, - "node_modules/@radix-ui/react-menu/node_modules/react-remove-scroll": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-collection": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.2.tgz", + "integrity": "sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==", "license": "MIT", "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -9660,61 +12785,68 @@ } } }, - "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.1.3.tgz", - "integrity": "sha512-x4Uv0N47ABx3/frJazYXxvMpZeKJe0qmRIgQ2o3lhTqnTVg+CaZfVVO4nQLn3QJcDkTz8icElKffhFng47XIBA==", + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-visually-hidden": "1.0.3" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "license": "MIT", "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { + } + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { "optional": true } } }, - "node_modules/@radix-ui/react-navigation-menu/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", - "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==", + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-escape-keydown": "1.0.3" + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -9725,27 +12857,13 @@ } } }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.1.tgz", - "integrity": "sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==", + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-primitive": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz", + "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" + "@radix-ui/react-slot": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -9762,32 +12880,21 @@ } } }, - "node_modules/@radix-ui/react-popover/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==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.4" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", - "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-arrow": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", - "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.2.tgz", + "integrity": "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.0.0" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", @@ -9804,11 +12911,14 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", - "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", + "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -9819,10 +12929,10 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-context": { + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", - "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -9834,37 +12944,28 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-dismissable-layer": { + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-use-controllable-state": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", - "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" + "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-guards": { + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-use-layout-effect": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", - "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -9876,15 +12977,56 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", - "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "node_modules/@radix-ui/react-toast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.4.tgz", + "integrity": "sha512-Sch9idFJHJTMH9YNpxxESqABcAFweJG4tKv+0zo0m5XBvUSL8FM5xKcJLFLXononpePs8IclyX1KieL5SDUNgA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.3", + "@radix-ui/react-portal": "1.1.3", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-collection": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.1.tgz", + "integrity": "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0" + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -9901,14 +13043,26 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-id": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", - "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -9919,22 +13073,17 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", - "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.3.tgz", + "integrity": "sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==", "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" + "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { "@types/react": "*", @@ -9951,13 +13100,13 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-portal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", - "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-portal": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.3.tgz", + "integrity": "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { @@ -9975,13 +13124,13 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-presence": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", - "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { @@ -9999,13 +13148,13 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", - "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.1.0" + "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -10022,13 +13171,13 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", - "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0" + "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -10040,7 +13189,7 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-callback-ref": { + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", @@ -10055,7 +13204,7 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-controllable-state": { + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-controllable-state": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", @@ -10073,7 +13222,7 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-escape-keydown": { + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-escape-keydown": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", @@ -10091,7 +13240,7 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-layout-effect": { + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-layout-effect": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", @@ -10106,96 +13255,105 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", - "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz", + "integrity": "sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==", "license": "MIT", "dependencies": { - "@radix-ui/rect": "1.1.0" + "@radix-ui/react-primitive": "2.0.1" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-size": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", - "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.9.tgz", + "integrity": "sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", - "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-popover/node_modules/react-remove-scroll": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", - "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.9.tgz", + "integrity": "sha512-HJ6gXdYVN38q/5KDdCcd+JTuXUyFZBMJbwXaU/82/Gi+V2ps6KpiZ2sQecAeZCV80POGRfkUBdUIj6hIdF6/MQ==", "license": "MIT", "dependencies": { - "react-remove-scroll-bar": "^2.3.4", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-roving-focus": "1.1.9", + "@radix-ui/react-toggle": "1.1.8", + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-popper": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", - "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==", + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", + "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-collection": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.6.tgz", + "integrity": "sha512-PbhRFK4lIEw9ADonj48tiYWzkllz81TM7KVYyyMMw2cwHO7D5h4XKEblL8NlaRisTK3QTe6tBEhDccFUryxHBQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-rect": "1.0.1", - "@radix-ui/react-use-size": "1.0.1", - "@radix-ui/rect": "1.0.1" + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -10206,33 +13364,82 @@ } } }, - "node_modules/@radix-ui/react-popper/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==", + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.4" + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@radix-ui/react-portal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", - "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-primitive": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz", + "integrity": "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" + "@radix-ui/react-slot": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -10243,21 +13450,27 @@ } } }, - "node_modules/@radix-ui/react-presence": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", - "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.9.tgz", + "integrity": "sha512-ZzrIFnMYHHCNqSNCsuN6l7wlewBEq0O0BCSBkabJMFXVO51LRUTq71gLP1UxFvmrXElqmPjA5VX7IqC9VpazAQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -10268,20 +13481,39 @@ } } }, - "node_modules/@radix-ui/react-primitive": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", - "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-slot": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", + "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.2" + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-toggle": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.8.tgz", + "integrity": "sha512-hrpa59m3zDnsa35LrTOH5s/a3iGv/VD+KKQjjiCTo/W4r0XwPpiWQvAv6Xl1nupSoaZeNNxW6sJH9ZydsjKdYQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -10292,28 +13524,89 @@ } } }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", - "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1" + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", + "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -10324,18 +13617,51 @@ } } }, - "node_modules/@radix-ui/react-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", - "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1" + "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -10415,6 +13741,39 @@ } } }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-escape-keydown": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", @@ -14203,6 +17562,62 @@ "node": ">=20.0.0" } }, + "node_modules/@svgdotjs/svg.draggable.js": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.6.tgz", + "integrity": "sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==", + "license": "MIT", + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4" + } + }, + "node_modules/@svgdotjs/svg.filter.js": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.9.tgz", + "integrity": "sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==", + "license": "MIT", + "dependencies": { + "@svgdotjs/svg.js": "^3.2.4" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@svgdotjs/svg.js": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.5.tgz", + "integrity": "sha512-/VNHWYhNu+BS7ktbYoVGrCmsXDh+chFMaONMwGNdIBcFHrWqk2jY8fNyr3DLdtQUIalvkPfM554ZSFa3dm3nxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Fuzzyma" + } + }, + "node_modules/@svgdotjs/svg.resize.js": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz", + "integrity": "sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==", + "license": "MIT", + "engines": { + "node": ">= 14.18" + }, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.select.js": "^4.0.1" + } + }, + "node_modules/@svgdotjs/svg.select.js": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.select.js/-/svg.select.js-4.0.3.tgz", + "integrity": "sha512-qkMgso1sd2hXKd1FZ1weO7ANq12sNmQJeGDjs46QwDVsxSRcHmvWKL2NDF7Yimpwf3sl5esOLkPqtV2bQ3v/Jg==", + "license": "MIT", + "engines": { + "node": ">= 14.18" + }, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4" + } + }, "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", @@ -14821,6 +18236,65 @@ "tailwindcss": ">=3.2.0" } }, + "node_modules/@tanstack/query-core": { + "version": "5.69.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.69.0.tgz", + "integrity": "sha512-Kn410jq6vs1P8Nm+ZsRj9H+U3C0kjuEkYLxbiCyn3MDEiYor1j2DGVULqAz62SLZtUZ/e9Xt6xMXiJ3NJ65WyQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.69.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.69.0.tgz", + "integrity": "sha512-Ift3IUNQqTcaFa1AiIQ7WCb/PPy8aexZdq9pZWLXhfLcLxH0+PZqJ2xFImxCpdDZrFRZhLJrh76geevS5xjRhA==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.69.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz", + "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.20.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", + "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -16121,12 +19595,62 @@ "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==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "license": "BSD-2-Clause" }, + "node_modules/@yr/monotone-cubic-spline": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", + "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", + "license": "MIT" + }, "node_modules/@zksync/contracts": { "name": "era-contracts", "version": "0.1.0", @@ -16473,6 +19997,20 @@ "node": ">= 8" } }, + "node_modules/apexcharts": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-4.5.0.tgz", + "integrity": "sha512-E7ZkrVqPNBUWy/Rmg8DEIqHNBmElzICE/oxOX5Ekvs2ICQUOK/VkEkMH09JGJu+O/EA0NL31hxlmF+wrwrSLaQ==", + "license": "MIT", + "dependencies": { + "@svgdotjs/svg.draggable.js": "^3.0.4", + "@svgdotjs/svg.filter.js": "^3.0.8", + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.resize.js": "^2.0.2", + "@svgdotjs/svg.select.js": "^4.0.1", + "@yr/monotone-cubic-spline": "^1.0.3" + } + }, "node_modules/apg-lite": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/apg-lite/-/apg-lite-1.0.5.tgz", @@ -17089,6 +20627,43 @@ "tslib": "^2.3.0" } }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "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", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -21239,6 +24814,19 @@ "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==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -21642,6 +25230,29 @@ "dev": true, "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, + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "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==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "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/h3": { "version": "1.15.4", "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", @@ -22326,6 +25937,19 @@ "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", @@ -29875,6 +33499,15 @@ "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", @@ -30210,6 +33843,17 @@ "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", @@ -31224,6 +34868,34 @@ "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", @@ -31691,6 +35363,19 @@ "node": ">=0.10.0" } }, + "node_modules/react-apexcharts": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.7.0.tgz", + "integrity": "sha512-03oScKJyNLRf0Oe+ihJxFZliBQM9vW3UWwomVn4YVRTN1jsIR58dLWt0v1sb8RwJVHDMbeHiKQueM0KGpn7nOA==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "apexcharts": ">=4.0.0", + "react": ">=0.13" + } + }, "node_modules/react-copy-to-clipboard": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", @@ -31763,6 +35448,22 @@ "react": "^18.3.1" } }, + "node_modules/react-hook-form": { + "version": "7.53.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.1.tgz", + "integrity": "sha512-6aiQeBda4zjcuaugWvim9WsGqisoUk+etmFEsSUMm451/Ic8L/UAb7sRtMj3V+Hdzm6mMjU1VhiSzYUZeBm0Vg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, "node_modules/react-immutable-proptypes": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.2.0.tgz", @@ -32395,6 +36096,23 @@ "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", @@ -33252,7 +36970,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/search-insights": { "version": "2.17.3", @@ -33886,6 +37605,20 @@ "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", @@ -34003,6 +37736,16 @@ "atomic-sleep": "^1.0.0" } }, + "node_modules/sonner": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.7.3.tgz", + "integrity": "sha512-KXLWQfyR6AHpYZuQk8eO8fCbZSJY3JOpgsu/tbGc++jgPjj8JsR1ZpO8vFhqR/OxvWMQCSAmnSShY0gr4FPqHg==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, "node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -34683,6 +38426,14 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/synckit": { "version": "0.11.11", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", @@ -34786,33 +38537,33 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", - "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", + "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", - "chokidar": "^3.5.3", + "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.3.0", + "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", "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" + "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" }, "bin": { "tailwind": "lib/cli.js", @@ -34831,6 +38582,19 @@ "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", @@ -34840,13 +38604,32 @@ "jiti": "bin/jiti.js" } }, - "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==", + "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" + } + ], "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, "engines": { - "node": ">=10" + "node": "^10 || ^12 || >=14" } }, "node_modules/tar": { @@ -35228,6 +39011,17 @@ "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", @@ -36772,6 +40566,19 @@ "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/zenscroll": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/zenscroll/-/zenscroll-4.0.2.tgz", diff --git a/package.json b/package.json index 0bf30cc7c44..9da1a0bf9eb 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,8 @@ }, "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", @@ -62,6 +64,8 @@ "@astrojs/prism": "^3.3.0", "@astrojs/react": "^4.4.2", "@astrojs/sitemap": "^3.6.0", + "@astrojs/tailwind": "^6.0.2", + "@chainlink/blocks": "^1.3.1", "@astrojs/vercel": "^8.2.11", "@chainlink/cl-search-frontend": "^0.12.1", "@chainlink/components": "^0.4.18", @@ -150,6 +154,9 @@ "solhint": "^6.0.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", "tsconfig-paths": "^4.2.0", "tsx": "^4.20.6", "typescript": "^5.9.3", diff --git a/public/assets/icons/Arrow Right.svg b/public/assets/icons/Arrow Right.svg new file mode 100644 index 00000000000..c73460f5326 --- /dev/null +++ b/public/assets/icons/Arrow Right.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/icons/upper-right-arrow.svg b/public/assets/icons/upper-right-arrow.svg new file mode 100644 index 00000000000..7f588a0dcbd --- /dev/null +++ b/public/assets/icons/upper-right-arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/architecture.png b/public/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..076b0418e4f225ebbb61af973bce9465bc3ac0c9 GIT binary patch literal 86094 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%0AM?Ee^ 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

xbaW^RpMPyECBaAyX{uVX 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 ZKI-U7YC3?`HeJXrC!;8x|Cgcf{{q*fQ%V2; literal 0 HcmV?d00001 diff --git a/public/images/ccip-logo.svg b/public/images/ccip-logo.svg new file mode 100644 index 00000000000..79f05e8a605 --- /dev/null +++ b/public/images/ccip-logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/ccip/ccip-hero-bg.png b/public/images/ccip/ccip-hero-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5f3bc5df5594b7b8962326f84be8b6146ced24bd GIT binary patch literal 151643 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¥V^eEhr(^GF7JY`32HY3Aza-Wo!p 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 O0000J literal 0 HcmV?d00001 diff --git a/public/images/ccip/ccip-hero.png b/public/images/ccip/ccip-hero.png new file mode 100644 index 0000000000000000000000000000000000000000..306b8cb3ed305a5f5d3148d97840df1974c75bc1 GIT binary patch literal 19767 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 VJ3r;^1370WEX}MratIPZ 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

SLesM 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

I|wUD_EJ7 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

~jp}-R>_tiFkC;yLOzJUOljFY5 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 literal 0 HcmV?d00001 diff --git a/public/images/demos/Demos thumbnails 2.png b/public/images/demos/Demos thumbnails 2.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b867056720901da5c100121fd9b0884910ff46 GIT binary patch literal 17402 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 literal 0 HcmV?d00001 diff --git a/public/images/demos/Demos thumbnails 3.png b/public/images/demos/Demos thumbnails 3.png new file mode 100644 index 0000000000000000000000000000000000000000..ab5a48f2b636ad6df086c89c168093587fe15a96 GIT binary patch literal 27777 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 Y10bT?B=5|*eE`Cd=}m!(lys#(koM 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 literal 0 HcmV?d00001 diff --git a/public/images/direct-stacking-logo.svg b/public/images/direct-stacking-logo.svg new file mode 100644 index 00000000000..1814e384a6a --- /dev/null +++ b/public/images/direct-stacking-logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/images/foundry-logo.svg b/public/images/foundry-logo.svg new file mode 100644 index 00000000000..2315253caf3 --- /dev/null +++ b/public/images/foundry-logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/images/hardhat-logo.svg b/public/images/hardhat-logo.svg new file mode 100644 index 00000000000..6077c84afae --- /dev/null +++ b/public/images/hardhat-logo.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/hero-1.png b/public/images/hero-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f921b02c1ec4aee90353695e649f1797127b3761 GIT binary patch literal 902720 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�m`oxw)>ZFsodmeZ=&wD zusj=`>67y3|Ia@ZCaE~TXNBQ@QrPP+UnDk4;(5J!S3{THFQ4≺)<93p#mpA;9q% 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 yGfB%O)sRH!@3tco^v&ig(klaDaDsNmI4gB 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�a6Dv{0H4zQH5`o(O(O*1%%-lX(^ZK%g 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

`=~pi6<;s>KIRMXIASrv2)27z|x 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�&`bCExk05%VWGprh7hXEqmT)E0pt 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�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%0DA11t8TlD_b4|8_F`Z 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 H)Wa_-$?;LuS(S?^A3lQo8A8?t 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 ^m_(>-w9dpR&adCTmd|Bl%Y-a@)5vl(Jn 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

G*|l>y!| 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р{a3^MTQ(xRDnN|O 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

n4O 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�hKz7TpCh; z_`*OZK$XjUEaR;e)K*GrcsXYogxKg17JkfJ`05!!VDM4oaUzrlx!bMcjgu z>@2C0bU?z8y%~}p^@;h%4>}M}p9@Q;6gwk1I~P}cY(S>~0-4*Y47vg-GaqG`)yEW> zUFGk&#_{}{lkJ_JtLAA%`rm=3KF+KpS!00#3~jHzs5)|?o3Q;~9r^P-c%%dG00000 LNkvXXu0mjfjPR3P literal 0 HcmV?d00001 diff --git a/public/images/js-logo.svg b/public/images/js-logo.svg new file mode 100644 index 00000000000..a4baee9a679 --- /dev/null +++ b/public/images/js-logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/npm-logo.png b/public/images/npm-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..481f9493e8d47536b76f4d4d400813b387d1b52a GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?3oVGw3ym^DWND9BhG zw`pVf?%sCc$yExwc%~82#b}jRM$Er60p7~W8F|8cB<+ma|PJA+$Vq^XFk3&pZ zMCCstW218dO1*B{_tk58E_q-0FtLC|OWSw$&O0S@A3X}Kc<1!cxoJvRYl+9N6C(Gm zZ4aJ)$5*nvS0(r}_lz62+{#MNn(u9UH_QK)NlDl=!F%@(us*5$pr>~>b%9;puAn^& zZ#Tz1(zftpDwxc0=hB8LC!bI3jeGn-jO9hx>ag<>>@)7(Z;sbVl8IU>BzMhx&Af?* z2Yi_de%D`KvG#gZZA$br@nw%UvhV0$cJ#T|)6=!Ve;$1mt@Ap@V9p6r2Q*U!!CWJ5 zvNxmk>s_YQDRp1cuWB5ge|hcIgzOCm1<#y4pj!9Yux>iobfB((4h&9zyq$yPViL<< zvtPd;^8TfdoJ?Joht_A;*^AlQ_`c5E-EO;R-ej&&$C=97&zd?;6*%5`x-u!tZ0mmJ Yi1O0QY3X09fU(2i>FVdQ&MBb@0LCEG5dZ)H literal 0 HcmV?d00001 diff --git a/public/images/tryitout.png b/public/images/tryitout.png new file mode 100644 index 0000000000000000000000000000000000000000..330416da8c9ab7373655ceb553ce86955aeb02bf GIT binary patch literal 121198 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%0AI7H%q8dIwCkc>H1Ax<~-yO5% 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 OZ%|gykcY@wg#RBG(v3_2 literal 0 HcmV?d00001 diff --git a/public/images/ts-logo.svg b/public/images/ts-logo.svg new file mode 100644 index 00000000000..047caf543cc --- /dev/null +++ b/public/images/ts-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/remix-logo.svg b/src/assets/icons/remix-logo.svg new file mode 100644 index 00000000000..4580f3bf83b --- /dev/null +++ b/src/assets/icons/remix-logo.svg @@ -0,0 +1,13 @@ + +
+ + + + + + + + + + +
diff --git a/src/assets/icons/token-icon.svg b/src/assets/icons/token-icon.svg new file mode 100644 index 00000000000..2b8c333d430 --- /dev/null +++ b/src/assets/icons/token-icon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/product-logos/automated-compliance-engine.svg b/src/assets/product-logos/automated-compliance-engine.svg new file mode 100644 index 00000000000..e786648eddd --- /dev/null +++ b/src/assets/product-logos/automated-compliance-engine.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/product-logos/chainlink-local-2-logo.svg b/src/assets/product-logos/chainlink-local-2-logo.svg new file mode 100644 index 00000000000..f3a6360b201 --- /dev/null +++ b/src/assets/product-logos/chainlink-local-2-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/product-logos/data-link-vault.svg b/src/assets/product-logos/data-link-vault.svg new file mode 100644 index 00000000000..292b03b63a5 --- /dev/null +++ b/src/assets/product-logos/data-link-vault.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/product-logos/general-globe-logo.svg b/src/assets/product-logos/general-globe-logo.svg new file mode 100644 index 00000000000..11804ee8b1e --- /dev/null +++ b/src/assets/product-logos/general-globe-logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/product-logos/nodes-logo.svg b/src/assets/product-logos/nodes-logo.svg new file mode 100644 index 00000000000..016dae52333 --- /dev/null +++ b/src/assets/product-logos/nodes-logo.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/CCIP/Hero/Hero.css b/src/components/CCIP/Hero/Hero.css index 8c856f9ffc7..f8d0c61579a 100644 --- a/src/components/CCIP/Hero/Hero.css +++ b/src/components/CCIP/Hero/Hero.css @@ -5,6 +5,8 @@ .ccip-hero__heading { color: var(--gray-900); + font-size: 2.5rem; + margin-bottom: var(--space-6x); } .ccip-hero__content { @@ -15,3 +17,10 @@ align-items: center; gap: var(--space-4x); } + +@media screen and (max-width: 768px) { + .ccip-hero__heading { + font-size: 2rem; + margin-bottom: var(--space-4x); + } +} diff --git a/src/components/CCIP/Hero/Hero.tsx b/src/components/CCIP/Hero/Hero.tsx index 4655b535e92..5f479f22828 100644 --- a/src/components/CCIP/Hero/Hero.tsx +++ b/src/components/CCIP/Hero/Hero.tsx @@ -2,6 +2,7 @@ import { Environment, LaneConfig } from "~/config/data/ccip/index.ts" import Search from "../Search/Search.tsx" import "./Hero.css" import { ChainType, ExplorerInfo } from "~/config/types.ts" +import { Typography } from "@chainlink/blocks" interface HeroProps { chains: { @@ -39,7 +40,9 @@ function Hero({ chains, tokens, environment, lanes }: HeroProps) { return (

-

CCIP Directory

+ + CCIP Directory +
diff --git a/src/components/Cards/Card.astro b/src/components/Cards/Card.astro new file mode 100644 index 00000000000..c1331668d75 --- /dev/null +++ b/src/components/Cards/Card.astro @@ -0,0 +1,17 @@ +--- +import CardLink from "./CardLink.astro" +import styles from "./cards.module.css" +import { ICard } from "./types" + +type Props = ICard + +const { title, description, links } = Astro.props +--- + +
+

{title}

+

{description}

+
+ {links && links.map((l) => )} +
+
diff --git a/src/components/Cards/CardLink.astro b/src/components/Cards/CardLink.astro new file mode 100644 index 00000000000..032a29adc02 --- /dev/null +++ b/src/components/Cards/CardLink.astro @@ -0,0 +1,27 @@ +--- +import styles from "./cards.module.css" +import { ILink } from "./types" + +import tokenIcon from "../../assets/icons/token-icon.svg" +import remixIcon from "../../assets/icons/remix-logo.svg" + +interface Props { + link: ILink +} + +const { link } = Astro.props + +const iconMap = { + token: tokenIcon, + remix: remixIcon, +} + +const iconSrc = iconMap[link.icon] +--- + +
+ + + {link.label} + arrow right + diff --git a/src/components/Cards/CardsWrapper.astro b/src/components/Cards/CardsWrapper.astro new file mode 100644 index 00000000000..cb91045a25d --- /dev/null +++ b/src/components/Cards/CardsWrapper.astro @@ -0,0 +1,15 @@ +--- +import Card from "./Card.astro" +import styles from "./cards.module.css" +import { ICard } from "./types.ts" + +interface Props { + links: ICard[] +} + +const { links } = Astro.props +--- + +
+ {links.map((link) => )} +
diff --git a/src/components/Cards/cards.module.css b/src/components/Cards/cards.module.css new file mode 100644 index 00000000000..db4e076ab55 --- /dev/null +++ b/src/components/Cards/cards.module.css @@ -0,0 +1,66 @@ +.cardsWrapper { + display: grid; + grid-template-columns: repeat(3, 1fr); + border-left: 1px solid var(--border); + border-top: 1px solid var(--border); +} + +.cardsWrapper h6 { + font-size: 18px; + margin-bottom: var(--space-4x); +} + +:where(.cardsWrapper p) { + font-size: 14px; + line-height: 24px; /* 171.429% */ +} + +.card { + padding: var(--space-5x) var(--space-6x); + background: #fff; + border-right: 1px solid var(--border); + border-bottom: 1px solid var(--border); +} + +.card:hover { + background: var(--gray-100); +} + +.links { + display: flex; + flex-direction: column; + margin-top: var(--space-6x); + gap: var(--space-4x); +} + +.link { + color: var(--Color-Primary, #0e1119); + display: flex; + gap: var(--space-2x); + align-items: center; + cursor: default; +} + +.link:hover span { + opacity: 0.7; +} + +.cardTitle { + font-weight: 525; + margin-bottom: var(--space-4x); + font-size: 18px; + color: var(--foreground); +} + +@media screen and (max-width: 768px) { + .cardsWrapper { + grid-template-columns: repeat(2, 1fr) !important; + } +} + +@media screen and (max-width: 600px) { + .cardsWrapper { + grid-template-columns: repeat(1, 1fr) !important; + margin-top: 0; + } +} diff --git a/src/components/Cards/types.ts b/src/components/Cards/types.ts new file mode 100644 index 00000000000..20007518bc0 --- /dev/null +++ b/src/components/Cards/types.ts @@ -0,0 +1,12 @@ +export type IconType = "token" | "remix" + +export interface ILink { + icon: IconType + href: string + label: string +} +export interface ICard { + title: string + description: string + links?: ILink[] +} diff --git a/src/components/ChainSelector/ChainTypeSelector.module.css b/src/components/ChainSelector/ChainTypeSelector.module.css index 41a417e6c67..1d250eccf3b 100644 --- a/src/components/ChainSelector/ChainTypeSelector.module.css +++ b/src/components/ChainSelector/ChainTypeSelector.module.css @@ -1,8 +1,7 @@ .selector { display: flex; align-items: center; - padding: var(--space-3x) var(--space-3x); - border-bottom: 1px solid var(--border-color, #e5e7eb); + padding: var(--space-4x) 0; background: var(--color-background-primary, #ffffff); position: sticky; top: 0; diff --git a/src/components/ChangelogSnippet/ChangelogCard.astro b/src/components/ChangelogSnippet/ChangelogCard.astro new file mode 100644 index 00000000000..a22d05ad2bd --- /dev/null +++ b/src/components/ChangelogSnippet/ChangelogCard.astro @@ -0,0 +1,313 @@ +--- +import { SvgTaillessArrowDownSmall, Typography } from "@chainlink/blocks" +import styles from "./ChangelogCard.module.css" +import type { ChangelogItem } from "./types" + +interface Props { + item: ChangelogItem +} + +const { item } = Astro.props + +// Format the date +const formatDate = (dateString: string) => { + const date = new Date(dateString) + return date.toLocaleDateString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + }) +} + +const formattedDate = formatDate(item["date-of-release"]) +--- + +
+
+
+
+ + {item.type} + + + {formattedDate} + +
+
+ +
+ + {item.name} + + +
+ {item["text-description"] &&
} +
+
+
+ +
+ +
+
+ + + + diff --git a/src/components/ChangelogSnippet/ChangelogCard.module.css b/src/components/ChangelogSnippet/ChangelogCard.module.css new file mode 100644 index 00000000000..7e3dda0edeb --- /dev/null +++ b/src/components/ChangelogSnippet/ChangelogCard.module.css @@ -0,0 +1,150 @@ +/* Card Wrapper */ +.cardWrapper { + max-height: 400px; + overflow: hidden; + transition: max-height 0.5s ease; + position: relative; + border: 1px solid var(--border); +} + +/* Card Container */ +.card { + display: flex; + gap: 82px; + padding: var(--space-6x); +} + +.cardWrapper.expanded .card { + -webkit-mask-image: none; + mask-image: none; +} + +.cardWrapper:hover { + background-color: var(--muted); + + & .contentFooter { + background: linear-gradient(to top, var(--muted) 50%, transparent); + } +} + +/* Header Section */ +.header { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: var(--space-4x); + margin-bottom: var(--space-3x); +} + +.metaSection { + display: flex; + flex-direction: column; + gap: var(--space-1x); + flex: 1; +} + +/* Description Section */ +.description { + display: flex; + flex-direction: column; + gap: var(--space-3x); + line-height: 1.6; + margin-top: var(--space-3x); +} + +.description p { + margin: 0; + color: var(--foreground); +} + +.description a { + color: var(--color-blue-600); + text-decoration: none; +} + +.description a:hover { + text-decoration: underline; +} + +.header { + display: flex; + width: 150px; +} + +.content { + display: flex; + flex-direction: column; + flex: 1; +} + +/* Description Content */ +.descriptionContent { + flex: 1; +} + +/* Content Footer */ +.contentFooter { + position: absolute; + bottom: 0; + left: 0; + right: 0; + z-index: 10; + height: calc(var(--space-6x) + 68px); + display: flex; + align-items: end; + background: linear-gradient(to top, white 50%, transparent); + opacity: 0; + pointer-events: none; + transition: opacity 0.2s ease-in-out; +} + +/* Expand Button */ +.expandButton { + display: flex; + align-items: center; + gap: 8px; + padding: 0; + background: none; + border: none; + color: var(--foreground); + font-size: 14px; + font-weight: 600; + transition: color 0.2s ease; + cursor: default; + margin-left: 256px; + margin-bottom: var(--space-6x); +} + +.expandButton svg { + transition: transform 0.3s ease; +} + +@media (max-width: 768px) { + .card { + padding: var(--space-4x); + flex-direction: column; + gap: var(--space-4x); + } + + .header { + gap: var(--space-3x); + width: 100%; + } + + .metaSection { + gap: var(--space-1x); + } + + .expandButton { + margin-left: 0; + } + + .cardWrapper.expanded .card { + -webkit-mask-image: none; + mask-image: none; + } + + .contentFooter { + padding-left: var(--space-4x); + } +} diff --git a/src/components/ChangelogSnippet/ChangelogSnippet.astro b/src/components/ChangelogSnippet/ChangelogSnippet.astro new file mode 100644 index 00000000000..aa2930cb346 --- /dev/null +++ b/src/components/ChangelogSnippet/ChangelogSnippet.astro @@ -0,0 +1,65 @@ +--- +import { SvgArrowRight2, Typography } from "@chainlink/blocks" +import { SearchClient, searchClient } from "@algolia/client-search" +import ChangelogCard from "./ChangelogCard.astro" +import { AlgoliaQuery, type ChangelogItem } from "./types" +import styles from "./ChangelogSnippet.module.css" +import { getSecret } from "astro:env/server" + +interface Props { + query: AlgoliaQuery +} + +const { query } = Astro.props + +const appId = getSecret("ALGOLIA_APP_ID") +const apiKey = getSecret("PUBLIC_ALGOLIA_SEARCH_PUBLIC_API_KEY") + +let client: SearchClient +let latestLog: 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"], + query, + hitsPerPage: 1, + }, + ], + }) + + const firstResult = req.results[0] + const results = "hits" in firstResult ? (firstResult.hits as ChangelogItem[]) : [] + + // logs are returned sorted by created_at DESC + latestLog = results[0] +} +--- + +{ + latestLog && ( +
+
+ + Changelog + + + + + +
+ +
+ ) +} diff --git a/src/components/ChangelogSnippet/ChangelogSnippet.module.css b/src/components/ChangelogSnippet/ChangelogSnippet.module.css new file mode 100644 index 00000000000..d852a20cba5 --- /dev/null +++ b/src/components/ChangelogSnippet/ChangelogSnippet.module.css @@ -0,0 +1,46 @@ +.container { + display: flex; + flex-direction: column; + gap: var(--space-6x); +} + +.grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--space-4x); +} + +.sectionHeader { + display: flex; + gap: var(--space-4x); + align-items: end; +} + +.arrow { + padding: 10px; + border: 1px solid var(--border); + height: fit-content; + cursor: default; + &:hover { + border: 1px solid var(--foreground); + } +} + +@media (max-width: 1024px) { + .grid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 768px) { + .grid { + grid-template-columns: 1fr; + } +} + +@media screen and (max-width: 480px) { + .sectionHeader { + justify-content: space-between; + width: 100%; + } +} diff --git a/src/components/ChangelogSnippet/README.md b/src/components/ChangelogSnippet/README.md new file mode 100644 index 00000000000..bce2e2505ae --- /dev/null +++ b/src/components/ChangelogSnippet/README.md @@ -0,0 +1,37 @@ +# ChangelogSnippet Component + +## What This Component Does + +The ChangelogSnippet component displays the most recent changelog entry for a specific product or topic. It searches through changelog entries and shows the latest update in a card format with an expandable description. + +## How to Use It + +Import the component into your MDX file and provide a search query: + +```astro +import ChangelogSnippet from "@components/ChangelogSnippet/ChangelogSnippet.astro" + + +``` + +## Props + +| Prop | Type | Required | Description | +| ------- | ------ | -------- | ------------------------------------------------------------------------------------------- | +| `query` | string | Yes | The search term used to find relevant changelog entries (e.g., "ccip", "vrf", "automation") | + +## Complete Example + +Here's a full example of using the component in your documentation page: + +```astro +--- +import ChangelogSnippet from "@components/ChangelogSnippet/ChangelogSnippet.astro" +--- + +# CCIP Documentation Learn about Cross-Chain Interoperability Protocol. + + +``` + +This will display the latest CCIP-related changelog entry with a link to view the full changelog. diff --git a/src/components/ChangelogSnippet/types.ts b/src/components/ChangelogSnippet/types.ts new file mode 100644 index 00000000000..870c3afd23b --- /dev/null +++ b/src/components/ChangelogSnippet/types.ts @@ -0,0 +1,31 @@ +export type AlgoliaQuery = + | "ccip" + | "data-streams" + | "smart-data" + | "nodes" + | "data-feeds" + | "functions" + | "automation" + | "vrf" + | "general" + +export interface ChangelogItem { + createdOn: string + "date-of-release": string + hash: string + id: string + lastPublished: string + lastUpdated: string + name: string + networks: string + slug: string + "text-description": string + topic: string + type: string + objectID: string + _highlightResult?: { + "date-of-release": Record + name: Record + "text-description": Record + } +} diff --git a/src/components/CodeSample/CodeSample.astro b/src/components/CodeSample/CodeSample.astro index 73cef4f4cb2..8ffa36e46b8 100644 --- a/src/components/CodeSample/CodeSample.astro +++ b/src/components/CodeSample/CodeSample.astro @@ -10,8 +10,9 @@ export type Props = { showButtonOnly?: boolean optimize?: boolean runs?: number + showButtons?: boolean } -const { src, lang, showButtonOnly, optimize, runs } = Astro.props as Props +const { src, lang, showButtonOnly, optimize, runs, showButtons = true } = Astro.props as Props const data = (await fs.readFile(path.join(process.cwd(), "public", src), "utf-8")).toString() @@ -31,7 +32,7 @@ const remixUrl = `https://remix.ethereum.org/#url=https://docs.chain.link/${clea {!showButtonOnly && } { - isSample && ( + isSample && showButtons && (
Open in Remix diff --git a/src/components/CodeSample/CodeSampleReact.tsx b/src/components/CodeSample/CodeSampleReact.tsx index 4b17738649b..687e13ade30 100644 --- a/src/components/CodeSample/CodeSampleReact.tsx +++ b/src/components/CodeSample/CodeSampleReact.tsx @@ -13,7 +13,6 @@ export const CodeSampleReact: React.FC = ({ src, showButto const isSolidityFile = src.match(/\.sol/) const isSample = isSolidityFile && (src.indexOf("samples/") === 0 || src.indexOf("/samples/") === 0) - if (!isSample || !showButtonOnly || !remixUrl) return null return ( diff --git a/src/components/CommunityEvents/CommunityEvents.astro b/src/components/CommunityEvents/CommunityEvents.astro new file mode 100644 index 00000000000..2d31b6a0945 --- /dev/null +++ b/src/components/CommunityEvents/CommunityEvents.astro @@ -0,0 +1,110 @@ +--- +import { SvgArrowRight2, Typography } from "@chainlink/blocks" +import EventCard from "./EventCard.astro" +import ImageGallery from "./ImageGallery.astro" +import type { GalleryImage } from "./types" +import { fetchEventsFromRSS } from "./fetchEvents" +import styles from "./CommunityEvents.module.css" + +// Community event gallery images +const galleryImages: GalleryImage[] = [ + // Top row - scrolls left + { + id: "1", + imageUrl: + "https://cdn.prod.website-files.com/64cc2c23d8dbd707cdb556d8/677d1da974d919ae98a3bd59_home-community-5.webp", + alt: "Chainlink community event", + }, + { + id: "2", + imageUrl: + "https://cdn.prod.website-files.com/64cc2c23d8dbd707cdb556d8/677d1da974d919ae98a3bd55_home-community-2.webp", + alt: "Chainlink community event", + }, + { + id: "3", + imageUrl: + "https://cdn.prod.website-files.com/64cc2c23d8dbd707cdb556d8/677d1da974d919ae98a3bd30_home-community-4.webp", + alt: "Chainlink community event", + }, + { + id: "4", + imageUrl: + "https://cdn.prod.website-files.com/64cc2c23d8dbd707cdb556d8/677d1da974d919ae98a3bd46_home-community-11.webp", + alt: "Chainlink community event", + }, + { + id: "5", + imageUrl: + "https://cdn.prod.website-files.com/64cc2c23d8dbd707cdb556d8/677d1da974d919ae98a3bd51_home-community-3.webp", + alt: "Chainlink community event", + }, + { + id: "6", + imageUrl: + "https://cdn.prod.website-files.com/64cc2c23d8dbd707cdb556d8/677d1da974d919ae98a3bd42_home-community-10.webp", + alt: "Chainlink community event", + }, + // Bottom row - scrolls right + { + id: "7", + imageUrl: + "https://cdn.prod.website-files.com/64cc2c23d8dbd707cdb556d8/677d1da974d919ae98a3bd24_community-photo-12.webp", + alt: "Chainlink community event", + }, + { + id: "8", + imageUrl: + "https://cdn.prod.website-files.com/64cc2c23d8dbd707cdb556d8/677d1da974d919ae98a3bd2b_community-photo-10.webp", + alt: "Chainlink community event", + }, + { + id: "9", + imageUrl: + "https://cdn.prod.website-files.com/64cc2c23d8dbd707cdb556d8/677d1da974d919ae98a3bd4c_community-photo-24.webp", + alt: "Chainlink community event", + }, + { + id: "10", + imageUrl: + "https://cdn.prod.website-files.com/64cc2c23d8dbd707cdb556d8/677d1da974d919ae98a3bd3d_community-photo-22.webp", + alt: "Chainlink community event", + }, + { + id: "11", + imageUrl: + "https://cdn.prod.website-files.com/64cc2c23d8dbd707cdb556d8/677d1da974d919ae98a3bd36_community-photo-30.webp", + alt: "Chainlink community event", + }, +] + +const events = await fetchEventsFromRSS() +--- + +
+
+ + Community Events + + + + + +
+
+
+
+ {events.map((event) => )} +
+
+ +
+ +
+
+
diff --git a/src/components/CommunityEvents/CommunityEvents.module.css b/src/components/CommunityEvents/CommunityEvents.module.css new file mode 100644 index 00000000000..562ac07105c --- /dev/null +++ b/src/components/CommunityEvents/CommunityEvents.module.css @@ -0,0 +1,87 @@ +.wrapper { + margin: 86px 0; +} +.component { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: auto; + grid-auto-columns: 1fr; + align-items: center; + gap: 33px; + width: 100%; +} + +.contentLeft { + justify-self: end; + width: 100%; + max-width: calc(var(--fullwidth-max-width) / 2); + padding-left: var(--space-10x); +} + +.contentRight { + display: flex; + align-items: center; + overflow: hidden; +} + +.sectionHeader { + display: flex; + gap: var(--space-4x); + align-items: end; + max-width: var(--fullwidth-max-width); + margin-bottom: var(--space-8x); + margin-left: auto; + margin-right: auto; + padding: 0 var(--space-10x); +} + +.arrow { + padding: 10px; + border: 1px solid var(--border); + height: fit-content; + cursor: pointer; + transition: border-color 0.2s ease; +} + +.arrow:hover { + border: 1px solid var(--foreground); +} + +.eventList { + display: flex; + flex-direction: column; + gap: var(--space-6x); +} + +/* Tablet */ +@media (max-width: 1024px) { + .component { + display: flex; + flex-direction: column-reverse; + } + + .contentRight { + margin-left: 0; + width: 100%; + } + + .contentLeft { + max-width: 100%; + } +} + +/* Mobile */ +@media (max-width: 768px) { + .sectionHeader { + margin-bottom: var(--space-6x); + margin-left: unset; + margin-right: unset; + & > h2 { + font-size: 28px; + } + } + + .wrapper { + margin: 36px 0; + } +} diff --git a/src/components/CommunityEvents/EventCard.astro b/src/components/CommunityEvents/EventCard.astro new file mode 100644 index 00000000000..4bf52bef5a0 --- /dev/null +++ b/src/components/CommunityEvents/EventCard.astro @@ -0,0 +1,32 @@ +--- +import { SvgArrowRight2, Typography } from "@chainlink/blocks" +import type { CommunityEvent } from "./types" +import styles from "./EventCard.module.css" + +interface Props { + event: CommunityEvent +} + +const { event } = Astro.props +--- + + +
+ {event.month} + {event.day} +
+
+
+
+ {`${event.country} +
+ {event.location} +
+
+ + {event.title} + + arrow +
+
+
diff --git a/src/components/CommunityEvents/EventCard.module.css b/src/components/CommunityEvents/EventCard.module.css new file mode 100644 index 00000000000..4613acc0971 --- /dev/null +++ b/src/components/CommunityEvents/EventCard.module.css @@ -0,0 +1,80 @@ +.eventCardLink { + display: flex; + align-items: center; + gap: var(--space-4x); + border-radius: 0.5rem; + text-decoration: none; + transition: all 0.3s ease; + background-color: var(--background); +} + +.eventCardLink:hover .eventCardH { + color: var(--brand) !important; +} + +.eventCardLink:hover .linkArr { + opacity: 1 !important; +} + +.eventDate { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: var(--space-2x) var(--space-5x); + flex-shrink: 0; + border: 1px solid var(--border); + background-color: var(--muted); +} + +.eventCardDesc { + display: flex; + flex-direction: column; + gap: var(--space-2x); + flex: 1; + min-width: 0; +} + +.eventCardCountry { + display: flex; + align-items: center; + gap: var(--space-2x); +} + +.eventCardFlag { + width: 16px; + max-width: 16px; + height: 16px; + border-radius: 100%; + overflow: hidden; + flex-shrink: 0; + position: relative; +} + +.coverImg { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +.eventCardCountryName { + text-transform: uppercase; + color: var(--gray-600); +} + +.eventCardHWrap { + display: flex; + align-items: baseline; + gap: var(--space-3x); +} + +.linkArr { + opacity: 0; +} + +@media (max-width: 768px) { + .eventCardLink { + gap: var(--space-3x); + } +} diff --git a/src/components/CommunityEvents/ImageGallery.astro b/src/components/CommunityEvents/ImageGallery.astro new file mode 100644 index 00000000000..20c0f26e5ee --- /dev/null +++ b/src/components/CommunityEvents/ImageGallery.astro @@ -0,0 +1,42 @@ +--- +import type { GalleryImage } from "./types" +import styles from "./ImageGallery.module.css" + +interface Props { + images: GalleryImage[] +} + +const { images } = Astro.props + +// Split images into two rows for the gallery +const topRowImages = images.slice(0, Math.ceil(images.length / 2)) +const bottomRowImages = images.slice(Math.ceil(images.length / 2)) + +// Duplicate images for seamless infinite scroll +const topRowDuplicated = [...topRowImages, ...topRowImages] +const bottomRowDuplicated = [...bottomRowImages, ...bottomRowImages] +--- + +
+ +
+ { + topRowDuplicated.map((image) => ( +
+ {image.alt} +
+ )) + } +
+ + +
+ { + bottomRowDuplicated.map((image) => ( +
+ {image.alt} +
+ )) + } +
+
diff --git a/src/components/CommunityEvents/ImageGallery.module.css b/src/components/CommunityEvents/ImageGallery.module.css new file mode 100644 index 00000000000..edc1af53337 --- /dev/null +++ b/src/components/CommunityEvents/ImageGallery.module.css @@ -0,0 +1,70 @@ +.gallery { + width: 100%; + display: flex; + flex-direction: column; + gap: var(--space-5x); + overflow: hidden; +} + +.row { + display: flex; + gap: var(--space-5x); + animation: scrollLeft 30s linear infinite; + flex-shrink: 0; +} + +.rowReverse { + animation: scrollRight 30s linear infinite; +} + +.imageWrapper { + width: 16rem; + height: 12rem; + flex-shrink: 0; + border-radius: 0.5rem; + overflow: hidden; + position: relative; +} + +.image { + object-fit: cover; + border-radius: 0.5rem; + width: 100%; + height: 100%; + position: absolute; + inset: 0; +} + +@keyframes scrollLeft { + 0% { + transform: translate3d(0%, 0px, 0px); + } + 100% { + transform: translate3d(-50%, 0px, 0px); + } +} + +@keyframes scrollRight { + 0% { + transform: translate3d(-50%, 0px, 0px); + } + 100% { + transform: translate3d(0%, 0px, 0px); + } +} + +/* Pause animation on hover */ +.gallery:hover .row { + animation-play-state: paused; +} + +@media (max-width: 1024px) { + .imageWrapper { + width: 12rem; + height: 9rem; + } + + .gallery { + padding: 0 var(--space-10x); + } +} diff --git a/src/components/CommunityEvents/fetchEvents.ts b/src/components/CommunityEvents/fetchEvents.ts new file mode 100644 index 00000000000..09ee45fbbef --- /dev/null +++ b/src/components/CommunityEvents/fetchEvents.ts @@ -0,0 +1,53 @@ +import type { CommunityEvent } from "./types.ts" + +// Fetch events from Webflow RSS feed +export const fetchEventsFromRSS = async (): Promise => { + try { + const response = await fetch("https://chain.link/events-coll/rss.xml") + const xml = await response.text() + + // Parse RSS XML manually (lightweight approach without xml2js dependency) + const items = xml.match(/[\s\S]*?<\/item>/g) || [] + const now = new Date() + now.setHours(0, 0, 0, 0) // Set to start of today to include today's events + + const events = items + .map((item, index) => { + const title = item.match(/(.*?)<\/title>/)?.[1] || "" + const pubDate = item.match(/<pubDate>(.*?)<\/pubDate>/)?.[1] || "" + const description = item.match(/<description>(.*?)<\/description>/)?.[1] || "" + const mediaContent = item.match(/<media:content url="(.*?)"/)?.[1] || "" + + // Parse description: "Nov 12, 2025 - | Meetup | Bhopal | https://luma.com/cl_bhopal01" + const descParts = description.split("|").map((s) => s.trim()) + const location = descParts[2] || "Virtual" + const eventUrl = descParts[3] || "" + + // Parse date + const dateObj = new Date(pubDate) + const month = dateObj.toLocaleDateString("en-US", { month: "short" }) + const day = dateObj.getDate().toString() + + return { + id: index.toString(), + title: title.replace(/&/g, "&"), + date: dateObj.toISOString(), + month, + day, + location, + country: location, + flagUrl: mediaContent, + eventUrl, + backgroundColor: "rgb(12, 22, 44)", + } + }) + .filter((event) => new Date(event.date) >= now) // Filter out past events + .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()) // Sort ascending (closest first) + .slice(0, 3) // Only take the first 3 events + + return events + } catch (error) { + console.error("Error fetching events:", error) + return [] + } +} diff --git a/src/components/CommunityEvents/types.ts b/src/components/CommunityEvents/types.ts new file mode 100644 index 00000000000..ab6910a200d --- /dev/null +++ b/src/components/CommunityEvents/types.ts @@ -0,0 +1,18 @@ +export interface CommunityEvent { + id: string + title: string + date: string // ISO date string + month: string + day: string + location: string + country: string + flagUrl: string + eventUrl: string + backgroundColor?: string +} + +export interface GalleryImage { + id: string + imageUrl: string + alt: string +} diff --git a/src/components/Demos.astro b/src/components/Demos.astro new file mode 100644 index 00000000000..0cf482cfe2e --- /dev/null +++ b/src/components/Demos.astro @@ -0,0 +1,90 @@ +--- +import { Tag, Typography } from "@chainlink/blocks" +import styles from "./Demos.module.css" + +export interface Demo { + image: string + title: string + description: string + tags: string[] + href: string +} + +const demos: Demo[] = [ + { + image: "/images/demos/Demos thumbnails 1.png", + title: "Custom Data Feed", + description: + "See how you can bring your financial data onchain in a variety of different ways by creating a Net Asset Value feed, Proof of Reserve feed, or other custom data feed.", + tags: ["CRE", "DATA FEEDS"], + href: "/", + }, + { + image: "/images/demos/Demos thumbnails 2.png", + title: "Delivery vs. Payment (DvP)", + description: + "Learn how to sell a variety of assets via a Delivery vs. Payment transaction using the Chainlink Runtime Environment (CRE).", + tags: ["CRE"], + href: "/", + }, + { + image: "/images/demos/Demos thumbnails 3.png", + title: "Digital Transfer Agent (DTA)", + description: + "Learn how to invest in a variety of funds via a Digital Transfer Agent (DTA) transaction using the Chainlink Runtime Environment (CRE).", + tags: ["CRE"], + href: "/", + }, + { + image: "/images/demos/Demos thumbnails 4.png", + title: "Explore Chainlink", + description: "Explore how the Chainlink standard powers tokenization and onchain finance through", + tags: ["CRE", "CCIP", "DATA FEEDS"], + href: "/", + }, +] +--- + +<section class={styles.demosSection}> + <Typography variant="h2">Demos</Typography> + <div class={styles.grid}> + { + demos.map((demo) => ( + <a href={demo.href} class={styles.card}> + <div class={styles.imageContainer}> + <img src={demo.image} alt={demo.title} class={styles.image} /> + </div> + <div class={styles.content}> + <div class={styles.body}> + <Typography + variant="h6" + style={{ + fontWeight: "500", + marginBottom: "var(--space-4x)", + }} + > + {demo.title} + </Typography> + <Typography variant="body-s" color="muted"> + {demo.description} + </Typography> + </div> + <footer class={styles.footer}> + <div class={styles.tags}> + {demo.tags.map((tag) => ( + <Tag size="sm" className={styles.footerTag}> + {tag} + </Tag> + ))} + </div> + + <div class={styles.footerArrow}> + <img src="/assets/icons/upper-right-arrow.svg" alt="" /> + </div> + </footer> + </div> + </a> + )) + } + </div> +</section> diff --git a/src/components/Demos.module.css b/src/components/Demos.module.css new file mode 100644 index 00000000000..37371d59041 --- /dev/null +++ b/src/components/Demos.module.css @@ -0,0 +1,99 @@ +.demosSection { + width: 100%; + display: flex; + flex-direction: column; + gap: var(--space-6x); + + & > h2 { + font-size: 28px; + } +} + +.grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + border: 1px solid var(--border); +} + +.card { + display: flex; + flex-direction: column; + padding: var(--space-6x); + overflow: hidden; + transition: box-shadow 0.2s ease; + gap: var(--space-4x); + + &:hover { + background-color: var(--muted); + } + + &:hover .footerTag { + background-color: var(--background); + } + + &:hover .footerArrow { + opacity: 1; + } +} + +.card:not(:last-child) { + border-right: 1px solid var(--border); +} + +.imageContainer { + width: 100%; + aspect-ratio: 16 / 9; + overflow: hidden; +} + +.image { + width: 100%; + height: 100%; + object-fit: cover; +} + +.body { + margin-bottom: var(--space-4x); +} +.content { + display: flex; + flex-direction: column; + gap: var(--space-4x); + flex: 1; +} + +.tags { + display: flex; + flex-wrap: wrap; + gap: var(--space-1x); +} + +.footer { + display: flex; + justify-content: space-between; + + margin-top: auto; + padding-top: var(--space-4x); +} + +.footerArrow { + opacity: 0; + display: flex; + align-items: end; +} +@media screen and (max-width: 1024px) { + .grid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media screen and (max-width: 570px) { + .grid { + grid-template-columns: repeat(1, 1fr); + } + + .card:not(:last-child) { + border-bottom: 1px solid var(--border); + border-right: none; + } +} diff --git a/src/components/DocsHeaderTitle/DocsHeaderTitle.astro b/src/components/DocsHeaderTitle/DocsHeaderTitle.astro new file mode 100644 index 00000000000..81ec51634ed --- /dev/null +++ b/src/components/DocsHeaderTitle/DocsHeaderTitle.astro @@ -0,0 +1,24 @@ +--- +import { getNavigationProps } from "../Header/getNavigationProps" +import { isMatchedPath } from "../Header/Nav/isMatchedPath" +import defaultLogo from "../../assets/product-logos/default-logo.svg" +import styles from "./docsHeaderTitle.module.css" +const { subProductsNav } = getNavigationProps() +import { Typography } from "@chainlink/blocks" + +interface Props { + pathname: string +} + +const { pathname } = Astro.props + +const subProductTrigger = subProductsNav?.find(({ href }) => isMatchedPath(pathname, href)) + +const label = subProductTrigger?.label || "Resources" +const icon = subProductTrigger?.label ? subProductTrigger.icon : defaultLogo.src +--- + +<div class={styles.docsHeaderTitleWrapper}> + <img src={icon} alt="" class={styles.logo} /> + <Typography color="foreground" variant="body-semi-l">{label}</Typography> +</div> diff --git a/src/components/DocsHeaderTitle/docsHeaderTitle.module.css b/src/components/DocsHeaderTitle/docsHeaderTitle.module.css new file mode 100644 index 00000000000..f0f9443a1f0 --- /dev/null +++ b/src/components/DocsHeaderTitle/docsHeaderTitle.module.css @@ -0,0 +1,11 @@ +.logo { + width: var(--space-6x); + height: var(--space-6x); +} + +.docsHeaderTitleWrapper { + display: flex; + align-items: center; + gap: var(--space-3x); + padding: var(--doc-padding) 0; +} diff --git a/src/components/DocsNavigation/DocsNavigationDesktop/DocsNavigationDesktop.tsx b/src/components/DocsNavigation/DocsNavigationDesktop/DocsNavigationDesktop.tsx index f1a88b5395f..bf09832475c 100644 --- a/src/components/DocsNavigation/DocsNavigationDesktop/DocsNavigationDesktop.tsx +++ b/src/components/DocsNavigation/DocsNavigationDesktop/DocsNavigationDesktop.tsx @@ -1,6 +1,5 @@ import { clsx } from "~/lib/clsx/clsx.ts" import { useNavBar } from "../../Header/useNavBar/useNavBar.ts" -import DocsPickerDesktop from "./DocsPickerDesktop.tsx" import styles from "./docsNavigationDesktop.module.css" import QuickLinksModal from "../../Header/Nav/QuickLinksModal.tsx" import { useState } from "react" @@ -29,10 +28,7 @@ function DocsNavigationDesktop({ })} > <div className={styles.container}> - <div className={styles.left}> - <DocsPickerDesktop pathname={pathname} /> - {children} - </div> + <div className={styles.left}>{children}</div> <div className={styles.links}> {isCcipPage ? ( /* Custom links for CCIP Directory pages */ diff --git a/src/components/DocsNavigation/DocsNavigationDesktop/DocsPickerDesktop.tsx b/src/components/DocsNavigation/DocsNavigationDesktop/DocsPickerDesktop.tsx deleted file mode 100644 index feb8d80bcfb..00000000000 --- a/src/components/DocsNavigation/DocsNavigationDesktop/DocsPickerDesktop.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { useState } from "react" -import { isMatchedPath } from "../../Header/Nav/isMatchedPath.ts" -import { getNavigationProps } from "../../Header/getNavigationProps.ts" -import styles from "./docsPickerDesktop.module.css" -import { clsx } from "../../Header/Nav/utils.ts" -import defaultLogo from "../../../assets/product-logos/default-logo.svg" - -function DocsPickerDesktop({ pathname }: { pathname: string }) { - const [productMenuOpen, setProductMenuOpen] = useState(false) - const { subProductsNav } = getNavigationProps() - - const subProductTrigger = subProductsNav?.find(({ href }) => isMatchedPath(pathname, href)) - - const label = subProductTrigger?.label || "Resources" - const icon = subProductTrigger?.label ? subProductTrigger.icon : defaultLogo.src - - return ( - <div - className={styles.docsPickerContainer} - onMouseEnter={() => setProductMenuOpen(true)} - onMouseLeave={() => setProductMenuOpen(false)} - > - <img src={icon} alt="" className={styles.logo} /> - <span>{label}</span> - <div className={styles.caret}> - <span></span> - </div> - {productMenuOpen && ( - <div className={styles.menu}> - <ul className={styles.column}> - {subProductsNav - .filter((item) => !item.hideFromDropdown && item.col === 1) - .map((item) => ( - <li className={clsx(styles.item)} key={item.label}> - <a - className={clsx(styles.link, { [styles.active]: isMatchedPath(pathname, item.href) })} - href={item.href} - > - <img className={clsx(styles.icon)} src={item.icon}></img> - {item.label} - </a> - </li> - ))} - </ul> - <ul className={styles.column}> - {subProductsNav - .filter((item) => !item.hideFromDropdown && item.col === 2) - .map((item) => ( - <li className={clsx(styles.item)} key={item.label}> - <a className={clsx(styles.link)} href={item.href}> - <img className={clsx(styles.icon)} src={item.icon}></img> - {item.label} - </a> - </li> - ))} - </ul> - </div> - )} - </div> - ) -} - -export default DocsPickerDesktop diff --git a/src/components/Footer/Footer.astro b/src/components/Footer/Footer.astro index 7f8a2078d1a..fee1f52732f 100644 --- a/src/components/Footer/Footer.astro +++ b/src/components/Footer/Footer.astro @@ -302,6 +302,12 @@ display: flex; align-items: center; } + + .footer-col > h3 { + margin-bottom: var(--space-4x); + font-weight: 500; + } + .footer-logo-text-hide { position: absolute; left: 0; diff --git a/src/components/Footer/NewsletterCTA.css b/src/components/Footer/NewsletterCTA.css index bf25fd36df4..eac894074d1 100644 --- a/src/components/Footer/NewsletterCTA.css +++ b/src/components/Footer/NewsletterCTA.css @@ -19,6 +19,8 @@ .cta-subscribe-h1 { text-align: center; + font-size: 2rem; + font-weight: 600; } .newsletter-cta :is(h2) { @@ -56,6 +58,7 @@ } .newsletter-cta .cta-subscribe-input::placeholder { font-style: italic; + color: var(--muted-foreground); } #subscribe-button { @@ -100,3 +103,9 @@ margin-bottom: var(--space-0x); } } + +@media screen and (min-width: 768px) { + .cta-subscribe-h1 { + font-size: 2.5rem; + } +} diff --git a/src/components/HeadCommon.astro b/src/components/HeadCommon.astro index f2199bba192..96285979c75 100644 --- a/src/components/HeadCommon.astro +++ b/src/components/HeadCommon.astro @@ -4,6 +4,7 @@ import "../styles/index.css" import "../styles/migrated.css" import "../styles/prism-darcula.css" import "@chainlink/design-system/global-styles.css" +import "@chainlink/blocks/src/theme/globals.css" export interface Props { title: string diff --git a/src/components/Header/Nav/ProductNavigation/Desktop/MegaMenu.tsx b/src/components/Header/Nav/ProductNavigation/Desktop/MegaMenu.tsx index b13f9e55827..a8a65f8f984 100644 --- a/src/components/Header/Nav/ProductNavigation/Desktop/MegaMenu.tsx +++ b/src/components/Header/Nav/ProductNavigation/Desktop/MegaMenu.tsx @@ -1,305 +1,244 @@ -import { evmProducts } from "~/features/landing/data/index.ts" import styles from "./megaMenu.module.css" -import resourcesLogo from "../../../../../assets/product-logos/data-resources-logo.svg" -import { Fragment } from "react/jsx-runtime" -import { useEffect } from "react" +import ccipLogo from "../../../../../assets/product-logos/ccip-logo.svg" +import dataFeedsLogo from "../../../../../assets/product-logos/data-feeds-logo.svg" +import dataStreamsLogo from "../../../../../assets/product-logos/data-streams-logo.svg" +import dataLinkLogo from "../../../../../assets/product-logos/datalink-logo.svg" +import functionsLogo from "../../../../../assets/product-logos/functions-logo.svg" +import automationLogo from "../../../../../assets/product-logos/automation-logo.svg" +import vrfLogo from "../../../../../assets/product-logos/vrf-logo.svg" +import dtaLogo from "../../../../../assets/product-logos/dta-logo.svg" +import generalGlobeLogo from "../../../../../assets/product-logos/general-globe-logo.svg" +import nodesLogo from "../../../../../assets/product-logos/nodes-logo.svg" +import chainlinkLocalLogo from "../../../../../assets/product-logos/chainlink-local-2-logo.svg" +import creLogo from "../../../../../assets/product-logos/cre-logo.svg" +import { Typography } from "@chainlink/blocks" +import { clsx } from "../../utils.ts" -interface MegaMenuProps { - cancel: () => void - id?: string -} - -interface BottomLink { - label: string - href: string -} - -interface Link { - label: string - href?: string +const BlueSquare = () => { + return ( + <div + style={{ + background: "var(--brand)", + height: "5px", + width: "5px", + display: "block", + }} + ></div> + ) } -interface MenuItem { - title?: string - image?: { src: string } - description?: string - learnMoreLink?: string - docsLandingLink?: string - links: Link[] +interface GroupItem { + title: string + description: string + icon: ImageMetadata + link: string } -interface SubSection { - title: string - items: MenuItem[] - bottomLinks?: BottomLink[] +const GroupItem = ({ data }: { data: GroupItem }) => { + return ( + <a href={data.link} className={styles.groupItem}> + <img src={data.icon.src} alt={data.title} className={styles.groupItemIcon} /> + <div> + <Typography variant="body-semi" className={styles.groupItemTitle}> + {data.title} + </Typography> + <Typography color="muted" variant="body-s" className={styles.groupItemDescription}> + {data.description} + </Typography> + </div> + </a> + ) } -interface MegaMenuSection { - title: string - isMultiSection?: boolean - sections?: SubSection[] - items?: MenuItem[] - bottomLinks?: BottomLink[] +const GroupTitle = ({ children }: { children: React.ReactNode }) => { + return ( + <Typography + variant="code-s" + color="muted" + style={{ textTransform: "uppercase", lineHeight: "12px", letterSpacing: "0.6px" }} + > + {children} + </Typography> + ) } -export const megaMenuSections: MegaMenuSection[] = [ - { - title: "Orchestration & Cross-Chain", - isMultiSection: true, - sections: [ - { - title: "Orchestration", - items: [ - { - ...(evmProducts.find((product) => product.title === "CRE") || {}), - links: [ - { - label: "Docs", - href: (evmProducts.find((product) => product.title === "CRE") || {})?.docsLandingLink, - }, - ], - }, - ], - }, +export const megaMenuSections = { + interoperability: { + title: "Interoperability", + items: [ { - title: "Cross-Chain", - items: [ - { - ...(evmProducts.find((product) => product.title === "CCIP") || {}), - links: [ - { - label: "Docs", - href: (evmProducts.find((product) => product.title === "CCIP") || {})?.docsLandingLink, - }, - { - label: "Learn", - href: (evmProducts.find((product) => product.title === "CCIP") || {})?.learnMoreLink, - }, - ], - }, - ], - bottomLinks: [ - { - label: "View all resources", - href: "https://dev.chain.link/resources", - }, - { - label: "Learn about Chainlink", - href: "https://dev.chain.link/products/general", - }, - ], + icon: ccipLogo, + title: "Cross-Chain Communication", + description: "Move data and value across any blockchain", + link: "/ccip", }, ], }, - { + data: { title: "Data", items: [ { - ...evmProducts.find((product) => product.title === "Data Feeds"), - title: "Data Feeds", - links: [ - { - label: "Docs", - href: (evmProducts.find((product) => product.title === "Data Feeds") || {})?.docsLandingLink, - }, - { - label: "Learn", - href: (evmProducts.find((product) => product.title === "Data Feeds") || {})?.learnMoreLink, - }, - ], + icon: dataStreamsLogo, + title: "Data Streams", + description: "Access high-frequency market data for next-gen DeFi", + link: "/data-streams", }, - { - ...evmProducts.find((product) => product.title === "Data Streams"), - title: "Data Streams", - links: [ - { - label: "Docs", - href: (evmProducts.find((product) => product.title === "Data Streams") || {})?.docsLandingLink, - }, - { - label: "Learn", - href: (evmProducts.find((product) => product.title === "Data Streams") || {})?.learnMoreLink, - }, - ], + icon: dataFeedsLogo, + title: "Market and Data Feeds", + description: "Utilize ultra-secure onchain data for smart contracts", + link: "/data-feeds", }, - { - title: "Data resources", - image: resourcesLogo, - description: "Global standard for building secure cross-chain applications.", - learnMoreLink: "data-feeds", - links: [ - { - label: "Learn", - href: "https://dev.chain.link/products/data", - }, - ], + icon: dataLinkLogo, + title: "DataLink", + description: "Publish and commercialize institutional data across...", + link: "/datalink", }, ], }, - { + assetManagement: { + title: "Asset Management", + items: [ + { + icon: dtaLogo, + title: "Digital Transfer Agent (DTA) Technical Standard", + description: "Unlock streamlined tokenized fund operations", + link: "/dta-technical-standard", + }, + ], + }, + compute: { title: "Compute", items: [ { - ...evmProducts.find((product) => product.title === "Automation"), - links: [ - { - label: "Docs", - href: (evmProducts.find((product) => product.title === "Automation") || {})?.docsLandingLink, - }, - { - label: "Learn", - href: (evmProducts.find((product) => product.title === "Automation") || {})?.learnMoreLink, - }, - ], + icon: functionsLogo, + title: "Functions", + description: "Connect smart contracts to any API", + link: "/chainlink-functions", }, { - ...evmProducts.find((product) => product.title === "Functions"), - links: [ - { - label: "Docs", - href: (evmProducts.find((product) => product.title === "Functions") || {})?.docsLandingLink, - }, - { - label: "Learn", - href: (evmProducts.find((product) => product.title === "Functions") || {})?.learnMoreLink, - }, - ], + icon: automationLogo, + title: "Automation", + description: "Automate smart contracts via decentralized triggers", + link: "/chainlink-automation", }, { - ...evmProducts.find((product) => product.title === "VRF"), - links: [ - { - label: "Docs", - href: (evmProducts.find((product) => product.title === "VRF") || {})?.docsLandingLink, - }, - { - label: "Learn", - href: (evmProducts.find((product) => product.title === "VRF") || {})?.learnMoreLink, - }, - ], + icon: vrfLogo, + title: "VRF", + description: "Ensure fair outcomes in games, NFTs, and more", + link: "/vrf", }, ], }, -] - -function MegaMenu({ cancel, id }: MegaMenuProps) { - useEffect(() => { - const onESC = (ev: KeyboardEvent) => { - if (ev.key === "Escape") { - cancel() - } - } - window.addEventListener("keyup", onESC, false) - return () => { - window.removeEventListener("keyup", onESC, false) - } - }, []) + orchestration: { + title: "Orchestration", + items: [ + { + icon: creLogo, + title: "Chainlink Runtime Environment (CRE)", + description: "The global orchestration layer", + link: "/cre", + }, + ], + }, + other: { + title: "More", + items: [ + { + icon: generalGlobeLogo, + title: "General", + description: "Foundational Chainlink knowledge", + link: "/getting-started/conceptual-overview", + }, + { + icon: nodesLogo, + title: "Nodes", + description: "Be part of the Chainlink Network", + link: "/", + }, + { + icon: chainlinkLocalLogo, + title: "Chainlink local", + description: "Run services locally before transitioning to a testnet", + link: "/chainlink-local", + }, + ], + }, +} +function MegaMenu({ cancel, isMobile }: { cancel?: () => void; isMobile?: boolean }) { return ( - <div className={styles.megaMenuContainer} id={id}> - <div className={styles.wrapper} onMouseLeave={cancel}> - <div className={styles.resourcesMenuContentMain}> - {megaMenuSections.map((section) => ( - <div className={styles.resourcesMenuContentRow} key={section.title}> - {section.isMultiSection && section.sections ? ( - <> - {section.sections.map((subSection) => ( - <Fragment key={subSection.title}> - <h2 className="label">{subSection.title}</h2> - {subSection.items.map((item, index) => ( - <Fragment key={index}> - <div className={styles.megaMenuLink}> - {item?.image?.src && <img src={item.image.src} alt={item.title} />} - <h3 className="heading-100">{item.title}</h3> - </div> - <div className={styles.links}> - <p className="paragraph-100">{item.description}</p> - {item.links.map((link, linkIndex) => ( - <Fragment key={linkIndex}> - <a href={link.href} className="text-100"> - {link.label} - </a> - {linkIndex < item.links.length - 1 && <span className={styles.verticalDivider}></span>} - </Fragment> - ))} - </div> - </Fragment> - ))} - {subSection.bottomLinks && ( - <div className={styles.bottomLinks}> - {subSection.bottomLinks.map((link, linkIndex) => ( - <div className="label" key={linkIndex}> - <a href={link.href} target="_blank" rel="noopener noreferrer"> - {link.label} - </a> - <img src="/images/tabler_arrow-up.svg" alt="" /> - </div> - ))} - </div> - )} - </Fragment> - ))} - </> - ) : ( - <> - <h2 className="label">{section.title}</h2> - {section.items?.map((item, index) => ( - <Fragment key={index}> - <div className={styles.megaMenuLink}> - {item?.image?.src && <img src={item.image.src} alt={item.title} />} - <h3 className="heading-100">{item.title}</h3> - </div> - <div className={styles.links}> - <p className="paragraph-100">{item.description}</p> - {item.links.map((link, linkIndex) => ( - <Fragment key={linkIndex}> - <a href={link.href} className="text-100"> - {link.label} - </a> - {linkIndex < item.links.length - 1 && <span className={styles.verticalDivider}></span>} - </Fragment> - ))} - </div> - </Fragment> - ))} - {"bottomLinks" in section && section.bottomLinks && ( - <div className={styles.bottomLinks}> - {section.bottomLinks.map((link, linkIndex) => ( - <div className="label" key={linkIndex}> - <a href={link.href} target="_blank" rel="noopener noreferrer"> - {link.label} - </a> - <img src="/images/tabler_arrow-up.svg" alt="" /> - </div> - ))} - </div> - )} - </> - )} - </div> - ))} + <div className={clsx(styles.wrapper, isMobile && styles.mobile)} onMouseLeave={cancel}> + <div className={styles.row}> + <div className={styles.section}> + <header> + <BlueSquare /> + <GroupTitle>{megaMenuSections.orchestration.title}</GroupTitle> + </header> + <li className={styles.itemList}> + {megaMenuSections.orchestration.items.map((link) => ( + <GroupItem key={link.title} data={link} /> + ))} + </li> </div> - <div className={styles.resourcesMenuContentFeatured}> - <h2 className="label">Featured</h2> - <a href="/chainlink-local"> - <img src="/images/megamenu-featured.jpg" alt="" className={styles.featuredImage} /> - </a> - <div className={styles.divider}></div> + <div className={styles.section}> + <header> + <BlueSquare /> + <GroupTitle>{megaMenuSections.interoperability.title}</GroupTitle> + </header> + <li className={styles.itemList}> + {megaMenuSections.interoperability.items.map((link) => ( + <GroupItem key={link.title} data={link} /> + ))} + </li> + </div> + <div className={styles.section}> + <header> + <BlueSquare /> + <GroupTitle>{megaMenuSections.assetManagement.title}</GroupTitle> + </header> + <li className={styles.itemList}> + {megaMenuSections.assetManagement.items.map((link) => ( + <GroupItem key={link.title} data={link} /> + ))} + </li> + </div> + </div> - <h3 className="heading-100">Hardhat CLI for Data Streams</h3> - <div className={styles.links}> - <a href="/data-streams/getting-started-hardhat" className="text-100"> - Docs - </a> - </div> - <h3 className="heading-100">Try out Chainlink Automation</h3> - <div className={styles.links}> - <a href="/chainlink-automation/overview/getting-started" className="text-100"> - Docs - </a> - </div> + <div className={styles.row}> + <div className={styles.section}> + <header> + <BlueSquare /> + <GroupTitle>{megaMenuSections.data.title}</GroupTitle> + </header> + <li className={styles.itemList}> + {megaMenuSections.data.items.map((link) => ( + <GroupItem key={link.title} data={link} /> + ))} + </li> + </div> + <div className={styles.section}> + <header> + <BlueSquare /> + <GroupTitle>{megaMenuSections.compute.title}</GroupTitle> + </header> + <li className={styles.itemList}> + {megaMenuSections.compute.items.map((link) => ( + <GroupItem key={link.title} data={link} /> + ))} + </li> + </div> + <div className={styles.section}> + <header> + <BlueSquare /> + <GroupTitle>{megaMenuSections.other.title}</GroupTitle> + </header> + <li className={styles.itemList}> + {megaMenuSections.other.items.map((link) => ( + <GroupItem key={link.title} data={link} /> + ))} + </li> </div> </div> </div> diff --git a/src/components/Header/Nav/ProductNavigation/Desktop/MegaMenuContainer.tsx b/src/components/Header/Nav/ProductNavigation/Desktop/MegaMenuContainer.tsx new file mode 100644 index 00000000000..17a6a2a25ce --- /dev/null +++ b/src/components/Header/Nav/ProductNavigation/Desktop/MegaMenuContainer.tsx @@ -0,0 +1,27 @@ +import { useEffect } from "react" +import styles from "./megaMenu.module.css" + +interface MegaMenuProps { + cancel: () => void + id?: string + children?: React.ReactNode +} + +export default function MegaMenuContainer({ cancel, id, children }: MegaMenuProps) { + useEffect(() => { + const onESC = (ev: KeyboardEvent) => { + if (ev.key === "Escape") { + cancel() + } + } + window.addEventListener("keyup", onESC, false) + return () => { + window.removeEventListener("keyup", onESC, false) + } + }, []) + return ( + <div className={styles.megaMenuContainer} id={id}> + {children} + </div> + ) +} diff --git a/src/components/Header/Nav/ProductNavigation/Desktop/ProductNavigation.tsx b/src/components/Header/Nav/ProductNavigation/Desktop/ProductNavigation.tsx index c6e0768cb9f..ada39e93f95 100644 --- a/src/components/Header/Nav/ProductNavigation/Desktop/ProductNavigation.tsx +++ b/src/components/Header/Nav/ProductNavigation/Desktop/ProductNavigation.tsx @@ -6,6 +6,7 @@ import { extendRadixComponent } from "../extendRadixComponent.ts" import styles from "./productNavigation.module.css" import { CaretIcon } from "../CaretIcon.tsx" import MegaMenu from "./MegaMenu.tsx" +import MegaMenuContainer from "./MegaMenuContainer.tsx" type Props = { setNavMenuOpen: (navMenuOpen: boolean) => void @@ -42,27 +43,20 @@ export const ProductNavigation = ({ setNavMenuOpen, showMegaMenu, isMegamenuOpen <> <Root className={clsx(styles.root, styles.alignLeft)}> <List className={styles.list}> - <Item> + <Item onMouseEnter={exitMegamenu}> <a - className={clsx(styles.navLink, { - [styles.megaMenu]: isMegamenuOpen, - })} + className={clsx(styles.navLink)} onMouseEnter={showMegaMenu} role="button" aria-expanded={isMegamenuOpen} aria-controls="mega-menu" - aria-label="Resources menu" + aria-label="Docs menu" tabIndex={0} onKeyDown={handleKeyDown} > - Resources <CaretIcon aria-hidden /> + Docs <CaretIcon aria-hidden /> </a> </Item> - <Item onMouseEnter={exitMegamenu}> - <NavigationMenu.Link className={clsx(styles.navLink, styles.active)} href="/"> - Docs - </NavigationMenu.Link> - </Item> <Item> <NavigationMenu.Link className={styles.navLink} href="https://dev.chain.link/demos"> Demos @@ -79,12 +73,16 @@ export const ProductNavigation = ({ setNavMenuOpen, showMegaMenu, isMegamenuOpen </NavigationMenu.Link> </Item> <Item> - <NavigationMenu.Link className={styles.navLink} href="https://dev.chain.link/certification"> + <NavigationMenu.Link className={styles.navLink} href="/certification"> Get Certified </NavigationMenu.Link> </Item> </List> - {isMegamenuOpen && <MegaMenu id="mega-menu" cancel={exitMegamenu} />} + {isMegamenuOpen && ( + <MegaMenuContainer id="mega-menu" cancel={exitMegamenu}> + <MegaMenu cancel={exitMegamenu} /> + </MegaMenuContainer> + )} </Root> </> ) diff --git a/src/components/Header/Nav/ProductNavigation/Desktop/megaMenu.module.css b/src/components/Header/Nav/ProductNavigation/Desktop/megaMenu.module.css index 83ba42a3509..6b3b9066541 100644 --- a/src/components/Header/Nav/ProductNavigation/Desktop/megaMenu.module.css +++ b/src/components/Header/Nav/ProductNavigation/Desktop/megaMenu.module.css @@ -9,15 +9,8 @@ justify-content: center; } -.wrapper { - max-width: 1360px; - width: 100%; - background-color: white; - height: fit-content; - border-radius: 0.5rem; - display: grid; - grid-template-columns: 3fr 1fr; - overflow: hidden; +/* applies shadow to dropdown version of mega-menu */ +.megaMenuContainer > .wrapper { box-shadow: 4.6px 9.3px 54px 1px rgba(152, 160, 185, 0.04), 2.1px 4.3px 32px -0.7px rgba(152, 160, 185, 0.31), @@ -25,108 +18,128 @@ 0.3px 0.5px 0.8px 0px rgba(152, 160, 185, 0.12); } -.wrapper h2 { - padding-bottom: var(--space-4x); - color: var(--gray-500); - text-transform: uppercase; - border-bottom: 1px solid var(--gray-200); - margin-bottom: var(--space-8x); -} +.wrapper { + max-width: 1500px; + width: 100%; + background-color: white; + height: fit-content; + overflow: hidden; + display: flex; + flex-direction: column; -.wrapper h3 { - font-family: var(--font-family-text); - color: var(--gray-900); + border: 1px solid var(--border); } -.wrapper p { - color: var(--gray-500); - margin-top: var(--space-2x); - margin-bottom: var(--space-3x); - line-height: var(--space-6x); +.row { + display: grid; + grid-template-columns: repeat(3, 1fr); + border-bottom: 1px solid var(--border); } -.resourcesMenuContentMain { - padding-top: var(--space-16x); - padding-left: var(--space-16x); - padding-bottom: var(--space-16x); - padding-right: var(--space-8x); - display: grid; - grid-template-columns: 1fr 1fr 1fr; - gap: var(--space-16x); +.row:last-child { + border-bottom: none; } -.resourcesMenuContentRow { +.wrapper header { display: flex; - flex-direction: column; + align-items: center; + gap: var(--space-3x); + padding: var(--space-4x) var(--space-6x); } -.verticalDivider { - border-left: 1px solid var(--gray-300); - margin: 0 var(--space-3x); +.wrapper p { + margin-bottom: 0; } -.links { - margin-bottom: var(--space-10x); +.section { + display: flex; + flex-direction: column; + border-right: 1px solid var(--border); } -.links a { - font-weight: var(--font-weight-medium); - color: var(--color-text-link); +.section:last-child { + border-right: none; } -.resourcesMenuContentFeatured { - padding-top: var(--space-16x); - padding-left: var(--space-8x); - padding-bottom: var(--space-16x); - padding-right: var(--space-16x); - background-color: var(--gray-100); +.section header { + border-bottom: 1px solid var(--border); } -.megaMenuLink { +.groupItem { display: flex; align-items: center; - gap: var(--space-2x); -} - -.megaMenuLink h3 { - margin-bottom: 0; + padding: var(--space-6x) var(--space-8x); + gap: var(--space-4x); + text-decoration: none; + transition: background-color 0.2s; } -.megaMenuLink img { - width: var(--space-5x); - height: var(--space-5x); +.groupItem:hover { + background-color: var(--muted); } -.featuredImage { - width: 100%; +.groupItemIcon { + width: 24px; + height: 24px; + flex-shrink: 0; } -.divider { - border-bottom: 1px solid var(--gray-200); - margin: var(--space-8x) auto; -} - -.bottomLinks { - margin-top: auto; +.itemList { display: flex; flex-direction: column; - gap: var(--space-3x); } -.bottomLinks div { - display: flex; - align-items: center; - gap: var(--space-2x); - line-height: var(--space-6x); +.groupItemDescription { + display: -webkit-box; + -webkit-line-clamp: 1; + line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; } -.bottomLinks a { - color: var(--gray-900); +.groupItemTitle { + display: -webkit-box; + -webkit-line-clamp: 1; + line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; + font-size: 18px; + font-weight: 500; } -/* TODO: change with a var when available in the chainlink repo */ -.bottomLink a:hover { - color: #0847f7; +.wrapper.mobile { + border: none; + overflow: unset; + + & .row { + grid-template-columns: 1fr; + border-bottom: none; + } + + & .section header { + border-bottom: 1px solid var(--border); + border-top: 1px solid var(--border); + } + + & .section { + border-right: none; + } + + & .groupItemTitle { + display: block; + -webkit-line-clamp: unset; + line-clamp: unset; + -webkit-box-orient: unset; + overflow: visible; + } + + & .groupItemDescription { + display: block; + -webkit-line-clamp: unset; + line-clamp: unset; + -webkit-box-orient: unset; + overflow: visible; + } } @media screen and (min-width: 768px) { diff --git a/src/components/Header/Nav/ProductNavigation/Desktop/productNavigation.module.css b/src/components/Header/Nav/ProductNavigation/Desktop/productNavigation.module.css index 4057b7ac853..048809c260c 100644 --- a/src/components/Header/Nav/ProductNavigation/Desktop/productNavigation.module.css +++ b/src/components/Header/Nav/ProductNavigation/Desktop/productNavigation.module.css @@ -57,19 +57,6 @@ opacity: 1; } -.megaMenu::after { - content: ""; - position: absolute; - bottom: -35px; - right: 35%; - transform: translateX(-50%) rotate(45deg); - width: 20px; - height: 20px; - z-index: 100; - background-color: white; - padding: var(--space-2x); -} - @media screen and (min-width: 992px) { .root { display: flex; diff --git a/src/components/Header/Nav/ProductNavigation/Mobile/MegaMenu.tsx b/src/components/Header/Nav/ProductNavigation/Mobile/MegaMenu.tsx deleted file mode 100644 index bbab4ffc7ce..00000000000 --- a/src/components/Header/Nav/ProductNavigation/Mobile/MegaMenu.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import styles from "./megaMenu.module.css" -import { Fragment } from "react/jsx-runtime" -import { megaMenuSections } from "../Desktop/MegaMenu.tsx" -import { useState } from "react" - -function MegaMenu() { - return ( - <div className={styles.wrapper}> - <div className={styles.resourcesMenuContentMain}> - {megaMenuSections.map((section) => ( - <div className={styles.resourcesMenuContentRow} key={section.title}> - <h2 className="label">{section.title}</h2> - {section.items?.map((item, index) => ( - <MegaMenuItem - key={index} - image={item.image?.src} - title={item?.title} - description={item.description} - links={item.links} - /> - ))} - </div> - ))} - - <div className={styles.bottomLinks}> - <div className="label"> - <a href="https://dev.chain.link/resources" target="_blank" rel="noopener noreferrer"> - View all resources - </a> - <img src="/images/tabler_arrow-up.svg" alt="" /> - </div> - <div className="label"> - <a href="https://dev.chain.link/products/general" target="_blank" rel="noopener noreferrer"> - Learn about Chainlink - </a> - <img src="/images/tabler_arrow-up.svg" alt="" /> - </div> - </div> - </div> - <div className={styles.resourcesMenuContentFeatured}> - <h2>Featured</h2> - <img src="/images/quick-start.png" alt="" className={styles.featuredImage} /> - <div className={styles.divider}></div> - - <h3>Blockchain 101</h3> - <div className={styles.links}> - <a href="">Docs</a> - <span className={styles.verticalDivider}></span> - <a href="">SDK</a> - </div> - </div> - </div> - ) -} - -function MegaMenuItem({ - image, - title, - description, - links, -}: { - image?: string - title?: string - description?: string - links: { label: string; href?: string }[] -}) { - const [open, setOpen] = useState(false) - return ( - <> - <button className={styles.megaMenuButton} onClick={() => setOpen((state) => !state)}> - <div className={styles.megaMenuLink}> - <img src={image} alt={title} /> - <h3 className="heading-100">{title}</h3> - </div> - <span>{open ? "-" : "+"}</span> - </button> - {open && ( - <div className={styles.links}> - <p className="paragraph-100">{description}</p> - {links.map((link, index) => ( - <Fragment key={index}> - <a href={link.href} className="text-100"> - {link.label} - </a> - {index < links.length - 1 && <span className={styles.verticalDivider}></span>} - </Fragment> - ))} - </div> - )} - </> - ) -} - -export default MegaMenu diff --git a/src/components/Header/Nav/ProductNavigation/Mobile/ProductNavigation.tsx b/src/components/Header/Nav/ProductNavigation/Mobile/ProductNavigation.tsx index dc0f0371d88..dc4df1d6eaf 100644 --- a/src/components/Header/Nav/ProductNavigation/Mobile/ProductNavigation.tsx +++ b/src/components/Header/Nav/ProductNavigation/Mobile/ProductNavigation.tsx @@ -6,7 +6,7 @@ import styles from "./productNavigation.module.css" import { MenuIcon } from "./MenuIcon.tsx" import { BackArrowIcon } from "./BackArrowIcon.tsx" import { CaretRightIcon } from "./CaretRightIcon.tsx" -import MegaMenu from "./MegaMenu.tsx" +import MegaMenu from "../Desktop/MegaMenu.tsx" const Trigger = extendRadixComponent(Dialog.Trigger) const Close = extendRadixComponent(Dialog.Close) @@ -71,14 +71,12 @@ export function ProductNavigation() { className={styles.productContentLink} onClick={() => setProductsSlidePosition("submenu")} data-testid="sub-product-navigation-trigger-mobile" - aria-label="Open Resources submenu" + aria-label="Open Docs submenu" > - Resources + Docs <CaretRightIcon /> </button> - <a href="/" className={styles.productContentLink}> - Docs - </a> + <a href="https://dev.chain.link/demos" className={styles.productContentLink}> Demos </a> @@ -88,7 +86,7 @@ export function ProductNavigation() { <a href="https://dev.chain.link/changelog" className={styles.productContentLink}> Changelog </a> - <a href="https://dev.chain.link/certification" className={styles.productContentLink}> + <a href="/certification" className={styles.productContentLink}> Get Certified </a> </ul> @@ -103,11 +101,11 @@ export function ProductNavigation() { > <BackArrowIcon /> </button> - <span className={styles.subProductContentTitle}>Resources</span> + <span className={styles.subProductContentTitle}>Docs</span> <span></span> {/* Spacer */} </div> <div className={styles.subProductContent}> - <MegaMenu /> + <MegaMenu isMobile /> </div> </div> </div> diff --git a/src/components/Header/Nav/ProductNavigation/Mobile/megaMenu.module.css b/src/components/Header/Nav/ProductNavigation/Mobile/megaMenu.module.css deleted file mode 100644 index cf8382f3d30..00000000000 --- a/src/components/Header/Nav/ProductNavigation/Mobile/megaMenu.module.css +++ /dev/null @@ -1,142 +0,0 @@ -.wrapper { - width: 100%; - border-radius: 0.5rem; - display: flex; - flex-direction: column; - max-height: calc(100vh - 68px); -} - -.wrapper h2 { - padding-bottom: var(--space-3x); - color: var(--gray-500); - text-transform: uppercase; - - border-bottom: 1px solid var(--gray-200); -} - -.wrapper h3 { - font-family: var(--font-family-text); - color: var(--gray-900); -} - -.wrapper p { - color: var(--gray-500); - margin-top: var(--space-2x); - margin-bottom: var(--space-3x); - line-height: var(--space-6x); -} - -.resourcesMenuContentMain { - padding: var(--space-6x) var(--space-8x) var(--space-4x) var(--space-8x); - display: flex; - flex-direction: column; - gap: var(--space-6x); -} - -.resourcesMenuContentRow { - display: flex; - flex-direction: column; -} - -.verticalDivider { - border-left: 1px solid var(--gray-300); - margin: 0 var(--space-3x); -} - -.links { - margin-bottom: var(--space-6x); - margin-left: var(--space-8x); -} - -.links a { - font-weight: var(--font-weight-medium); - color: var(--color-text-link); -} - -.resourcesMenuContentFeatured { - padding-top: var(--space-16x); - padding-left: var(--space-8x); - padding-bottom: var(--space-16x); - padding-right: var(--space-16x); - background-color: var(--gray-100); -} - -.megaMenuButton { - display: flex; - justify-content: space-between; - align-items: center; - padding: var(--space-4x) var(--space-1x); - cursor: pointer; -} - -.megaMenuButton span { - font-size: var(--space-6x); - font-weight: var(--font-weight-medium); - color: var(--gray-500); -} - -.megaMenuLink { - display: flex; - align-items: center; - gap: var(--space-2x); -} - -.megaMenuLink h3 { - margin-bottom: 0; -} - -.megaMenuLink img { - width: var(--space-5x); - height: var(--space-5x); -} - -.featuredImage { - width: 100%; -} - -.divider { - border-bottom: 1px solid var(--gray-200); - margin: var(--space-8x) auto; -} - -.bottomLinks { - padding: var(--space-6x) 0; - display: flex; - flex-direction: column; - gap: var(--space-8x); - border-top: 1px solid var(--gray-200); -} - -.bottomLinks div { - display: flex; - align-items: center; - gap: var(--space-2x); - line-height: var(--space-6x); -} - -.bottomLinks a { - color: var(--gray-900); -} - -/* TODO: change with a var when available in the chainlink repo */ -.bottomLink a:hover { - color: #0847f7; -} - -@media screen and (min-width: 768px) { - .megaMenuContainer { - display: flex; - } -} - -@media screen and (min-width: 1280px) { - .wrapper::before { - left: 31%; - } -} - -@media screen and (min-width: 1565px) { - .wrapper::before { - left: 35%; - } -} diff --git a/src/components/Header/Nav/ProductNavigation/Mobile/productNavigation.module.css b/src/components/Header/Nav/ProductNavigation/Mobile/productNavigation.module.css index 5994b36a9e4..b3bb2b4c22c 100644 --- a/src/components/Header/Nav/ProductNavigation/Mobile/productNavigation.module.css +++ b/src/components/Header/Nav/ProductNavigation/Mobile/productNavigation.module.css @@ -34,6 +34,7 @@ width: 200vw; display: flex; transition: transform 0.3s; + height: 100%; } .main { @@ -71,11 +72,11 @@ overflow: scroll; list-style: none; width: 100vw; - padding-bottom: 56px; } .subProductContent { display: flex; flex-direction: column; + height: 100%; } .subProductContentTitle { diff --git a/src/components/Header/Nav/navBar.module.css b/src/components/Header/Nav/navBar.module.css index 7b8a629ffad..643ac110ed9 100644 --- a/src/components/Header/Nav/navBar.module.css +++ b/src/components/Header/Nav/navBar.module.css @@ -1,11 +1,11 @@ -/* +/* * Navigation bar styles - * + * * The navigation uses a fixed header with blur effect and contains: * 1. Logo section (left) * 2. Menu section (center) * 3. Right section with actions - * + * * Responsive breakpoints: * - Mobile: < 992px * - Desktop: >= 992px @@ -96,7 +96,6 @@ display: flex; justify-content: center; align-items: center; - z-index: 10; } .modalContentWrapper { diff --git a/src/components/Header/NavBar.tsx b/src/components/Header/NavBar.tsx index 404af835727..108ab4c6cd7 100644 --- a/src/components/Header/NavBar.tsx +++ b/src/components/Header/NavBar.tsx @@ -35,13 +35,9 @@ export const NavBar = ({ / - if the page has been scrolled down and the header is hidden / - if the page is a inner doc page or part of the "pathWithoutDocNav" or not */ - const innerDocNavHeight = 56 - let height = (navRef.current as HTMLElement).clientHeight - let baseHeightNoNav = 0 - if (doubleNavbar()) { - height += innerDocNavHeight - baseHeightNoNav += innerDocNavHeight - } + const height = (navRef.current as HTMLElement).clientHeight + const baseHeightNoNav = 0 + const elements = document.body.querySelectorAll("[data-sticky]") elements.forEach((e: HTMLElement) => { if (!e.classList.contains(styles.animateTop)) { diff --git a/src/components/JourneyCards/JourneyCards.astro b/src/components/JourneyCards/JourneyCards.astro new file mode 100644 index 00000000000..39e85bdf1b5 --- /dev/null +++ b/src/components/JourneyCards/JourneyCards.astro @@ -0,0 +1,258 @@ +--- +import { Tag, Typography } from "@chainlink/blocks" +import { JourneyTabGrid } from "./JourneyTabGrid" + +const columns = [ + { + title: "Learn & Explore", + items: [ + { + title: "Explore Cross-Chain Interoperability with CCIP", + description: "Learn cross-chain concepts, workflows, and real-world use cases.", + badge: "ccip", + href: "/", + }, + { + title: "Understand How Data Feeds Power dApps", + description: "See how oracle data feeds deliver price feeds and reference data.", + badge: "data feeds", + href: "/", + }, + { + title: "Learn How Data Streams Deliver Real-Time Data", + description: "Understand how low-latency streams support time-sensitive applications.", + badge: "data streams", + href: "/", + }, + { + title: "Discover Off-Chain Compute with Functions", + description: "Learn how Functions connect smart contracts to APIs and custom logic.", + badge: "functions", + href: "/", + }, + ], + }, + { + title: "Build & Integrate", + items: [ + { + title: "Build Cross-Chain Apps with CCIP Tutorials", + description: "Follow step-by-step guides with language switching (EVM, Rust, Move, etc.).", + badge: "ccip", + href: "/", + }, + { + title: "Integrate Data Feeds into Smart Contracts", + description: "Plug feeds into your apps with examples and addresses.", + badge: "data feeds", + href: "/", + }, + { + title: "Implement Real-Time Use Cases with Data Streams", + description: "Use low-latency data in trading, gaming, and other live applications.", + badge: "data streams", + href: "/", + }, + { + title: "Connect Contracts to APIs with Functions", + description: "Add external data and custom logic to your dApps.", + badge: "functions", + href: "/", + }, + ], + }, + { + title: "Operate & Scale", + items: [ + { + title: "Monitor CCIP Transactions in Real Time", + description: "Track the progress and status of cross-chain transactions.", + badge: "ccip", + href: "/", + }, + { + title: "Stay Up to Date with Data Feeds", + description: "Rely on changelogs and schema updates for accuracy.", + badge: "data feeds", + href: "/", + }, + { + title: "Deliver Reliable Low-Latency Data with Streams", + description: "Operate Data Streams at scale for critical, time-sensitive use cases.", + badge: "data streams", + href: "/", + }, + { + title: "Scale and Optimize Functions", + description: "Debug, manage workloads, and grow your applications.", + badge: "functions", + href: "/", + }, + ], + }, +] + +// Transform columns to tabs format for JourneyTabGrid +const tabs = columns.map((column) => ({ + name: column.title, + items: column.items.map((item) => ({ + title: item.title, + description: item.description, + link: item.href, + badge: item.badge, + })), +})) +--- + +<section> + <section class="desktop"> + <Typography variant="h4" className="section-title">Start your Chainlink journey</Typography> + <div class="journey-cards"> + { + columns.map((column) => ( + <div class="journey-column"> + <header class="column-header"> + <Typography variant="h5" className="column-title"> + {column.title} + </Typography> + </header> + {column.items.map((item) => ( + <a href={item.href} class="journey-card"> + <div class="card-content"> + <Typography variant="body-semi">{item.title}</Typography> + <Typography variant="body-s" color="muted"> + {item.description} + </Typography> + </div> + + <footer class="journey-footer"> + <Tag size="sm" className="footer-tag"> + <Typography variant="code-s">{item.badge}</Typography> + </Tag> + <img src="/assets/icons/upper-right-arrow.svg" class="footer-icon" /> + </footer> + </a> + ))} + </div> + )) + } + </div> + </section> + <section class="mobile"> + <JourneyTabGrid header="Start your Chainlink journey" tabs={tabs} client:only="react" /> + </section> +</section> + +<style> + .desktop { + display: none; + } + + .mobile { + display: block; + } + + .journey-cards { + display: grid; + grid-template-columns: repeat(3, 1fr); + } + + .journey-column { + display: flex; + flex-direction: column; + border-left: 1px solid var(--border); + } + + .journey-card { + gap: var(--space-6x); + padding: var(--space-6x); + } + + .footer-tag { + text-transform: uppercase; + } + + .journey-card:hover { + background-color: var(--muted); + + .footer-tag { + background-color: var(--background) !important; + } + + .footer-icon { + opacity: 1; + } + } + + .card-content { + display: flex; + flex-direction: column; + gap: var(--space-2x); + margin-bottom: var(--space-8x); + } + + .journey-footer { + display: flex; + align-items: center; + justify-content: space-between; + } + + .section-title { + font-size: 28px; + margin-bottom: var(--space-10x); + } + + .footer { + padding-top: var(--space-1x); + } + .footer-icon { + height: 12px; + width: 12px; + opacity: 0; + } + + .card-badge { + display: inline-flex; + align-items: center; + padding: var(--space-1x) var(--space-2x); + background-color: var(--gray-100); + border-radius: 4px; + font-size: 11px; + font-weight: 500; + text-transform: uppercase; + color: var(--gray-600); + letter-spacing: 0.5px; + align-self: flex-start; + } + + .column-header { + padding: var(--space-2x) var(--space-6x); + border-left: 3px solid var(--brand); + } + + @media (min-width: 769px) { + .desktop { + display: block; + } + + .mobile { + display: none; + } + + .column-title { + font-size: 22px; + line-height: 26px; + } + + .journey-card h4 { + font-size: 16px; + line-height: 22px; + } + } + + @media screen and (min-width: 62em) { + .section-title { + font-size: 32px; + } + } +</style> diff --git a/src/components/JourneyCards/JourneyTabGrid.module.css b/src/components/JourneyCards/JourneyTabGrid.module.css new file mode 100644 index 00000000000..39bc9c5012e --- /dev/null +++ b/src/components/JourneyCards/JourneyTabGrid.module.css @@ -0,0 +1,124 @@ +/* Tab styling - copied from TabGrid */ +.gridHeader { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--space-8x); + flex-wrap: wrap; + gap: var(--space-8x); +} + +.tabsTrigger { + height: 32px; + padding: var(--space-1x) var(--space-2x); + justify-content: center; + align-items: center; + border-radius: var(--space-2x); + background-color: var(--pill); + border: 1px solid var(--pill-border); +} + +.tabsTrigger:hover { + background-color: var(--pill-hover); +} + +.tabsTrigger[data-state="active"] { + background-color: var(--pill-active); + border-color: var(--pill-active); + border-bottom: 1px solid var(--pill-active); + + & h3 { + color: var(--pill-active-foreground); + } +} + +.tabTitle { + color: var(--pill-foreground); + font-weight: 400; +} + +.tabsList { + display: flex; + gap: var(--space-2x); + border-bottom: 0; + flex-wrap: wrap; + justify-content: start !important; +} + +.journeyGrid { + display: grid; + grid-template-columns: 1fr; + border-left: 1px solid var(--border); + border-top: 1px solid var(--border); +} + +.journeyCard { + display: flex; + flex-direction: column; + gap: var(--space-6x); + padding: var(--space-6x); + border-right: 1px solid var(--border); + border-bottom: 1px solid var(--border); +} + +.journeyCard:hover { + background-color: var(--muted); + + .footerTag { + background-color: var(--background); + } + + .footerIcon { + opacity: 1; + } +} + +.cardContent { + display: flex; + flex-direction: column; + gap: var(--space-2x); +} + +.journeyFooter { + display: flex; + align-items: center; + justify-content: space-between; + margin-top: auto; + flex: 1; + width: 100%; +} + +.footerIcon { + height: 12px; + width: 12px; + opacity: 0; +} + +.footerTag { + text-transform: uppercase; +} + +@media (max-width: 768px) { + .journeyGrid { + grid-template-columns: repeat(2, 1fr); + } + .gridHeader > h2 { + font-size: 28px; + } +} + +@media screen and (max-width: 425px) { + .journeyGrid { + grid-template-columns: 1fr; + } + .gridHeader { + margin-bottom: var(--space-6x); + } +} + +@media screen and (max-width: 390px) { + .gridHeader { + flex-direction: column; + align-items: start; + } +} diff --git a/src/components/JourneyCards/JourneyTabGrid.tsx b/src/components/JourneyCards/JourneyTabGrid.tsx new file mode 100644 index 00000000000..ab44a3b0fba --- /dev/null +++ b/src/components/JourneyCards/JourneyTabGrid.tsx @@ -0,0 +1,71 @@ +import styles from "./JourneyTabGrid.module.css" +import { Tabs, TabsContent, TabsList, TabsTrigger, Typography, Tag } from "@chainlink/blocks" + +export interface JourneyItem { + title: string + description: string + link: string + badge?: string +} + +export interface JourneyTab { + name: string + items: JourneyItem[] +} + +interface JourneyTabGridProps { + tabs: JourneyTab[] + header: string +} + +export const JourneyTabGrid = ({ tabs, header }: JourneyTabGridProps) => { + return ( + <Tabs defaultValue={tabs[0].name} className={styles.tabGridWrapper}> + <header className={styles.gridHeader}> + <Typography + variant="h2" + style={{ + fontSize: "32px", + }} + > + {header} + </Typography> + <TabsList className={styles.tabsList}> + {tabs.map((tab) => ( + <TabsTrigger key={tab.name} value={tab.name} className={styles.tabsTrigger}> + <h3 className={styles.tabTitle}>{tab.name}</h3> + </TabsTrigger> + ))} + </TabsList> + </header> + + {tabs.map((tab) => ( + <TabsContent key={tab.name} value={tab.name}> + <div className={styles.gridContent}> + <div className={styles.journeyGrid}> + {tab.items.map((item, index) => ( + <a key={`${item.title}-${index}`} href={item.link} className={styles.journeyCard}> + <div className={styles.cardContent}> + <Typography variant="body-semi">{item.title}</Typography> + <Typography variant="body-s" color="muted"> + {item.description} + </Typography> + </div> + + <footer className={styles.journeyFooter}> + {item.badge && ( + <Tag size="sm" className={styles.footerTag}> + <Typography variant="code-s">{item.badge}</Typography> + </Tag> + )} + <img src="/assets/icons/upper-right-arrow.svg" className={styles.footerIcon} alt="" /> + </footer> + </a> + ))} + </div> + </div> + </TabsContent> + ))} + </Tabs> + ) +} diff --git a/src/components/LandingHero/LandingHero.astro b/src/components/LandingHero/LandingHero.astro new file mode 100644 index 00000000000..4303beed5ea --- /dev/null +++ b/src/components/LandingHero/LandingHero.astro @@ -0,0 +1,21 @@ +--- +import { Typography } from "@chainlink/blocks" +import MegaMenu from "../Header/Nav/ProductNavigation/Desktop/MegaMenu" +import styles from "./landingHero.module.css" +--- + +<section class={styles.wrapper}> + <div class={styles.content}> + <Typography variant="h1" className={styles.title}>Explore docs & resources</Typography> + <section class={styles.menu}> + <MegaMenu client:only="react" /> + </section> + </div> + + <div class={styles.backgrounds}> + <div class={styles.heroLeft}><img src="/images/hero-dotted.png" alt="" class={styles.heroDotted} /></div> + <div class={styles.heroRight}> + <img src="/images/hero-1.png" alt="" class={styles.heroImage} /> + </div> + </div> +</section> diff --git a/src/components/LandingHero/landingHero.module.css b/src/components/LandingHero/landingHero.module.css new file mode 100644 index 00000000000..c7a64507745 --- /dev/null +++ b/src/components/LandingHero/landingHero.module.css @@ -0,0 +1,69 @@ +.content { + padding: var(--space-16x); + max-width: 1440px; + width: 100%; + margin: 0 auto; + position: absolute; + inset: 0; + z-index: 5; +} + +.backgrounds { + display: flex; + height: 100%; +} + +.title { + font-weight: 400; + margin-bottom: var(--space-8x); +} + +.wrapper { + background-color: var(--muted); + position: relative; + inset: 0; + height: 746px; +} + +.heroImage { + width: 100%; + height: 100%; + object-fit: cover; +} + +.heroDotted { + width: 100%; + object-fit: cover; +} +.heroLeft { + display: flex; + align-items: end; +} + +.heroRight, +.heroLeft { + width: 50%; + height: 100%; +} + +@media screen and (max-width: 991px) { + .wrapper { + background-color: transparent; + height: auto; + padding: 36px var(--space-10x); + } + .backgrounds, + .content .menu { + display: none; + } + + .content { + position: unset; + padding: 0; + } + + .title { + font-size: 40px; + margin-bottom: 0; + } +} diff --git a/src/components/LayoutHero/LayoutHero.astro b/src/components/LayoutHero/LayoutHero.astro new file mode 100644 index 00000000000..ee95ce616f9 --- /dev/null +++ b/src/components/LayoutHero/LayoutHero.astro @@ -0,0 +1,45 @@ +--- +import { buttonVariants, Typography } from "@chainlink/blocks" +import styles from "./LayoutHero.module.css" + +interface Props { + title: string + description: string + buttons: Array<{ + label: string + link: string + }> + image: string +} + +const { title, description, buttons = [], image } = Astro.props as Props +--- + +<section class={styles.layoutHero}> + <div class={styles.heroContentWrapper}> + <div class={styles.heroContent}> + <h2 class={styles.heroTitle}>{title}</h2> + <Typography variant="body-s" color="muted">{description}</Typography> + <div class={styles.heroButtons}> + { + buttons.map((button, index) => ( + <a + href={button.link} + class={buttonVariants({ + variant: index === 0 ? "primary" : "tertiary", + size: "sm", + })} + > + {button.label} + </a> + )) + } + </div> + </div> + <div class={styles.heroImage}> + <img src={image} alt={title} /> + </div> + </div> + + <img class={styles.heroBackgroundImg} src="/images/ccip/ccip-hero-bg.png" /> +</section> diff --git a/src/components/LayoutHero/LayoutHero.module.css b/src/components/LayoutHero/LayoutHero.module.css new file mode 100644 index 00000000000..08edb61ed40 --- /dev/null +++ b/src/components/LayoutHero/LayoutHero.module.css @@ -0,0 +1,99 @@ +.layoutHero { + display: flex; + flex-direction: column; + gap: var(--space-8x); + margin: 0 auto; + background-color: var(--gray-100); + position: relative; + width: 100%; + height: 345px; + border-left: 1px solid var(--border); + border-right: 1px solid var(--border); + border-bottom: 1px solid var(--border); +} + +.heroContent { + display: flex; + flex-direction: column; + padding-left: 55px; + width: 100%; + height: 100%; + justify-content: center; + max-width: 540px; +} + +.heroContentWrapper { + display: flex; + position: relative; + z-index: 2; + width: 100%; + height: 100%; +} + +.heroBackgroundImg { + position: absolute; + right: 0; + z-index: 1; +} +.heroTitle { + font-size: 3rem; + line-height: 50px; + color: var(--gray-950); + margin-bottom: var(--space-3x); + letter-spacing: -0.48px; + font-weight: 400; +} + +.heroButtons { + display: flex; + + gap: var(--space-4x); + margin-top: var(--space-8x); +} + +.heroImage { + display: flex; + position: absolute; + bottom: 35px; + right: 0; +} + +.heroImage img { + max-width: 100%; + height: auto; +} + +@media screen and (max-width: 425px) { + .layoutHero { + height: auto; + padding: var(--space-8x) 0; + } +} + +/* lesser values cause overlapping of elements */ +@media screen and (max-width: 1400px) { + .layoutHero { + border: none; + background-color: transparent; + } + .heroImage, + .heroBackgroundImg { + display: none; + } + + .heroContent { + padding-left: 0; + } + + .heroButtons { + margin-top: var(--space-6x); + } + + .heroButtons a { + width: fit-content; + } + + .heroTitle { + font-size: 40px; + } +} diff --git a/src/components/LayoutHero/README.md b/src/components/LayoutHero/README.md new file mode 100644 index 00000000000..fcc0c16e4d0 --- /dev/null +++ b/src/components/LayoutHero/README.md @@ -0,0 +1,84 @@ +# LayoutHero Component + +## What is it? + +The LayoutHero component is a reusable hero section that displays a title, description, call-to-action buttons, and an optional image. It's perfect for landing pages or the top of important pages where you want to grab attention and guide users to take action. + +## How to Use It + +### Basic Usage + +To use the LayoutHero component in your page, you'll need to import it and provide some information: + +```astro +--- +import { LayoutHero } from "@components" +--- + +<LayoutHero + title="Welcome to Our Documentation" + description="Learn how to build amazing applications with our platform" + buttons={[ + { label: "Get Started", link: "/quickstart" }, + { label: "View Documentation", link: "/docs" }, + ]} + image="/images/hero-image.png" +/> +``` + +### What Each Part Does + +**title** (Required) + +- This is the main heading that appears at the top +- Make it clear and attention-grabbing +- Example: "Welcome to Chainlink Docs" + +**description** (Required) + +- A short paragraph explaining what this page or section is about +- Keep it concise but informative +- Example: "Learn how to connect your smart contracts to real-world data" + +**buttons** (Required) + +- An array of buttons that link to other pages +- Each button needs two things: + - `label`: The text shown on the button + - `link`: Where the button takes you when clicked +- The first button will be blue (primary action) +- The second button will be white (secondary action) +- You can have 0, 1, or 2 buttons + +**image** (Required) + +- The path to an image file you want to display +- The image appears on the right side on larger screens +- Below the text on mobile devices +- Example: "/images/my-hero-image.png" + +## Examples + +### With Only One Button + +```astro +<LayoutHero + title="Start Building Today" + description="Get started with our comprehensive guides and tutorials" + buttons={[{ label: "Get Started", link: "/quickstart" }]} +/> +``` + +### With Image and Two Buttons + +```astro +<LayoutHero + title="CCIP Cross-Chain Protocol" + description="Send tokens and messages across blockchains securely and reliably" + buttons={[ + { label: "Try CCIP", link: "/ccip/getting-started" }, + { label: "Learn More", link: "/ccip/concepts" }, + ]} + image="/images/ccip-hero.png" +/> +``` diff --git a/src/components/LeftSidebar/LeftSidebar.astro b/src/components/LeftSidebar/LeftSidebar.astro index 78f691d9717..cc9512fba67 100644 --- a/src/components/LeftSidebar/LeftSidebar.astro +++ b/src/components/LeftSidebar/LeftSidebar.astro @@ -6,9 +6,9 @@ import RecursiveSidebar from "./RecursiveSidebar.astro" import { LanguageSwitcherDropdown } from "~/components/LanguageSwitcherDropdown" import { ChainTypeSelector } from "~/components/ChainSelector" import { isChainAwareSection } from "~/config/chainTypes" -import { filterContentByChainType } from "~/utils/chainType" -import type { ChainType } from "~/config/types" import styles from "./leftSidebar.module.css" +import DocsHeaderTitle from "../DocsHeaderTitle/DocsHeaderTitle.astro" +import * as CONFIG from "../../config" type SectionEntryWithParent = SectionEntry & { parentSection?: string } @@ -82,7 +82,8 @@ function removeSlashes(url: string): string { const sidebarSections = getSidebarSections(section) --- -<nav aria-labelledby="grid-left" class={styles.nav}> +<nav aria-labelledby="grid-left" class={styles.nav} data-sticky> + <DocsHeaderTitle pathname={currentPage} /> { section === "cre" && ( <div class={styles.languageSwitcherTablet}> @@ -91,7 +92,7 @@ const sidebarSections = getSidebarSections(section) ) } {showChainSelector && <ChainTypeSelector client:only="react" />} - <ul class={styles.navGroups} data-sticky> + <ul class={styles.navGroups}> { sidebarSections.map((group) => ( <li @@ -107,6 +108,39 @@ const sidebarSections = getSidebarSections(section) </li> )) } + <div class={styles.quickLinks}> + <li class={styles.headerLink}> + <a href="/builders-quick-links" target="_blank" id="quick-links-sidebar-link"> + <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path + d="M2.5 9.20055L7.18129 2H12.2965L9.62194 5.59959H13.5L5.97787 14H4.50671L7.18135 9.20055H2.5Z" + fill="#0D5DFF"></path> + </svg> + <p>Quick links</p> + </a> + </li> + <li class={styles.headerLink}> + <a + class={styles.link} + href="https://github.com/smartcontractkit/documentation" + target="_blank" + rel="noopener noreferrer" + > + <img height={16} width={16} src="/assets/icons/github-blue.svg" alt="GitHub repository" /> + <span>Github</span> + </a> + </li> + { + CONFIG.COMMUNITY_INVITE_URL && ( + <li class={styles.headerLink}> + <a href={CONFIG.COMMUNITY_INVITE_URL} target="_blank" rel="noopener noreferrer"> + <img src="/images/discord.svg" loading="lazy" width="16" height="16" alt="Discord" /> + <span>Join our community</span> + </a> + </li> + ) + } + </div> </ul> </nav> diff --git a/src/components/LeftSidebar/leftSidebar.module.css b/src/components/LeftSidebar/leftSidebar.module.css index 9299511f69d..724ee84735c 100644 --- a/src/components/LeftSidebar/leftSidebar.module.css +++ b/src/components/LeftSidebar/leftSidebar.module.css @@ -8,8 +8,9 @@ } .navGroups { - padding: var(--doc-padding) var(--space-8x) var(--doc-padding) 0; - height: 100%; + padding: 0 var(--space-10x) var(--space-10x) 0; + height: calc(100vh - var(--space-16x) - var(--space-16x)); /* Subtract header and footer height */ + overflow-y: auto; scrollbar-width: thin; scrollbar-color: var(--gray-300) transparent; @@ -47,8 +48,7 @@ .navGroupTitle { margin-bottom: var(--space-2x); margin-top: var(--space-1x); - color: var(--gray-900); - font-weight: 600; + color: var(--muted-foreground); line-height: 24px; font-size: 15px; display: flex; @@ -57,10 +57,9 @@ cursor: pointer; list-style: none; position: relative; - padding-left: var(--space-6x); } -.navGroupTitle::before { +.navGroupTitle::after { content: ""; width: 6px; height: 6px; @@ -71,21 +70,16 @@ transition: transform 0.15s ease; position: absolute; top: calc(50% - 4px); - left: var(--space-2x); + right: var(--space-2x); } -details[open] > .navGroupTitle::before { +details[open] > .navGroupTitle::after { transform: rotate(45deg); top: calc(50% - 5px); } -details:hover .navGroupTitle::before { - border-color: var(--color-text-link); -} - .navGroupEntries { margin-bottom: 0; - padding-left: var(--space-6x); } details { @@ -113,9 +107,68 @@ details[open] > .navGroupTitle { color: hsla(var(--color-base-white), 100%, 1); } +.link { + display: flex; + align-items: center; + padding: var(--space-3x) var(--space-2x); + gap: var(--space-2x); + margin-right: var(--space-2x); + + color: var(--gray-900, #141921); + font-weight: 600; + line-height: 24px; /* 150% */ +} + +.quickLinks { + margin-top: 60px; + display: flex; + flex-direction: column; + gap: var(--space-2x); +} + +.headerLink { + font-size: 14px; + color: var(--color-text-link); + padding: var(--space-1x) var(--space-2x); +} + +.headerLink * { + margin: 0; + max-width: 100%; + color: inherit; + font: inherit; +} + +.headerLink.active, +.headerLink:hover, +.headerLink:focus { + color: var(--theme-accent); + fill: var(--theme-accent); +} + +.headerLink:focus-within { + color: var(--theme-text-light); + fill: var(--theme-text-light); +} + +.headerLink a { + display: inline-flex; + gap: var(--space-2x); + width: 100%; + padding: 0.15em 0 0.15em 0; + text-decoration: none; +} + +.headerLink { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.25rem; +} + /* Language Switcher for tablet screens (800px-1200px) */ .languageSwitcherTablet { - padding: var(--space-6x) var(--space-6x) 0 var(--space-6x); + padding: var(--space-6x) 0; display: none; } diff --git a/src/components/LeftSidebar/recursiveSidebar.module.css b/src/components/LeftSidebar/recursiveSidebar.module.css index 31a33633647..ca7720c2278 100644 --- a/src/components/LeftSidebar/recursiveSidebar.module.css +++ b/src/components/LeftSidebar/recursiveSidebar.module.css @@ -10,11 +10,13 @@ gap: var(--space-2x); line-height: 1.4; font-size: 14px; - color: var(--gray-500, #858a95); + color: var(--muted-foreground); padding: var(--space-2x) var(--space-6x) var(--space-2x) var(--space-4x); transition: color 100ms ease-in; - border-radius: 4px; - margin-right: var(--space-2x); + border-left: 1px solid var(--border); + + padding-right: var(--space-2x); + margin-bottom: 0; position: relative; } @@ -39,7 +41,7 @@ details summary.navLink.nested a { details summary.navLink:has(a.active), details summary.navLink:has(a[aria-current="page"]), details summary.navLink.active { - color: var(--color-text-link); + color: var(--foreground); } .navLink:hover, @@ -47,15 +49,19 @@ details summary.navLink.active { details summary.navLink:hover, details summary.navLink:focus { text-decoration: none; + background-color: var(--muted); + + color: var(--muted-foreground); } .navLink[aria-current="page"], details summary.navLink:has(a[aria-current="page"]), details summary.navLink.active, details summary.navLink:has(a.active) { - font-weight: 600; - background-color: rgba(28, 100, 242, 0.08); - color: var(--color-text-link); + color: var(--foreground); + border-left: 2px solid var(--brand); + font-weight: 500; + background-color: var(--muted); } .navLink.nested { @@ -75,14 +81,15 @@ details summary.navLink a { margin: 0; } -details summary.navLink:hover a { - color: var(--color-text-link); +details summary.navLink:hover { + background-color: var(--muted); + color: var(--muted-foreground); } details summary.navLink a.active, details summary.navLink a[aria-current="page"] { - font-weight: 600; - color: var(--color-text-link); + font-weight: 500; + color: var(--foreground); } .navGroupEntries { @@ -109,9 +116,6 @@ details summary.navLink a[aria-current="page"] { .navGroupEntries.nested { margin-left: 0; - margin-top: var(--space-1x); - padding-left: var(--space-4x); - margin-bottom: var(--space-1x); position: relative; } @@ -125,6 +129,10 @@ details summary.navLink a[aria-current="page"] { background-color: var(--gray-200); } +.navGroupEntries.nested .navLink { + padding-left: 28px; +} + details summary::-webkit-details-marker { display: none; } @@ -139,7 +147,7 @@ details > summary.navLink { padding-left: var(--space-4x); } -details > summary.navLink::before { +details > summary.navLink::after { content: ""; width: 6px; height: 6px; @@ -150,14 +158,18 @@ details > summary.navLink::before { transition: transform 0.15s ease; position: absolute; top: calc(50% - 4px); - left: 0; + right: var(--space-2x); } -details[open] > summary.navLink::before { +details[open] > summary.navLink::after { transform: rotate(45deg); top: calc(50% - 5px); } -details:hover > summary.navLink::before { - border-color: var(--color-text-link); +.container ul { + overflow-y: auto; + padding: var(--space-4x); + line-height: 1.5; + list-style-type: none; + word-break: break-word; } diff --git a/src/components/MediaSection/MediaSection.astro b/src/components/MediaSection/MediaSection.astro new file mode 100644 index 00000000000..6189f9326e7 --- /dev/null +++ b/src/components/MediaSection/MediaSection.astro @@ -0,0 +1,46 @@ +--- +import { Typography } from "@chainlink/blocks" +import styles from "./MediaSection.module.css" + +interface Props { + heading: string + description: string + image?: string + video?: string +} + +const { heading, description, image, video } = Astro.props +--- + +<section class={styles.section}> + <div class={styles.textContent}> + <Typography + variant="h2" + style={{ + fontSize: "32px", + }}>{heading}</Typography + > + <Typography variant="body" color="muted"> + {description} + </Typography> + </div> + + { + image && ( + <div class={styles.mediaWrapper}> + <img src={image} alt={heading} class={styles.media} /> + </div> + ) + } + + { + !image && video && ( + <div class={styles.mediaWrapper}> + <video class={styles.media} controls> + <source src={video} type="video/mp4" /> + Your browser does not support the video tag. + </video> + </div> + ) + } +</section> diff --git a/src/components/MediaSection/MediaSection.module.css b/src/components/MediaSection/MediaSection.module.css new file mode 100644 index 00000000000..f7c5673f5a8 --- /dev/null +++ b/src/components/MediaSection/MediaSection.module.css @@ -0,0 +1,25 @@ +.section { + display: flex; + flex-direction: column; + gap: var(--space-8x); +} + +.textContent { + display: flex; + flex-direction: column; + gap: var(--space-6x); +} + +.mediaWrapper { + width: 100%; + display: flex; + justify-content: center; + align-items: center; +} + +.media { + width: 100%; + max-width: 100%; + height: auto; + border-radius: var(--space-2x); +} diff --git a/src/components/MediaSection/README.md b/src/components/MediaSection/README.md new file mode 100644 index 00000000000..c03ad7205c6 --- /dev/null +++ b/src/components/MediaSection/README.md @@ -0,0 +1,44 @@ +# MediaSection Component + +## What it does + +The MediaSection component displays a section with a heading, description, and optionally an image or video. It's perfect for explaining concepts with visual aids, like showing architecture diagrams or tutorial videos. + +## How to use it + +Import the component and add it to your page with the content you want to display: + +```astro +import MediaSection from "~/components/MediaSection/MediaSection.astro" + +<MediaSection + heading="Your Section Title" + description="A description explaining what this section is about." + image="/path/to/your/image.png" +/> +``` + +## Props explained + +- **heading** (required) - The title of your section +- **description** (required) - A paragraph explaining the section content +- **image** (optional) - Path to an image file you want to display +- **video** (optional) - Path to a video file you want to display + +**Note:** You can provide either an image OR a video, not both. If you include both, only the image will show. + +## Example + +```astro +<MediaSection + heading="High-level architecture" + description="CCIP delivers cross-chain messages from a source chain to a destination chain by combining offchain consensus and onchain execution components." + image="/images/architecture.png" +/> +``` + +This will display: + +1. A heading that says "High-level architecture" +2. The description text below it +3. The architecture diagram image at the bottom diff --git a/src/components/OverviewWrapper.astro b/src/components/OverviewWrapper.astro new file mode 100644 index 00000000000..e3eaef0fa90 --- /dev/null +++ b/src/components/OverviewWrapper.astro @@ -0,0 +1,20 @@ +<section class="overflow-wrapper"> + <slot /> +</section> + +<style> + .overflow-wrapper { + display: flex; + flex-direction: column; + width: 100%; + gap: 82px; + padding-top: 56px; + } + + @media screen and (max-width: 425px) { + .overflow-wrapper { + gap: 36px; + padding-top: 0; + } + } +</style> diff --git a/src/components/PageContent/PageContent.astro b/src/components/PageContent/PageContent.astro index 5e5689abf6b..e29180351b4 100644 --- a/src/components/PageContent/PageContent.astro +++ b/src/components/PageContent/PageContent.astro @@ -1,190 +1,224 @@ --- import { MarkdownHeading } from "astro" -import BackButton from "./BackButton.astro" export type Props = { titleHeading: MarkdownHeading + disableDefaultStyles?: boolean + hideTitle?: boolean } -const { titleHeading } = Astro.props +const { titleHeading, disableDefaultStyles, hideTitle } = Astro.props --- -<article id="article"> - <h1 id={titleHeading.slug}>{titleHeading.text}</h1> +<article id="article" data-disable-default-styles={disableDefaultStyles || undefined}> + <h1 id={titleHeading.slug} class:list={{ "sr-only": hideTitle }}>{titleHeading.text}</h1> + <slot /> </article> <style is:inline> - article :is(h1, h2, h3, h4, h5, h6) > a { - display: inline-block; - color: inherit; - width: 100%; - } - - article astro-slot > :first-child { - margin-top: 0; + /* Screen reader only - visually hidden but accessible */ + .sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } /* Using padding instead of margin so intersection observers work without spaces */ - :where(article, astro-island, astro-slot) > section { + :where(article:not([data-disable-default-styles]), astro-island, astro-slot) > section { padding-top: var(--space-5x); } - /* - This is a bit of trickery that keeps the content - from shifting in the time between the DOM hydrating and the - wrapper script finishing. The margin is supplemented - by the section padding once the wrapper is created - - This also keeps the spacing intact - in case JS isn't loading on the page - */ - article > :where(h1, h2) { - margin-top: var(--space-5x) !important; - } - - article * { - max-width: 100%; - margin-bottom: 0; - } - - article :is(h1, h2, h3, h4, h5, h6, p, li) { - word-break: break-word; - } - - article p { - margin-bottom: 0; - } - - article :is(p, li) { - line-height: 28px; - } - - article label { - display: flex; - align-items: center; - gap: var(--space-2x); - } + /* Default content styles - opt-out with disableDefaultStyles prop for custom layouts like ccip/index.mdx */ + article:not([data-disable-default-styles]) { + :is(h1, h2, h3, h4, h5, h6) > a { + display: inline-block; + color: inherit; + width: 100%; + } - :where(article, article section, article astro-slot, article astro-island) > :not(section, astro-slot, astro-island) { - margin-top: var(--space-5x); - } + astro-slot > :first-child { + margin-top: 0; + } - :where(article, article section, article astro-slot, article astro-island) > pre { - margin-top: var(--space-2x); - } + /* + This is a bit of trickery that keeps the content + from shifting in the time between the DOM hydrating and the + wrapper script finishing. The margin is supplemented + by the section padding once the wrapper is created + + This also keeps the spacing intact + in case JS isn't loading on the page + */ + > :where(h1, h2) { + margin-top: var(--space-5x) !important; + } - :where(article, article section) > :is(h1, h2, h3) + :not(section, astro-slot, astro-island, h5, h6) { - margin-top: var(--space-5x) !important; - } + * { + max-width: 100%; + margin-bottom: 0; + } - :where(article, article section) > :is(h4, h5, h6) + :not(section, astro-slot, astro-island) { - margin-top: var(--space-3x) !important; - } + a:not(:is(h1 a, h2 a, h3 a, h4 a, h5 a, h6 a)) { + color: var(--color-text-link); + } - :where(article, article section, article astro-slot) > :is(h1, h2, h3, h4, h5, h6, li) { - margin-top: 0; - } + :is(h1, h2, h3, h4, h5, h6, p, li) { + word-break: break-word; + } - :where(article, article section, article astro-slot) > h1 { - font-size: 32px; - } + p { + margin-bottom: 0; + } - :where(article, article section, article astro-slot) > h2 { - padding-top: var(--space-6x); - font-size: 28px; - } + :is(p, li) { + line-height: 28px; + } - :where(article, article section, article astro-slot) > h3 { - padding-top: var(--space-8x); - font-size: 24px; - } + label { + display: flex; + align-items: center; + gap: var(--space-2x); + } - :where(article, article section, article astro-slot) > h4 { - padding-top: var(--space-5x); - font-size: 20px; - } + :is(ul, ol) { + margin-top: var(--space-3x); - :where(article, article section, article astro-slot) > :is(h5, h6) { - padding-top: var(--space-4x); - font-size: 16px; - } + > li, + > li > :is(ul, ol) { + margin-top: var(--space-2x); + } + } - article :is(ul, ol) { - margin-top: var(--space-3x); - } + li { + list-style-type: disc; - article :is(ul, ol) > li, - article :is(ul, ol) > li > :is(ul, ol) { - margin-top: var(--space-2x); - } + > * { + margin-top: var(--space-2x); + } - article li > * { - margin-top: var(--space-2x); - } + /* Offset line-height difference */ + > :not(p):last-child { + margin-bottom: var(--space-3x); + } + } - article ul { - padding-left: calc(var(--space-4x) + 2px); - } + ul { + padding-left: calc(var(--space-4x) + 2px); + } - article ol { - padding-left: var(--space-8x); - } + ol { + padding-left: var(--space-8x); + } - /* Offset line-height difference */ - article li > :not(p):last-child { - margin-bottom: var(--space-3x); - } + ::marker { + font-weight: bold; + color: var(--theme-text-light); + } - article ::marker { - font-weight: bold; - color: var(--theme-text-light); - } + iframe { + width: 100%; + height: auto; + aspect-ratio: 16 / 9; + } - article iframe { - width: 100%; - height: auto; - aspect-ratio: 16 / 9; - } + /* Offsets padding */ + :is(section, h5, h6):target { + scroll-margin-top: var(--theme-navbar-height); + } - /* Offsets padding */ - article :is(section, h5, h6):target { - scroll-margin-top: var(--theme-navbar-height); - } + /* Shared styles for article, section, and astro-slot contexts */ + :where(&, & section, & astro-slot, & astro-island) { + > :not(section, astro-slot, astro-island) { + margin-top: var(--space-5x); + } - @media (min-width: 50em) { - :where(article, article section, article astro-slot) > :is(h1, h2) { - position: sticky; - top: 0; - z-index: 3; - background: white; - border-bottom: 2px solid var(--blue-200, #dfe7fb); - padding: var(--space-6x) 0; + > pre { + margin-top: var(--space-2x); + } } - article section > :is(section, h5, h6):target { - scroll-margin-top: calc(var(--theme-navbar-height) + var(--space-20x)); - } + :where(&, & section) { + > :is(h1, h2, h3) + :not(section, astro-slot, astro-island, h5, h6) { + margin-top: var(--space-5x) !important; + } - :where(article, article section, article astro-slot) > h3 { - padding-top: var(--space-8x); + > :is(h4, h5, h6) + :not(section, astro-slot, astro-island) { + margin-top: var(--space-3x) !important; + } } - :where(article, article section, article astro-slot) > h4 { - padding-top: var(--space-6x); + :where(&, & section, & astro-slot) { + > :is(h1, h2, h3, h4, h5, h6, li) { + font-weight: bold; + margin-top: 0; + } + + > h1 { + font-size: 32px; + } + + > h2 { + padding-top: var(--space-6x); + font-size: 28px; + } + + > h3 { + padding-top: var(--space-8x); + font-size: 24px; + } + + > h4 { + padding-top: var(--space-5x); + font-size: 20px; + } + + > :is(h5, h6) { + padding-top: var(--space-4x); + font-size: 16px; + } } - } - @media (min-width: 72em) { - :where(article, article section, article astro-slot) > h1 { - font-size: 40px; + @media (min-width: 50em) { + :where(&, & section, & astro-slot) > :is(h1, h2) { + position: sticky; + top: 0; + z-index: 3; + background: white; + border-bottom: 2px solid var(--blue-200, #dfe7fb); + padding: var(--space-6x) 0; + } + + section > :is(section, h5, h6):target { + scroll-margin-top: calc(var(--theme-navbar-height) + var(--space-20x)); + } + + :where(&, & section, & astro-slot) > h3 { + padding-top: var(--space-8x); + } + + :where(&, & section, & astro-slot) > h4 { + padding-top: var(--space-6x); + } } - :where(article, article section, article astro-slot) > h2 { - font-size: 32px; - } + @media (min-width: 72em) { + :where(&, & section, & astro-slot) > h1 { + font-size: 40px; + } + + :where(&, & section, & astro-slot) > h2 { + font-size: 32px; + } - :where(article, article section, article astro-slot) > h3 { - font-size: 28px; + :where(&, & section, & astro-slot) > h3 { + font-size: 28px; + } } } </style> diff --git a/src/components/PageContent/WhatsNext.astro b/src/components/PageContent/WhatsNext.astro index 43bd4634c79..0c1cf779674 100644 --- a/src/components/PageContent/WhatsNext.astro +++ b/src/components/PageContent/WhatsNext.astro @@ -1,10 +1,12 @@ --- +import { Typography } from "@chainlink/blocks" + export type Props = { content: Record<string, string> } const { content = {} } = Astro.props as Props --- <section> - <h2>What's next</h2> + <Typography variant="h2">What's next</Typography> <ul> { Object.keys(content).map((key) => ( @@ -23,6 +25,8 @@ const { content = {} } = Astro.props as Props h2 { margin: 0; + font-weight: bold; + font-size: 2rem; } ul { @@ -42,6 +46,7 @@ const { content = {} } = Astro.props as Props li a { display: inline-block; padding: var(--space-4x); + color: var(--color-text-link); width: 100%; } diff --git a/src/components/QuickLinkCard/QuickLinkCard.astro b/src/components/QuickLinkCard/QuickLinkCard.astro new file mode 100644 index 00000000000..e4e13bc9e71 --- /dev/null +++ b/src/components/QuickLinkCard/QuickLinkCard.astro @@ -0,0 +1,44 @@ +--- +import { Typography } from "@chainlink/blocks" +import styles from "./QuickLinkCard.module.css" + +interface Link { + icon: any + label: string + link: string +} + +interface Props { + links: Link[] +} + +const { links } = Astro.props +--- + +<section class={styles.container}> + <h2 class={styles.srOnly}>Quick Links</h2> + + <div class={styles.content}> + <div class={styles.sidebar} aria-hidden="true"></div> + + <div class={styles.main}> + <div class={styles.linksGrid}> + { + links.map((link) => { + const Icon = link.icon + return ( + <a href={link.link} class={styles.linkItem}> + <span class={styles.icon}> + <Icon color="brand" /> + </span> + <Typography color="muted" variant="body-s"> + {link.label} + </Typography> + </a> + ) + }) + } + </div> + </div> + </div> +</section> diff --git a/src/components/QuickLinkCard/QuickLinkCard.module.css b/src/components/QuickLinkCard/QuickLinkCard.module.css new file mode 100644 index 00000000000..f514f3a06a0 --- /dev/null +++ b/src/components/QuickLinkCard/QuickLinkCard.module.css @@ -0,0 +1,66 @@ +.srOnly { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.content { + display: flex; +} + +.sidebar { + width: 32px; + flex-shrink: 0; + background: url("/images/info-sidebar-img.png") lightgray 50% / cover no-repeat; + position: relative; + filter: saturate(0.6); +} + +.main { + flex: 1; + min-width: 0; +} + +.linksGrid { + display: grid; + grid-template-columns: 1fr; + gap: var(--space-6x); + padding: var(--space-4x) 0 calc(var(--space-4x) - 2px) var(--space-6x); + + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); + border-right: 1px solid var(--border); +} + +.linkItem { + display: flex; + align-items: center; + gap: var(--space-2x); +} + +.label { + font-size: 1rem; + font-weight: 500; +} + +@media (min-width: 640px) { + .linksGrid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (min-width: 1024px) { + .sidebar { + display: block; + } + + .linksGrid { + grid-template-columns: repeat(3, 1fr); + } +} diff --git a/src/components/QuickLinkCard/README.md b/src/components/QuickLinkCard/README.md new file mode 100644 index 00000000000..84ecff72986 --- /dev/null +++ b/src/components/QuickLinkCard/README.md @@ -0,0 +1,214 @@ +# QuickLinkCard Component + +A responsive component that displays a grid of quick links with icons, perfect for creating a "Tools & Utilities" section or similar resource lists. + +## What This Component Does + +The QuickLinkCard component creates a visually appealing section that: + +- Shows a decorative sidebar image on larger screens +- Arranges your links in a responsive grid (1 column on mobile, 2 on tablet, 3 on desktop) +- Each link has an icon and a label +- Icons are displayed in brand color (blue) + +## How to Use It + +### Basic Usage + +1. Import the component and icon components in your Astro page: + +```astro +--- +import QuickLinkCard from "~/components/QuickLinkCard/QuickLinkCard.astro" +import { SvgEyeOptic, SvgStartup, SvgBulletList } from "@chainlink/blocks" +--- +``` + +2. Add the component with your links: + +```astro +<QuickLinkCard + links={[ + { + icon: SvgEyeOptic, + label: "View Network Configs", + link: "/network-configs", + }, + { + icon: SvgStartup, + label: "Check Transaction Status", + link: "/transaction-status", + }, + { + icon: SvgBulletList, + label: "Get Testnet Tokens", + link: "/faucet", + }, + ]} +/> +``` + +## Understanding the Props + +The component accepts one prop called `links`, which is a list (array) of link objects. Each link object has three parts: + +### `icon` (required) + +- **What it is:** An icon component that appears next to the link +- **Format:** A component from `@chainlink/blocks` or any other icon component +- **Example:** `SvgEyeOptic`, `SvgStartup`, `SvgBulletList` +- **Tip:** Use icons from the `@chainlink/blocks` package for consistency with the rest of the site + +### `label` (required) + +- **What it is:** The text that appears next to the icon +- **Format:** Plain text +- **Example:** `'View Network Configs'` +- **Tip:** Keep it short and descriptive (2-4 words works best) + +### `link` (required) + +- **What it is:** Where the link goes when clicked +- **Format:** A URL path +- **Example:** `'/network-configs'` or `'https://example.com'` +- **Tip:** Use relative paths (starting with `/`) for internal pages + +## Complete Example + +Here's a full example showing 6 links: + +```astro +--- +import QuickLinkCard from "~/components/QuickLinkCard/QuickLinkCard.astro" +import { + SvgEyeOptic, + SvgTransactionRepeatRecurring, + SvgWaveSignal, + SvgStartup, + SvgCrossChain, + SvgBulletList, +} from "@chainlink/blocks" + +// Define your links here +const quickLinks = [ + { + icon: SvgEyeOptic, + label: "View Network Configs", + link: "https://docs.chain.link/ccip/directory/mainnet", + }, + { + icon: SvgTransactionRepeatRecurring, + label: "Check Transaction Status", + link: "https://ccip.chain.link/", + }, + { + icon: SvgWaveSignal, + label: "View Lane Status", + link: "https://ccip.chain.link/status", + }, + { + icon: SvgStartup, + label: "Get Testnet Tokens", + link: "https://tokenmanager.chain.link/", + }, + { + icon: SvgCrossChain, + label: "Convert Chainlink tokens", + link: "https://www.transporter.io/", + }, + { + icon: SvgBulletList, + label: "View the Changelog", + link: "https://dev.chain.link/changelog?product=CCIP", + }, +] +--- + +<QuickLinkCard links={quickLinks} /> +``` + +## Customizing the Look + +### Icon Color + +The icon color is set in the component itself. To change it: + +1. Open: `src/components/QuickLinkCard/QuickLinkCard.astro` +2. Find line with `<Icon color="brand" />` +3. Change `"brand"` to another color from `@chainlink/blocks` (e.g., `"blue-600"`, `"green-500"`, etc.) + +### Spacing and Layout + +If you want to change spacing or other visual aspects: + +1. Open the file: `src/components/QuickLinkCard/QuickLinkCard.module.css` +2. Look for the section you want to change: + - `.linkItem` - changes how each link looks + - `.linksGrid` - changes spacing and layout of the grid + - `.sidebar` - changes the sidebar image size + +### Example Customizations + +**Make the grid spacing tighter:** + +```css +.linksGrid { + gap: var(--space-4x); /* Change from var(--space-6x) */ +} +``` + +**Change the sidebar image size:** + +```css +.sidebar img { + width: 48px; /* Change from 32px */ +} +``` + +## Responsive Behavior + +The component automatically adapts to different screen sizes: + +- **Mobile (small screens):** Links stack in 1 column, sidebar image is hidden +- **Tablet (medium screens):** Links display in 2 columns, sidebar image is hidden +- **Desktop (large screens):** Links display in 3 columns, sidebar image appears on the left + +## Available Icons + +The `@chainlink/blocks` package provides many icons. Here are some commonly used ones: + +- `SvgEyeOptic` - Eye/view icon +- `SvgTransactionRepeatRecurring` - Transaction icon +- `SvgWaveSignal` - Signal/status icon +- `SvgStartup` - Rocket/startup icon +- `SvgCrossChain` - Cross-chain/transfer icon +- `SvgBulletList` - List icon +- And many more... + +Explore the `@chainlink/blocks` package to see all available icons. + +## Tips for Best Results + +1. **Icon Tips:** + - Use icons from `@chainlink/blocks` for consistency + - Keep all icons simple and recognizable + - Match the icon to the action (eye for "view", rocket for "get started", etc.) + +2. **Label Tips:** + - Keep labels short (2-4 words) + - Use action words like "View", "Check", "Get", "Convert" + - Be clear about what happens when the link is clicked + +3. **Link Tips:** + - Test all your links to make sure they work + - Use relative paths for internal pages (starts with `/`) + - Use full URLs for external sites (starts with `http://` or `https://`) + +## Need Help? + +If something isn't working: + +1. Check that all three parts (icon, label, link) are included for each link +2. Make sure you've imported the icon components from `@chainlink/blocks` +3. Verify that your links are correct paths +4. Check the browser console for any error messages diff --git a/src/components/Resource/README.md b/src/components/Resource/README.md new file mode 100644 index 00000000000..097d6befad1 --- /dev/null +++ b/src/components/Resource/README.md @@ -0,0 +1,106 @@ +# ResourceGrid + +## What it does + +This component displays a grid of resource cards. Each card can represent either an article or a video, with an optional image, title, description, and link. Article cards show a "Read the full article" footer with an arrow. + +## How to use it + +1. Import the component in your Astro layout or page: + +```astro +import ResourceGrid from "~/components/Resource/ResourceGrid.astro" import type {ResourceItem} from "~/components/Resource/ResourceGrid.astro" +``` + +2. (Optional) If you want to use imported images, import them: + +```astro +import myImage from "~/assets/images/my-image.png" +``` + +3. Create an array of resources with the information for each resource card + +4. Add the component to your page and pass in the resources: + +```astro +<ResourceGrid resources={yourResourcesArray} /> +``` + +## Example + +Here's a complete example showing how to use the component: + +```astro +--- +import ResourceGrid from "~/components/Resource/ResourceGrid.astro" +import type { ResourceItem } from "~/components/Resource/ResourceGrid.astro" +import tokenPoolImage from "~/assets/images/token-pool.png" + +const resources: ResourceItem[] = [ + { + image: tokenPoolImage, + imageAlt: "Token Pool illustration", + label: "Token Pool Types", + description: + "Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs.", + link: "/resources/token-pool-types", + type: "article", + }, + { + label: "Getting Started with CCIP", + description: + "Learn how to build cross-chain applications using Chainlink CCIP in this comprehensive video tutorial.", + link: "https://youtube.com/watch?v=example", + type: "video", + }, + { + image: "/images/cross-chain-messaging.png", + imageAlt: "Cross-chain messaging diagram", + label: "Understanding Cross-Chain Messaging", + description: "A deep dive into how cross-chain messaging works and how to implement it in your smart contracts.", + link: "/resources/cross-chain-messaging", + type: "article", + }, +] +--- + +<ResourceGrid resources={resources} /> +``` + +## What you need to provide + +Each item in your `resources` array needs these fields: + +| Field | Required? | What it is | Example | +| --------------- | --------- | -------------------------------------------------------------------------- | ---------------------------------------------------------------- | +| **label** | Yes | The title of the resource | `"Token Pool Types"` | +| **link** | Yes | Where the card should link to (can be internal or external) | `"/resources/token-pool-types"` or `"https://youtube.com/..."` | +| **description** | Yes | A description explaining what the resource covers | `"Explore the various token pool types..."` | +| **type** | Yes | The type of resource - either `"article"` or `"video"` | `"article"` | +| **image** | No | Either an imported image or a path string | `myImage` (imported) or `"/images/token-pool.png"` (string path) | +| **imageAlt** | No | Description of the image for accessibility (required if image is provided) | `"Token Pool illustration"` | + +## Where to put images + +Images are optional for resource cards. You have two options: + +### Option 1: Import images (recommended for images in your project) + +1. Place your image file in the `src/assets/images/` directory +2. Import it at the top of your file: + ```astro + import myImage from "~/assets/images/my-image.png" + ``` +3. Use the imported variable in your resource object + +### Option 2: Use a path string (for public directory or external images) + +1. Place your image file in the `/public/images/` directory +2. Reference it with the full path starting with `/images/` + +Both approaches work! Use imported images for better optimization, or use path strings for simplicity. + +## Resource types + +- **article**: Displays "Read the full article" footer with an arrow icon +- **video**: No special footer (just the card with title and description). For video resources, the `image` prop can be a YouTube video thumbnail URL, and the `link` prop can be the YouTube video URL diff --git a/src/components/Resource/ResourceCard.astro b/src/components/Resource/ResourceCard.astro new file mode 100644 index 00000000000..775abded644 --- /dev/null +++ b/src/components/Resource/ResourceCard.astro @@ -0,0 +1,47 @@ +--- +import { Typography, SvgArrowRight2, SvgButtonPlay } from "@chainlink/blocks" +import styles from "./ResourceCard.module.css" +import { ResourceItem } from "./ResourceGrid.astro" + +type Props = ResourceItem + +const { image, imageAlt, label, link, description, type } = Astro.props + +const imageSrc = typeof image === "string" ? image : image?.src + +const isVideo = type === "video" +--- + +<a href={link} class={styles.card} target={isVideo ? "_blank" : "_self"}> + { + imageSrc && ( + <div class={styles.imageWrapper}> + <img src={imageSrc} alt={imageAlt} class={styles.image} /> + <div class={styles.overlay}> + <span class={styles.playButtonWrapper}> + <SvgButtonPlay color="card" width={15} height={17.25} /> + </span> + </div> + </div> + ) + } + <div class={styles.content}> + <Typography + variant="body-semi-l" + style={{ + marginBottom: isVideo ? "var(--space-2x)" : "var(--space-8x)", + }}>{label}</Typography + > + <Typography variant="body-s" color="muted"> + {description} + </Typography> + </div> + { + type === "article" && ( + <div class={styles.cardFooter}> + <span class={styles.footerText}>Read the full article</span> + <SvgArrowRight2 color="muted" width={12} height={12} /> + </div> + ) + } +</a> diff --git a/src/components/Resource/ResourceCard.module.css b/src/components/Resource/ResourceCard.module.css new file mode 100644 index 00000000000..af9c4cc67ad --- /dev/null +++ b/src/components/Resource/ResourceCard.module.css @@ -0,0 +1,104 @@ +.card { + display: flex; + flex-direction: column; + background: var(--color-background); + padding: var(--space-6x); + gap: var(--space-4x); + border-right: 1px solid var(--border); + border-bottom: 1px solid var(--border); + text-decoration: none; + transition: background-color 0.2s; + min-height: 329px; + cursor: default; +} + +.card:nth-child(-n + 3) { + border-top: 1px solid var(--border); +} + +.card:hover { + background-color: var(--muted); +} + +.overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; +} + +.playButtonWrapper { + background-color: var(--brand); + width: 45px; + height: 45px; + display: flex; + justify-content: center; + align-items: center; + & svg { + color: var(--white); + fill: var(--white); + } +} + +.imageWrapper { + width: 100%; + aspect-ratio: 16 / 9; + overflow: hidden; + border-radius: var(--space-2x); + position: relative; +} + +.image { + width: 100%; + height: 100%; + object-fit: cover; +} + +.content { + display: flex; + flex-direction: column; + flex: 1; +} + +.cardLabel { + font-size: 16px; + font-weight: 525; + color: var(--foreground); + margin-bottom: var(--space-2x); +} + +.cardFooter { + display: flex; + align-items: center; + width: 100%; + gap: var(--space-2x); + margin-top: var(--space-4x); +} + +.footerText { + font-size: 14px; + color: var(--color-text-secondary); +} +@media screen and (max-width: 1024px) { + .card:nth-child(-n + 3) { + border-top: none; + } + + .card:nth-child(-n + 2) { + border-top: 1px solid var(--border); + } +} + +@media screen and (max-width: 768px) { + .card:nth-child(n) { + border-top: none; + } + + .card:nth-child(1) { + border-top: 1px solid var(--border); + } +} diff --git a/src/components/Resource/ResourceGrid.astro b/src/components/Resource/ResourceGrid.astro new file mode 100644 index 00000000000..1ec37d2aac1 --- /dev/null +++ b/src/components/Resource/ResourceGrid.astro @@ -0,0 +1,24 @@ +--- +import type { ImageMetadata } from "astro" +import ResourceCard from "./ResourceCard.astro" +import styles from "./ResourceGrid.module.css" + +export interface ResourceItem { + image?: string | ImageMetadata + imageAlt?: string + label: string + link: string + description: string + type: "article" | "video" +} + +interface Props { + resources: ResourceItem[] +} + +const { resources } = Astro.props +--- + +<div class={styles.grid}> + {resources.map((resource) => <ResourceCard {...resource} />)} +</div> diff --git a/src/components/Resource/ResourceGrid.module.css b/src/components/Resource/ResourceGrid.module.css new file mode 100644 index 00000000000..02cb548eeb9 --- /dev/null +++ b/src/components/Resource/ResourceGrid.module.css @@ -0,0 +1,17 @@ +.grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + border-left: 1px solid var(--border); +} + +@media (max-width: 1024px) { + .grid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 768px) { + .grid { + grid-template-columns: 1fr; + } +} diff --git a/src/components/Resource/ResourceSection.astro b/src/components/Resource/ResourceSection.astro new file mode 100644 index 00000000000..148f2b2213d --- /dev/null +++ b/src/components/Resource/ResourceSection.astro @@ -0,0 +1,23 @@ +--- +import { Typography } from "@chainlink/blocks" +import ResourceGrid from "./ResourceGrid.astro" +import type { ResourceItem } from "./ResourceGrid.astro" +import styles from "./ResourceSection.module.css" + +interface Props { + title: string + resources: ResourceItem[] +} + +const { title, resources } = Astro.props +--- + +<section class={styles.section}> + <Typography + variant="h2" + style={{ + fontSize: "32px", + }}>{title}</Typography + > + <ResourceGrid resources={resources} /> +</section> diff --git a/src/components/Resource/ResourceSection.module.css b/src/components/Resource/ResourceSection.module.css new file mode 100644 index 00000000000..434df633c45 --- /dev/null +++ b/src/components/Resource/ResourceSection.module.css @@ -0,0 +1,11 @@ +.section { + display: flex; + flex-direction: column; + gap: var(--space-8x); +} + +@media screen and (max-width: 425px) { + .section { + gap: var(--space-6x); + } +} diff --git a/src/components/RightSidebar/MoreMenu.astro b/src/components/RightSidebar/MoreMenu.astro index b7c61cbf93e..6bee38b7ca1 100644 --- a/src/components/RightSidebar/MoreMenu.astro +++ b/src/components/RightSidebar/MoreMenu.astro @@ -64,48 +64,6 @@ const supportedLanguages = cfg?.languages || [] </li> ) } - <li class="header-link"> - <a href="/builders-quick-links" target="_blank" id="quick-links-sidebar-link"> - <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> - <path - d="M2.5 9.20055L7.18129 2H12.2965L9.62194 5.59959H13.5L5.97787 14H4.50671L7.18135 9.20055H2.5Z" - fill="#0D5DFF"></path> - </svg> - <p>Quick links for builders</p> - </a> - </li> - { - CONFIG.COMMUNITY_INVITE_URL && ( - <li class="header-link"> - <a href={CONFIG.COMMUNITY_INVITE_URL} target="_blank"> - <svg - viewBox="0 0 28 28" - version="1.1" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - fill="#0D5DFF" - stroke="#0D5DFF" - width="16" - height="16" - > - <> - <g stroke-width="0" /> - <g stroke-linecap="round" stroke-linejoin="round" /> - <g> - <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> - <g id="people_community" fill="#0D5DFF" fill-rule="nonzero"> - <path d="M17.75,18 C18.7164983,18 19.5,18.7835017 19.5,19.75 L19.5,21.7519766 L19.4921156,21.8604403 C19.1813607,23.9866441 17.2715225,25.0090369 14.0667905,25.0090369 C10.8736123,25.0090369 8.93330141,23.9983408 8.51446278,21.8965776 L8.5,21.75 L8.5,19.75 C8.5,18.7835017 9.28350169,18 10.25,18 L17.75,18 Z M18.2439108,11.9999135 L24.25,12 C25.2164983,12 26,12.7835017 26,13.75 L26,15.7519766 L25.9921156,15.8604403 C25.6813607,17.9866441 23.7715225,19.0090369 20.5667905,19.0090369 L20.3985759,19.007437 C20.0900029,17.9045277 19.1110503,17.0815935 17.9288034,17.0057197 L17.75,17 L16.8277704,17.0007255 C17.8477843,16.1757619 18.5,14.9140475 18.5,13.5 C18.5,12.9740145 18.4097576,12.4691063 18.2439108,11.9999135 Z M3.75,12 L9.75608915,11.9999135 C9.59024243,12.4691063 9.5,12.9740145 9.5,13.5 C9.5,14.8308682 10.0777413,16.0267978 10.996103,16.8506678 L11.1722296,17.0007255 L10.25,17 C8.9877951,17 7.92420242,17.85036 7.60086562,19.0094363 L7.5667905,19.0090369 C4.37361228,19.0090369 2.43330141,17.9983408 2.01446278,15.8965776 L2,15.75 L2,13.75 C2,12.7835017 2.78350169,12 3.75,12 Z M14,10 C15.9329966,10 17.5,11.5670034 17.5,13.5 C17.5,15.4329966 15.9329966,17 14,17 C12.0670034,17 10.5,15.4329966 10.5,13.5 C10.5,11.5670034 12.0670034,10 14,10 Z M20.5,4 C22.4329966,4 24,5.56700338 24,7.5 C24,9.43299662 22.4329966,11 20.5,11 C18.5670034,11 17,9.43299662 17,7.5 C17,5.56700338 18.5670034,4 20.5,4 Z M7.5,4 C9.43299662,4 11,5.56700338 11,7.5 C11,9.43299662 9.43299662,11 7.5,11 C5.56700338,11 4,9.43299662 4,7.5 C4,5.56700338 5.56700338,4 7.5,4 Z" /> - </g> - </g> - </g> - </> - </svg> - - <p>Join our community</p> - </a> - </li> - ) - } </ul> <style> diff --git a/src/components/TabGrid/GridCard.module.css b/src/components/TabGrid/GridCard.module.css new file mode 100644 index 00000000000..655ffb7cd16 --- /dev/null +++ b/src/components/TabGrid/GridCard.module.css @@ -0,0 +1,80 @@ +.card { + display: flex; + background: var(--color-background); + padding: var(--space-6x); + align-items: start; + gap: var(--space-6x); + border-right: 1px solid var(--border); + border-bottom: 1px solid var(--border); + flex-direction: column; + &:hover .cardFooter { + opacity: 1; + } +} + +[data-columns="1"] > .card:nth-child(1) { + border-top: 1px solid var(--border); +} + +[data-columns="2"] > .card:nth-child(-n + 2) { + border-top: 1px solid var(--border); +} + +[data-columns="3"] > .card:nth-child(-n + 3) { + border-top: 1px solid var(--border); +} + +[data-columns="4"] > .card:nth-child(-n + 4) { + border-top: 1px solid var(--border); +} + +/* Tablet: adjust border-top for 2-column layouts */ +@media (max-width: 1024px) { + [data-columns="3"] > .card:nth-child(-n + 3), + [data-columns="4"] > .card:nth-child(-n + 4) { + border-top: none; + } + + [data-columns="3"] > .card:nth-child(-n + 2), + [data-columns="4"] > .card:nth-child(-n + 2) { + border-top: 1px solid var(--border); + } +} + +/* Mobile: single column - only first card has border-top */ +@media (max-width: 768px) { + [data-columns] > .card:nth-child(n) { + border-top: none; + } + + [data-columns] > .card:nth-child(1) { + border-top: 1px solid var(--border); + } +} + +.card:hover { + background-color: var(--muted); +} + +.cardFooter { + opacity: 0; + margin-top: auto; + /* enforcing a width */ + min-width: 16px; + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; +} + +.cardFooter img { + width: 10px; + height: 10px; +} + +.cardTitle { + font-size: 16px; + font-weight: 525; + color: var(--foreground); + margin-bottom: var(--space-2x); +} diff --git a/src/components/TabGrid/GridCard.tsx b/src/components/TabGrid/GridCard.tsx new file mode 100644 index 00000000000..e6d4281a267 --- /dev/null +++ b/src/components/TabGrid/GridCard.tsx @@ -0,0 +1,27 @@ +import { Typography } from "@chainlink/blocks" +import styles from "./GridCard.module.css" + +export interface GridItem { + title: string + description: string + link: string + badge?: string +} + +export const GridCard = ({ title, description, link, badge }: GridItem) => { + return ( + <a href={link} className={styles.card}> + <div> + <p className={styles.cardTitle}>{title}</p> + <Typography variant="body-s" style={{ lineHeight: "24px" }}> + {description} + </Typography> + </div> + + <div className={styles.cardFooter}> + {badge && <span className={styles.badge}>{badge}</span>} + <img src="/assets/icons/upper-right-arrow.svg" alt="arrow" /> + </div> + </a> + ) +} diff --git a/src/components/TabGrid/ItemGrid.tsx b/src/components/TabGrid/ItemGrid.tsx new file mode 100644 index 00000000000..0a2ed5e92d3 --- /dev/null +++ b/src/components/TabGrid/ItemGrid.tsx @@ -0,0 +1,17 @@ +import { GridCard, GridItem } from "./GridCard.tsx" +import styles from "./TabGrid.module.css" + +interface ItemGridProps { + links: GridItem[] + columns?: 1 | 2 | 3 | 4 +} + +export const ItemGrid = ({ links, columns = 3 }: ItemGridProps) => { + return ( + <div className={styles.grid} style={{ gridTemplateColumns: `repeat(${columns}, 1fr)` }} data-columns={columns}> + {links.map((link, index) => ( + <GridCard key={`${link.title}-${index}`} {...link} /> + ))} + </div> + ) +} diff --git a/src/components/TabGrid/README.md b/src/components/TabGrid/README.md new file mode 100644 index 00000000000..52445286fe8 --- /dev/null +++ b/src/components/TabGrid/README.md @@ -0,0 +1,90 @@ +# TabGrid Component + +A tabbed interface for displaying grid items organized by category. + +## What is this? + +The TabGrid component displays a collection of items in a clean, organized layout with tabs. Each tab represents a category of items (like "EVM" or "Solana"), and clicking on a tab shows the relevant items as clickable cards. + +This component is useful when you have multiple items and want to group them by topic or category, making it easier for users to find what they need. + +## Usage + +```tsx +import { TabGrid } from "@components/TabGrid/TabGrid" +;<TabGrid + header="Tutorials" + tabs={[ + { + name: "Getting Started", + links: [ + { + title: "Quick Start Guide", + description: "Learn the basics in 5 minutes", + link: "/docs/quickstart", + }, + { + title: "Installation", + description: "Set up your development environment", + link: "/docs/installation", + }, + ], + }, + { + name: "Advanced", + links: [ + { + title: "Architecture Overview", + description: "Understand the system design", + link: "/docs/architecture", + }, + ], + }, + ]} +/> +``` + +## How to set it up + +The component requires a `tabs` prop, which is an array of tab objects. Each tab object contains: + +- A **name** (the label shown on the tab button) +- A list of **links** (the items shown when that tab is active) + +Each grid item needs three pieces of information: + +- **title** - The name of the item +- **description** - A short sentence explaining what the item covers +- **link** - The URL where the item can be found + +## Props Reference + +### `TabGrid` + +| Prop | Type | Required | Description | +| --------- | -------- | -------- | ------------------------------------------------- | +| `header` | `string` | Yes | The heading text displayed above the tabs | +| `tabs` | `Tab[]` | Yes | List of tabs, each containing a category of items | +| `columns` | `number` | No | Number of columns in the grid (defaults to 2) | + +### `Tab` + +| Property | Type | Required | Description | +| -------- | ------------ | -------- | -------------------------------------------------------- | +| `name` | `string` | Yes | The label displayed on the tab (e.g., "Getting Started") | +| `links` | `GridItem[]` | Yes | The list of items to show when this tab is selected | + +### `GridItem` + +| Property | Type | Required | Description | +| ------------- | -------- | -------- | ------------------------------------------------- | +| `title` | `string` | Yes | The item's heading | +| `description` | `string` | Yes | A brief explanation of what users will learn | +| `link` | `string` | Yes | The URL path to the item page | +| `badge` | `string` | No | Optional badge label (e.g., "CCIP", "DATA FEEDS") | + +## Components + +- **TabGrid** - Main container with tabs and header +- **ItemGrid** - Grid layout for item cards +- **GridCard** - Individual item card with hover effects diff --git a/src/components/TabGrid/TabGrid.module.css b/src/components/TabGrid/TabGrid.module.css new file mode 100644 index 00000000000..86fcc0aaa87 --- /dev/null +++ b/src/components/TabGrid/TabGrid.module.css @@ -0,0 +1,84 @@ +.grid { + display: grid; + border-left: 1px solid var(--border); + margin-top: 36px 0; +} + +.gridHeader { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--space-8x); +} + +.tabsTrigger { + height: 32px; + padding: var(--space-1x) var(--space-2x); + justify-content: center; + align-items: center; + border-radius: var(--space-2x); + background-color: var(--pill); + border: 1px solid var(--pill-border); +} + +.tabsTrigger:hover { + background-color: var(--pill-hover); +} + +.tabsTrigger[data-state="active"] { + background-color: var(--pill-active); + border-color: var(--pill-active); + border-bottom: 1px solid var(--pill-active); + + & h3 { + color: var(--pill-active-foreground); + } +} + +.tabTitle { + color: var(--pill-foreground); + font-weight: 400; +} + +.tabsList { + display: flex; + gap: var(--space-2x); + border-bottom: 0; +} + +/* Tablet: reduce columns to 2 for 3+ column layouts */ +@media (max-width: 1024px) { + [data-columns="3"], + [data-columns="4"] { + grid-template-columns: repeat(2, 1fr) !important; + } +} + +/* Mobile: single column for all layouts */ +@media (max-width: 768px) { + .grid { + grid-template-columns: 1fr !important; + } + + .gridHeader > h2 { + font-size: 28px; + } +} + +@media screen and (max-width: 425px) { + .gridSection { + margin-top: 0; + } + + .gridHeader { + margin-bottom: var(--space-6x); + } +} + +@media screen and (max-width: 390px) { + .gridHeader { + flex-direction: column; + align-items: start; + gap: var(--space-2x); + } +} diff --git a/src/components/TabGrid/TabGrid.tsx b/src/components/TabGrid/TabGrid.tsx new file mode 100644 index 00000000000..5b73bcdd43b --- /dev/null +++ b/src/components/TabGrid/TabGrid.tsx @@ -0,0 +1,47 @@ +import styles from "./TabGrid.module.css" +import { GridItem } from "./GridCard.tsx" +import { ItemGrid } from "./ItemGrid.tsx" +import { Tabs, TabsContent, TabsList, TabsTrigger, Typography } from "@chainlink/blocks" + +export interface Tab { + name: string + links: GridItem[] +} + +interface TabGridProps { + tabs: Tab[] + header: string + columns?: 1 | 2 | 3 | 4 +} + +export const TabGrid = ({ tabs, header, columns = 3 }: TabGridProps) => { + return ( + <Tabs defaultValue={tabs[0].name} className={styles.tabGridWrapper}> + <header className={styles.gridHeader}> + <Typography + variant="h2" + style={{ + fontSize: "32px", + }} + > + {header} + </Typography> + <TabsList className={styles.tabsList}> + {tabs.map((tab) => ( + <TabsTrigger key={tab.name} value={tab.name} className={styles.tabsTrigger}> + <h3 className={styles.tabTitle}>{tab.name}</h3> + </TabsTrigger> + ))} + </TabsList> + </header> + + {tabs.map((tab) => ( + <TabsContent key={tab.name} value={tab.name}> + <div className={styles.gridContent}> + <ItemGrid links={tab.links} columns={columns} /> + </div> + </TabsContent> + ))} + </Tabs> + ) +} diff --git a/src/components/TechnicalStandards/TechnicalStandards.astro b/src/components/TechnicalStandards/TechnicalStandards.astro new file mode 100644 index 00000000000..11e4e1d85b4 --- /dev/null +++ b/src/components/TechnicalStandards/TechnicalStandards.astro @@ -0,0 +1,132 @@ +--- +import { Typography } from "@chainlink/blocks" + +const cards = [ + { + title: "Digital Transfer Agent (DTA)", + description: "You might be interested in this end-to-end solution. It can solve your problems.", + image: "/images/ccip/ccip-hero-bg.png", + href: "/", + }, + { + title: "Delivery vs. Payment (DvP)", + description: "You might be interested in this end-to-end solution. It can solve your problems.", + image: "/images/code-sample.png", + href: "/", + }, +] +--- + +<div class="technical-standards"> + <Typography variant="h2">Technical Standards</Typography> + + <div class="list"> + { + cards.map((card) => ( + <a href={card.href} class="standard-card"> + <div class="card-image" style={`background-image: url(${card.image})`} /> + <div class="card-body"> + <div class="card-text"> + <Typography variant="h5">{card.title}</Typography> + <Typography variant="body-l" color="muted"> + {card.description} + </Typography> + </div> + </div> + <img src="/assets/icons/upper-right-arrow.svg" class="card-arrow" /> + </a> + )) + } + </div> +</div> + +<style> + .technical-standards > h2 { + margin-bottom: var(--space-6x); + font-size: 28px; + } + .list { + display: grid; + grid-template-columns: 1fr; + border: 1px solid var(--border); + } + + .standard-card { + display: flex; + flex-direction: column; + padding: var(--space-6x); + gap: var(--space-6x); + align-items: start; + } + + .standard-card:hover { + background-color: var(--muted); + } + + .standard-card:hover .card-arrow { + opacity: 1; + } + + .card-image { + width: 70px; + height: 70px; + background-repeat: no-repeat; + } + .standard-card:first-child { + border-bottom: 1px solid var(--border); + } + + .standard-card:first-child .card-image { + } + + .card-body, + .card-text { + display: flex; + flex-direction: column; + gap: var(--space-4x); + flex: 1; + } + + .card-arrow { + height: 12px; + width: 12px; + opacity: 0; + align-self: flex-end; + display: none; + } + + @media screen and (min-width: 543px) { + .standard-card { + flex-direction: row; + } + + .card-image { + width: 140px; + height: 140px; + } + + .card-arrow { + display: block; + } + } + + @media (min-width: 50em) { + .list { + grid-template-columns: repeat(2, 1fr); + } + .standard-card { + flex-direction: row; + } + + .standard-card:first-child { + border-right: 1px solid var(--border); + border-bottom: 0; + } + + .card-body, + .card-text { + flex: 1; + justify-content: space-between; + } + } +</style> diff --git a/src/components/ToolsUtilitiesGrid/README.md b/src/components/ToolsUtilitiesGrid/README.md new file mode 100644 index 00000000000..550b5ae7de0 --- /dev/null +++ b/src/components/ToolsUtilitiesGrid/README.md @@ -0,0 +1,82 @@ +# ToolsUtilitiesGrid + +## What it does + +This component displays a grid of clickable cards that showcase tools and utilities. Each card includes an icon, title, description, and link. It's perfect for creating a visual directory of resources, tools, or utilities that users can browse and click through to. + +## How to use it + +1. Import the component in your Astro layout or page: + +```astro +import ToolsUtilitiesGrid from "~/components/ToolsUtilitiesGrid/ToolsUtilitiesGrid.astro" +``` + +2. Create an array of links with the information for each tool/utility you want to display + +3. Add the component to your page and pass in the links: + +```astro +<ToolsUtilitiesGrid links={yourLinksArray} /> +``` + +## Example + +Here's a complete example showing how to use the component: + +```astro +--- +import ToolsUtilitiesGrid from "~/components/ToolsUtilitiesGrid/ToolsUtilitiesGrid.astro" + +const toolsAndUtilities = [ + { + image: "/images/ccip-logo.svg", + imageAlt: "CCIP API icon", + label: "CCIP API", + link: "/ccip/api", + description: "An API for message retrieval and lane latency information.", + }, + { + image: "/images/js-logo.svg", + imageAlt: "JavaScript SDK icon", + label: "Javascript SDK", + link: "https://github.com/smartcontractkit/ccip-javascript-sdk", + description: "Integrate CCIP functionality directly into your web applications for EVM-compatible chains.", + }, + { + image: "/images/hardhat-logo.svg", + imageAlt: "Hardhat icon", + label: "Hardhat Starter Kit", + link: "https://github.com/smartcontractkit/hardhat-starter-kit", + description: + "Ready-to-go boilerplate for basic CCIP use cases that help you get started building quickly with Hardhat.", + }, +] +--- + +<ToolsUtilitiesGrid links={toolsAndUtilities} /> +``` + +## What you need to provide + +Each item in your `links` array needs these fields: + +| Field | What it is | Example | +| --------------- | ----------------------------------------------------------- | -------------------------------------------------------------- | +| **image** | The full path to the icon/logo image | `"/images/ccip-logo.svg"` | +| **imageAlt** | Description of the image for accessibility | `"CCIP API icon"` | +| **label** | The title/name of the tool or utility | `"CCIP API"` | +| **link** | Where the card should link to (can be internal or external) | `"/ccip/api"` or `"https://github.com/..."` | +| **description** | A short description explaining what the tool does | `"An API for message retrieval and lane latency information."` | + +## Where to put images + +Place your icon/logo images in the `/public/images/` directory, and reference them with the full path starting with `/images/`. + +For example, if you use `image: "/images/my-tool-logo.svg"`, the actual file should be at: + +``` +/public/images/my-tool-logo.svg +``` + +You can also use images from other locations by providing the full path (e.g., `"/assets/logos/my-logo.png"`). diff --git a/src/components/ToolsUtilitiesGrid/ToolItem.astro b/src/components/ToolsUtilitiesGrid/ToolItem.astro new file mode 100644 index 00000000000..eb5b7f590c7 --- /dev/null +++ b/src/components/ToolsUtilitiesGrid/ToolItem.astro @@ -0,0 +1,28 @@ +--- +import { Typography } from "@chainlink/blocks" +import styles from "./toolsUtilities.module.css" +import { Link } from "./types" + +type Props = Link + +const { description, image, imageAlt, label, link } = Astro.props +--- + +<a href={link} class={styles.card}> + <div class={styles.imageContainer}><img src={image} alt={imageAlt} class={styles.image} /></div> + + <div class={styles.content}> + <div> + <Typography + variant="body-semi" + style={{ + fontWeight: 500, + fontSize: "18px", + }}>{label}</Typography + > + <Typography variant="body-s" color="muted">{description}</Typography> + </div> + + <img src="/assets/icons/upper-right-arrow.svg" class={styles.arrow} /> + </div> +</a> diff --git a/src/components/ToolsUtilitiesGrid/ToolsUtilitiesGrid.astro b/src/components/ToolsUtilitiesGrid/ToolsUtilitiesGrid.astro new file mode 100644 index 00000000000..fa875b286c8 --- /dev/null +++ b/src/components/ToolsUtilitiesGrid/ToolsUtilitiesGrid.astro @@ -0,0 +1,26 @@ +--- +import styles from "./toolsUtilities.module.css" + +import { Link } from "./types" +import ToolItem from "./ToolItem.astro" +import { Typography } from "@chainlink/blocks" + +interface Props { + links: Link[] +} + +const { links } = Astro.props +--- + +<section class={styles.wrapper}> + <Typography + variant="h2" + style={{ + fontSize: "32px", + }}>Tools & Utilities</Typography + > + + <div class={styles.container}> + {links.map((link) => <ToolItem {...link} />)} + </div> +</section> diff --git a/src/components/ToolsUtilitiesGrid/toolsUtilities.module.css b/src/components/ToolsUtilitiesGrid/toolsUtilities.module.css new file mode 100644 index 00000000000..c1e36191486 --- /dev/null +++ b/src/components/ToolsUtilitiesGrid/toolsUtilities.module.css @@ -0,0 +1,60 @@ +.container { + display: grid; + grid-template-columns: repeat(3, 1fr); + margin-top: var(--space-8x); +} + +.card { + padding: var(--space-6x); + display: flex; + gap: var(--space-4x); + align-items: start; +} + +.card:hover { + background: var(--muted); + & .arrow { + opacity: 1; + } +} + +.imageContainer { + min-width: 48px; + height: 48px; + background: var(--background-alt); + border: 1px solid var(--border); + border-radius: var(--space-1x); + display: flex; + align-items: center; + justify-content: center; +} + +.content { + display: flex; + + & > img { + align-self: end; + } +} + +.arrow { + opacity: 0; +} + +@media screen and (max-width: 1135px) { + .container { + grid-template-columns: repeat(2, 1fr); + } +} + +@media screen and (max-width: 525px) { + .container { + grid-template-columns: repeat(1, 1fr); + } +} + +@media screen and (max-width: 425px) { + .container { + margin-top: var(--space-6x); + } +} diff --git a/src/components/ToolsUtilitiesGrid/types.ts b/src/components/ToolsUtilitiesGrid/types.ts new file mode 100644 index 00000000000..2c645744a9f --- /dev/null +++ b/src/components/ToolsUtilitiesGrid/types.ts @@ -0,0 +1,7 @@ +export interface Link { + image: string + imageAlt: string + label: string + link: string + description: string +} diff --git a/src/components/TryItOut/README.md b/src/components/TryItOut/README.md new file mode 100644 index 00000000000..50a8e94c97a --- /dev/null +++ b/src/components/TryItOut/README.md @@ -0,0 +1,92 @@ +# TryItOut Component + +A component that displays an interactive accordion of features alongside a dynamically changing code sample preview. The code sample updates based on which accordion item is currently expanded. + +## Usage + +```astro +<TryItOut + accordionTabs={[ + { + title: "Your Feature Title", + text: "A brief description of what this feature does.", + codeSampleSrc: "/samples/YourCodeFile.sol", + }, + ]} + ctas={[ + { text: "Get Started", href: "/getting-started", variant: "primary" }, + { text: "Learn More", href: "/docs", variant: "secondary" }, + ]} +/> +``` + +## Props + +### `accordionTabs` (required) + +A list of expandable sections that describe different features. Each tab needs: + +- **title**: The heading text for the accordion item +- **text**: The description that appears when the accordion is expanded +- **codeSampleSrc**: The file path to the code sample for this specific tab (should point to a file in the `/samples/` folder) + +**Example:** + +```js +;[ + { + title: "Transfer Tokens", + text: "Move tokens between different blockchains easily.", + codeSampleSrc: "/samples/CCIP/TokenTransfer.sol", + }, + { + title: "Fetch Data", + text: "Get real-time information from external sources.", + codeSampleSrc: "/samples/DataFeeds/PriceFeed.sol", + }, +] +``` + +### `ctas` (optional) + +An array of call-to-action buttons to display in the footer. If not provided, defaults to "Create CRE account" and "Get the SDK" buttons. + +Each CTA object needs: + +- **text**: The button text +- **href**: The button link URL +- **variant** (optional): Either "primary" or "secondary" (defaults to "primary") + +**Example:** + +```js +;[ + { text: "Get Started", href: "/getting-started", variant: "primary" }, + { text: "View Docs", href: "/documentation", variant: "secondary" }, +] +``` + +## How It Works + +The component uses [Astro's nano stores](https://docs.astro.build/en/core-concepts/sharing-state/) to track which accordion item is currently expanded. When you click on a different accordion item, the code sample automatically updates to show the code associated with that item. + +### Technical Implementation + +**Why we pre-render all code samples:** + +All code samples are rendered at build time using the `<CodeSample>` Astro component and included in the HTML. While this means all code samples are present in the DOM, they are toggled via visibility rather than dynamically loaded. This approach is necessary because: + +1. **Astro components are build-time only** - The `<CodeSample>` component uses Astro's Prism integration which only runs during the build process, not at runtime +2. **Proper syntax highlighting** - Pre-rendering ensures all code has proper syntax highlighting applied via Prism +3. **Performance** - No runtime file reading or syntax highlighting processing; instant switching between code samples +4. **Simplicity** - Avoids complex API endpoints or client-side file fetching + +**Accessibility considerations:** + +Inactive code samples are hidden from both visual users and assistive technology: + +- `display: none` hides them visually +- `aria-hidden="true"` ensures screen readers ignore hidden code blocks +- Only the active code sample has `aria-hidden="false"`, making it visible to screen readers + +When the active accordion changes, the visibility and `aria-hidden` attributes are updated via JavaScript to show the new code sample and hide all others. diff --git a/src/components/TryItOut/TryItOut.astro b/src/components/TryItOut/TryItOut.astro new file mode 100644 index 00000000000..c015f66c5bf --- /dev/null +++ b/src/components/TryItOut/TryItOut.astro @@ -0,0 +1,106 @@ +--- +import { buttonVariants, Typography } from "@chainlink/blocks" +import styles from "./styles.module.css" +import CodeSample from "../CodeSample/CodeSample.astro" +import { TryItOutAccordion } from "./TryItOutAccordion" +import { clsx } from "~/lib/clsx/clsx" + +interface CTA { + text: string + href: string + variant?: "primary" | "secondary" +} + +interface Props { + accordionTabs: Array<{ title: string; text: string; codeSampleSrc: string }> + ctas: CTA[] +} + +const { accordionTabs, ctas } = Astro.props +--- + +<div class={styles.container}> + <section class={styles.body}> + <Typography variant="h2" className={styles.title}> Try it out </Typography> + + <section class={styles.content}> + <div class={styles.contentLeft}> + <TryItOutAccordion client:load tabs={accordionTabs} /> + + <footer class={styles.contentFooter}> + { + ctas.map((cta) => ( + <a + href={cta.href} + class={clsx( + buttonVariants({ + variant: cta.variant === "secondary" ? "tertiary" : "primary", + size: "default", + }), + cta.variant === "secondary" && styles.secondaryBtn + )} + > + {cta.text} + </a> + )) + } + </footer> + </div> + + <section class={styles.image}> + { + accordionTabs.map((tab, index) => ( + <div + class="code-sample-item" + data-code-index={index} + style={index === 0 ? "" : "display: none;"} + aria-hidden={index === 0 ? "false" : "true"} + > + <CodeSample showButtons={false} src={tab.codeSampleSrc} /> + </div> + )) + } + </section> + + <footer class={styles.contentFooterMobile}> + { + ctas.map((cta) => ( + <a + href={cta.href} + class={clsx( + buttonVariants({ + variant: cta.variant === "secondary" ? "tertiary" : "primary", + size: "default", + }), + cta.variant === "secondary" && styles.secondaryBtn + )} + > + {cta.text} + </a> + )) + } + </footer> + </section> + </section> +</div> + +<script> + import { activeAccordionIndex } from "~/stores/tryItOutStore.ts" + + // Subscribe to nano store changes + activeAccordionIndex.subscribe((newIndex) => { + // Hide all code samples and mark as hidden for screen readers + const allCodeSamples = document.querySelectorAll(".code-sample-item") + allCodeSamples.forEach((el) => { + ;(el as HTMLElement).style.display = "none" + ;(el as HTMLElement).setAttribute("aria-hidden", "true") + }) + + // Show the active one and mark as visible for screen readers + const activeCodeSample = document.querySelector(`[data-code-index="${newIndex}"]`) + if (activeCodeSample) { + ;(activeCodeSample as HTMLElement).style.display = "block" + ;(activeCodeSample as HTMLElement).setAttribute("aria-hidden", "false") + } + }) +</script> diff --git a/src/components/TryItOut/TryItOutAccordion.tsx b/src/components/TryItOut/TryItOutAccordion.tsx new file mode 100644 index 00000000000..7328daa63ab --- /dev/null +++ b/src/components/TryItOut/TryItOutAccordion.tsx @@ -0,0 +1,37 @@ +import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Typography } from "@chainlink/blocks" +import { activeAccordionIndex } from "~/stores/tryItOutStore.ts" +import styles from "./styles.module.css" + +interface AccordionTab { + title: string + text: string + codeSampleSrc: string +} + +interface TryItOutAccordionProps { + tabs: AccordionTab[] +} + +export const TryItOutAccordion = ({ tabs }: TryItOutAccordionProps) => { + const handleValueChange = (value: string) => { + if (value) { + activeAccordionIndex.set(parseInt(value, 10)) + } + } + + return ( + <Accordion collapsible type="single" defaultValue="0" onValueChange={handleValueChange}> + {tabs.map((tab, idx) => ( + <AccordionItem key={idx} value={String(idx)} className={styles.accordionItem}> + <AccordionTrigger className={styles.accordionTrigger}> + {tab.title}{" "} + <Typography variant="code" className={styles.indicator}> + 0{idx + 1} + </Typography> + </AccordionTrigger> + <AccordionContent className={styles.text}>{tab.text}</AccordionContent> + </AccordionItem> + ))} + </Accordion> + ) +} diff --git a/src/components/TryItOut/styles.module.css b/src/components/TryItOut/styles.module.css new file mode 100644 index 00000000000..9aed11c8332 --- /dev/null +++ b/src/components/TryItOut/styles.module.css @@ -0,0 +1,124 @@ +.container { + background-color: var(--tertiary-foreground); + padding: var(--space-10x) var(--space-16x); + margin: 86px 0; +} + +.title { + margin-bottom: var(--space-8x); + color: var(--background); +} + +.secondaryBtn { + color: var(--muted-on-surface); +} + +.contentFooter { + display: flex; + gap: var(--space-6x); + margin-top: 55px; +} + +.content { + display: grid; + grid-template-columns: 1fr 1fr; + justify-content: space-between; + gap: var(--space-24x); +} + +.accordionItem { + border-bottom: none; + border-top: 1px solid var(--segment-button-foreground); + display: flex; + flex-direction: column; + + * { + transition: all 0.2s linear; + } +} + +.contentLeft { + display: flex; + flex-direction: column; + justify-content: center; +} + +.text { + color: var(--muted-more-foreground); +} + +.indicator { + color: var(--segment-button-foreground); +} + +.accordionTrigger { + color: var(--muted-more-foreground); + padding: var(--space-4x) 0; + border: none; + outline: none; + & p { + color: var(--muted-more-foreground); + } + + & svg { + display: none; + } + + & span { + word-wrap: normal; + } +} + +.image { + width: 100%; + max-height: 412px; + overflow-y: auto; + border-bottom: 1.5px solid var(--stepper-counter-pending-foreground); + border-radius: 6.317px; +} + +.accordionItem[data-state="open"] { + border-top: 2px solid var(--link); + + & .accordionTrigger { + color: var(--background); + } + & .indicator { + color: var(--link); + } +} + +.body { + max-width: var(--fullwidth-max-width); + width: 100%; + margin: 0 auto; +} + +.contentFooterMobile { + display: none; + gap: var(--space-6x); +} + +@media screen and (max-width: 425px) { + .contentFooterMobile { + flex-direction: column; + } +} + +@media screen and (max-width: 768px) { + .content { + grid-template-columns: 1fr; + gap: var(--space-8x); + } + + .title { + font-size: 28px; + } + .contentFooter { + display: none; + } + + .contentFooterMobile { + display: flex; + } +} diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index 3d537eb6c0c..1f6c5d870cb 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -1723,6 +1723,7 @@ export const SIDEBAR: Partial<Record<Sections, SectionEntry[]>> = { }, ], [SIDEBAR_SECTIONS.CCIP]: CCIP_SIDEBAR_CONTENT, + [SIDEBAR_SECTIONS.CHAINLINK_LOCAL]: [ { section: "Chainlink Local", diff --git a/src/content.config.ts b/src/content.config.ts index 10fa1b090e7..bb9b9e18c17 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -60,6 +60,8 @@ const baseFrontmatter = z whatsnext: z.record(z.string(), z.string()).optional(), isMdx: z.boolean().optional(), isIndex: z.boolean().optional(), + disableDefaultStyles: z.boolean().optional(), + hideTitle: z.boolean().optional(), metadata, datafeedtype: z.string().optional(), fileExtension: z.string().optional(), diff --git a/src/content/ccip/index.mdx b/src/content/ccip/index.mdx index a2bc305caff..d9021dec296 100644 --- a/src/content/ccip/index.mdx +++ b/src/content/ccip/index.mdx @@ -8,94 +8,304 @@ metadata: datePublished: "2023-08-03" lastModified: "2025-05-19" isIndex: true -whatsnext: - "Complete the Getting Started guide to learn the basics": "/ccip/getting-started" - "CCIP Directory": "/ccip/directory" - "Learn how to transfer tokens": "/ccip/tutorials/evm/transfer-tokens-from-contract" - "Learn more about CCIP architecture": "/ccip/concepts/architecture" +disableDefaultStyles: true +hideTitle: true --- -import { ClickToZoom, Aside } from "@components" -import CcipCommon from "@features/ccip/CcipCommon.astro" - -<CcipCommon callout="talkToExpert" /> - -Blockchain interoperability protocols are important for the Web3 ecosystem and traditional systems that need to interact with different blockchains. These protocols are the foundation for building blockchain abstraction layers, allowing traditional backends and dApps to interact with any blockchain network through a single middleware solution. Without a blockchain interoperability protocol, Web2 systems and dApps would need to build separate in-house implementations for each cross-chain interaction that they want to use, which is a time-consuming, resource-intensive, and complex process. - -Blockchain interoperability protocols provide the following capabilities: - -- You can transfer assets and information across multiple blockchains. -- Application developers can leverage the strengths and benefits of different chains. -- Collaboration between developers from diverse blockchain ecosystems enables the building of cross-chain applications to serve more users and provide additional features or products for them. - -The _Chainlink Cross-Chain Interoperability Protocol (CCIP)_ provides these capabilities and enables a variety of [use cases](#common-use-cases). - -## What is Chainlink CCIP? - -Chainlink CCIP is a blockchain interoperability protocol that enables developers to build secure applications that can transfer tokens, messages (data), or both tokens and messages across chains. - -Given the [inherent risks of cross-chain interoperability](/resources/bridge-risks), CCIP features [defense-in-depth security](https://blog.chain.link/five-levels-cross-chain-security/#level_5__defense-in-depth) and is powered by Chainlink's industry-standard oracle networks which have a proven track record of securing tens of billions of dollars and enabling over $14 trillion in onchain transaction value. - -CCIP's robust security framework is built upon several core components: - -- **Proven Decentralized Architecture**: CCIP leverages the same highly reliable infrastructure as Chainlink Data Feeds, which has enabled trillions in transaction value across hundreds of DeFi applications. Cross-chain transactions are validated by multiple decentralized oracle networks (DONs). -- **Rate Limiting**: To mitigate risk, CCIP includes a rate limiting feature. This allows owners to establish and configure policies for Cross-Chain Tokens, which are then enforced on both the source and destination chains. -- **Timelocked Upgrades**: All on-chain, security-critical configuration changes and core infrastructure upgrades must pass through a Role-based Access Control Timelock contract. This process provides a review period during which CCIP node operators can veto the upgrade, or, in time-sensitive situations, explicitly approve it. -- **High-Quality, Sybil-Resistant Node Operators**: The system is secured by the same globally distributed, security-reviewed, public node operators that secure other Chainlink services, validate leading blockchain networks, and operate traditional Web2 infrastructure. Each independent CCIP node is run by a distinct organization with extensive DevOps expertise and rigorous private key management security practices. - -<ClickToZoom - src="/images/ccip/ccip-hl-v1.7.png" - alt="Chainlink CCIP Architecture" - style="display: block; margin: 2rem auto; max-height: 60vh; width: auto;" +import LayoutHero from "@components/LayoutHero/LayoutHero.astro" +import { TabGrid } from "@components/TabGrid/TabGrid.tsx" +import ResourceSection from "@components/Resource/ResourceSection.astro" +import QuickLinkCard from "@components/QuickLinkCard/QuickLinkCard.astro" +import ToolsUtilitiesGrid from "@components/ToolsUtilitiesGrid/ToolsUtilitiesGrid.astro" +import MediaSection from "@components/MediaSection/MediaSection.astro" +import CardsWrapper from "@components/Cards/CardsWrapper.astro" +import OverviewWrapper from "@components/OverviewWrapper.astro" +import ChangelogSnippet from "@components/ChangelogSnippet/ChangelogSnippet.astro" +import { + SvgEyeOptic, + SvgTransactionRepeatRecurring, + SvgWaveSignal, + SvgStartup, + SvgCrossChain, + SvgBulletList, +} from "@chainlink/blocks" + +export const toolsAndUtilities = [ + { + image: "/images/ccip-logo.svg", + imageAlt: "CCIP API icon", + label: "CCIP API", + link: "/ccip/api-reference", + description: "An API for message retrieval and lane latency information.", + }, + { + image: "/images/js-logo.svg", + imageAlt: "JavaScript SDK icon", + label: "Javascript SDK", + link: "https://github.com/smartcontractkit/ccip-javascript-sdk", + description: "Integrate CCIP functionality directly into your web applications for EVM-compatible chains.", + }, + { + image: "/images/ts-logo.svg", + imageAlt: "CLI icon", + label: "CLI", + link: "https://github.com/smartcontractkit/ccip-tools-ts", + description: "TypeScript command-line interface and library designed for interacting with deployed CCIP contracts.", + }, + { + image: "/images/hardhat-logo.svg", + imageAlt: "Hardhat icon", + label: "Hardhat Starter Kit", + link: "https://github.com/smartcontractkit/hardhat-starter-kit", + description: + "Ready-to-go boilerplate for basic CCIP use cases that help you get started building quickly with Hardhat.", + }, + { + image: "/images/foundry-logo.svg", + imageAlt: "Foundry icon", + label: "Foundry Starter Kit", + link: "https://github.com/smartcontractkit/foundry-starter-kit", + description: + "Ready-to-go boilerplate for basic CCIP use cases that help you get started building quickly with Foundry.", + }, + { + image: "/images/npm-logo.png", + imageAlt: "NPM icon", + label: "CCIP Contracts NPM", + link: "https://www.npmjs.com/package/@chainlink/contracts-ccip", + description: + "An npm package providing Solidity smart contract implementations to integrate CCIP into your EVM-based project.", + }, + { + image: "/images/direct-stacking-logo.svg", + imageAlt: "Direct Staking icon", + label: "Direct Staking", + link: "https://github.com/Aphyla/chainlink-csr", + description: + "Stake native tokens on supported L2 networks and receive liquid staked tokens directly on the same chain.", + }, +] + +export const exampleResources = [ + { + label: "Token Pool Types", + description: + "Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs. Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs...", + link: "/", + type: "article", + }, + { + label: "Token Pool Types", + description: + "Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs. Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs...", + link: "/", + type: "article", + }, + { + label: "Token Pool Types", + description: + "Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs. Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs...", + link: "/", + type: "article", + }, +] + +export const exampleTutorials = [ + { + name: "EVM", + links: [ + { + title: "Acquire Test Tokens", + description: "Get test tokens in minutes; build and test cross-chain apps with zero friction.", + link: "/ccip/test-tokens", + }, + { + title: "Transfer Tokens", + description: "Unlock seamless token transfers from contracts; learn, code, and deploy.", + link: "/ccip/tutorials/evm/transfer-tokens-from-contract", + }, + { + title: "Transfer Tokens with Data", + description: "Go beyond basic transfers with logic-infused token movements in your EVM contracts.", + link: "/ccip/tutorials/evm/programmable-token-transfers", + }, + { + title: "Using the Token Manager", + description: "Effortlessly manage CCTs by tracking, importing and organizing tokens from your dashboard.", + link: "/ccip/tutorials/evm/token-manager", + }, + { + title: "Using the JS SDK", + description: "Integrate CCIP in your frontend or backend effortlessly with JavaScript SDK.", + link: "/ccip/ccip-javascript-sdk", + }, + { + title: "Check Message Status", + description: "Retrieve real-time status of your offchain transaction from EVM.", + link: "/ccip/tutorials/evm/offchain/get-status-offchain", + }, + { + title: "Transfer Tokens Between EOAs", + description: "Send tokens offchain from an Externally Owned Account with clear steps.", + link: "/ccip/tutorials/evm/offchain/transfer-tokens-from-eoa", + }, + { + title: "Using the CLI", + description: "Use offchain tools from CCIP to simplify your Ethereum workflows.", + link: "/ccip/tutorials/evm/offchain/ccip-tools", + }, + { + title: "Deploy and Register a CCT", + description: "Use RemixIDE to launch and configure tokens for cross-chain transfers on CCIP.", + link: "/ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-remix", + }, + { + title: "Register CCT Burn & Mint EOA", + description: "Implement burn-mint cross-chain token logic with CCIP using Hardhat or Foundry.", + link: "/ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-burn-mint-hardhat", + }, + { + title: "Register CCT Lock & Mint EOA", + description: "Implement a lock-mint token registration workflow with CCIP and Hardhat or Foundry.", + link: "/ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-lock-mint-hardhat", + }, + { + title: "Set Token Pool Rate Limits", + description: "Update rate limiter settings for your cross-chain tokens using Hardhat or Foundry.", + link: "/ccip/tutorials/evm/cross-chain-tokens/update-rate-limiters-hardhat", + }, + ], + }, + { + name: "Solana", + links: [ + { + title: "Getting Started with Solana", + description: "Learn the basics of building on Solana blockchain.", + link: "/ccip/tutorials/svm", + }, + { + title: "Solana Token Transfers", + description: "Transfer tokens on the Solana blockchain.", + link: "/ccip/tutorials/svm/source/token-transfers", + }, + ], + }, + { + name: "Aptos", + links: [ + { + title: "Getting Started with Aptos", + description: "Start building on the Aptos blockchain.", + link: "/ccip/tutorials/aptos", + }, + ], + }, +] + +export const quickLinks = [ + { + icon: SvgEyeOptic, + label: "View Network Configs", + link: "https://docs.chain.link/ccip/directory/mainnet", + }, + { + icon: SvgTransactionRepeatRecurring, + label: "Check Transaction Status", + link: "https://ccip.chain.link/", + }, + { + icon: SvgWaveSignal, + label: "View Lane Status", + link: "https://ccip.chain.link/status", + }, + { + icon: SvgStartup, + label: "Get Testnet Tokens", + link: "https://tokenmanager.chain.link/", + }, + { + icon: SvgCrossChain, + label: "Convert Chainlink tokens", + link: "https://www.transporter.io/", + }, + { + icon: SvgBulletList, + label: "View the Changelog", + link: "https://dev.chain.link/changelog?product=CCIP", + }, +] + +export const cardLinks = [ + { + title: "Deploy/enable a token across multiple chains", + description: + "Create a new Cross-Chain-Token or enable an established one that can be launched on 50+ chains, providing unparalleled interoperability and reach.", + links: [ + { + icon: "token", + href: "https://example.com", + label: "View Token Manager", + }, + { + icon: "remix", + href: "https://example.com", + label: "Open in Remix", + }, + ], + }, + { + title: "Bridge a token", + description: + "Securely transfer tokens - including ETH, USDC, LINK - and messages between different blockchain networks.", + links: [ + { + icon: "token", + href: "https://example.com", + label: "View Token Manager", + }, + { + icon: "remix", + href: "https://example.com", + label: "Open in Remix", + }, + ], + }, + { + title: "Send a token with data", + description: + "Build token transfers that do more than move value, letting you embed business logic directly into your cross-chain workflows.", + links: [ + { + icon: "remix", + href: "https://example.com", + label: "Open in Remix", + }, + ], + }, +] + +<LayoutHero + title="Build with CCIP" + description="CCIP makes it simple to move data, messages, and tokens across blockchains. Connect smart contracts on different networks as if they were one system, whether transferring stablecoins, powering cross-chain apps, or running multi-chain DeFi." + buttons={[ + { label: "Get the SDK", link: "#" }, + { label: "API Doc", link: "#" }, + ]} + image="/images/ccip/ccip-hero.png" /> -To understand how Chainlink CCIP works, refer to the [architecture](/ccip/concepts/architecture) section. If you are new to using Chainlink CCIP, read these guides before you deploy any contracts that use CCIP. - -## Chainlink CCIP core capabilities - -Chainlink CCIP supports three main capabilities: - -### Arbitrary Messaging - -The ability to send arbitrary data (encoded as bytes) to a receiving smart contract on a different blockchain. The developer is free to encode any data they wish to send. - -Typically, developers use arbitrary messaging to trigger an informed action on the receiving smart contract, such as rebalancing an index, minting a specific NFT, or calling an arbitrary function with the sent data as custom parameters. Developers can encode multiple instructions in a single message, enabling them to orchestrate complex, multi-step, multi-chain tasks. - -### Token Transfer - -The ability to transfer tokens to an account on a different blockchain. This capability enables the seamless movement of assets across chains. - -### Programmable Token Transfer - -The ability to simultaneously transfer tokens and arbitrary data (encoded as bytes) within a single transaction. This mechanism allows users to transfer tokens and send instructions on what to do with those tokens. - -For example, a user could transfer tokens to a lending protocol with instructions to leverage those tokens as collateral for a loan, borrowing another asset to be sent back to the user. - -### Receiving account types - -With CCIP, you send transactions with data (arbitrary messaging), tokens, or both data and tokens (programmable token transfer). The receiver of a CCIP transaction varies by blockchain family: - -| CCIP capability | What is sent | Receiving account types | -| --------------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| Arbitrary Messaging | Data | EVM: Smart contracts only<br />SVM: Programs only<br />Aptos: Modules only | -| Token Transfer | Tokens | EVM: Smart contracts and EOAs<br />SVM: User wallets or program-controlled PDAs<br />Aptos: User accounts or modules deployed to resource accounts | -| Programmable Token Transfer | Data and tokens | EVM: Smart contracts only<br />SVM: Data to programs, tokens to program-controlled PDAs<br />Aptos: Modules deployed to resource accounts | - -**Note**: On EVM chains, EOAs cannot receive messages. On Solana (SVM), programs work with Program Derived Addresses (PDAs) to manage token reception. - -## Common use cases - -Chainlink CCIP enables a variety of use cases: - -- **Cross-chain lending:** Chainlink CCIP enables users to lend and borrow a wide range of crypto assets across multiple DeFi platforms running on independent chains. -- **Low-cost transaction computation:** Chainlink CCIP can help offload the computation of transaction data on cost-optimized chains. -- **Optimizing cross-chain yield:** Users can leverage Chainlink CCIP to move collateral to new DeFi protocols to maximize yield across chains. -- **Creating new kinds of dApps:** Chainlink CCIP enables users to take advantage of network effects on certain chains while harnessing compute and storage capabilities of other chains. - -Read [What Are Cross-Chain Smart Contracts](https://chain.link/education-hub/cross-chain-smart-contracts) to learn about cross-chain smart contracts and examples of use cases they enable. - -## CCIP Directory - -See the [CCIP Directory](/ccip/directory) page for a list of supported networks, tokens, and contract addresses. - -To learn about tokens, token pools, and the token onboarding process, see the [CCIP Architecture](/ccip/concepts/cross-chain-token/evm/token-pools) page. +<OverviewWrapper> + <CardsWrapper links={cardLinks} /> + <TabGrid header="Tutorials" client:visible tabs={exampleTutorials} /> + <QuickLinkCard links={quickLinks} /> + <ToolsUtilitiesGrid links={toolsAndUtilities} /> + <ResourceSection title="Resources" resources={exampleResources} /> + <ChangelogSnippet query="ccip" /> + + <MediaSection + heading="High-level architecture" + description="CCIP delivers cross-chain messages from a source chain to a destination chain by combining offchain consensus and onchain execution components." + image="/images/architecture.png" + /> +</OverviewWrapper> diff --git a/src/features/landing/sections/ProductTabs.astro b/src/features/landing/sections/ProductTabs.astro deleted file mode 100644 index 5e7a9b97b8d..00000000000 --- a/src/features/landing/sections/ProductTabs.astro +++ /dev/null @@ -1,8 +0,0 @@ ---- -import { Tabs } from "../components/Tabs" -import productTabs from "./ProductTabs.module.css" ---- - -<div class={productTabs.container}> - <Tabs client:idle /> -</div> diff --git a/src/features/landing/sections/ProductTabs.module.css b/src/features/landing/sections/ProductTabs.module.css deleted file mode 100644 index 8eed3c59bb1..00000000000 --- a/src/features/landing/sections/ProductTabs.module.css +++ /dev/null @@ -1,4 +0,0 @@ -.container { - padding-top: var(--space-6x); - padding-bottom: 60px; -} diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 73f06501528..2a8ae9cfa79 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -6,6 +6,8 @@ import Header from "~/components/Header/Header.astro" import { NewsletterCTA } from "~/components/Footer/NewsletterCTA" import Footer from "~/components/Footer/Footer.astro" import { Metadata, QuickstartsFrontmatter } from "~/content.config.ts" +import "@chainlink/blocks/src/theme/globals.css" + // interface Props { diff --git a/src/layouts/DocsLayout.astro b/src/layouts/DocsLayout.astro index 3693d42a46a..199dca3fcde 100644 --- a/src/layouts/DocsLayout.astro +++ b/src/layouts/DocsLayout.astro @@ -8,9 +8,9 @@ import WhatsNext from "~/components/PageContent/WhatsNext.astro" import type { MarkdownHeading } from "astro" import StickyHeader from "~/components/StickyHeader/StickyHeader" import BaseLayout from "./BaseLayout.astro" -import DocsNavigation from "~/components/DocsNavigation" import { VersionSelector } from "~/components/VersionSelector/index.js" import { detectApiReference } from "@components/VersionSelector/utils/versions" +import CardsWrapper from "~/components/Cards/CardsWrapper.astro" import { LanguageSwitcherDropdown } from "~/components/LanguageSwitcherDropdown" import { ChainTypeSelector } from "~/components/ChainSelector" import { isChainAwareSection } from "~/config/chainTypes" @@ -67,7 +67,6 @@ const howToSteps = initialHeadings > <slot name="head-scripts" slot="head-scripts" /> <StickyHeader client:media="(max-width: 50em)" {initialHeadings} /> - <DocsNavigation client:load pathname={currentPage} /> <main> <div id="left-bg"></div> <div class="layout"> @@ -145,11 +144,6 @@ const howToSteps = initialHeadings max-width: 1505px; } - #grid-left, - #left-bg { - background: #fafbfd; - } - #grid-left, #grid-right { display: flex; diff --git a/src/layouts/DocsV3Layout/DocsV3Layout.astro b/src/layouts/DocsV3Layout/DocsV3Layout.astro new file mode 100644 index 00000000000..05aa3478a5e --- /dev/null +++ b/src/layouts/DocsV3Layout/DocsV3Layout.astro @@ -0,0 +1,149 @@ +--- +import StickyHeader from "~/components/StickyHeader/StickyHeader" +import BaseLayout from "../BaseLayout.astro" +import { MarkdownHeading } from "astro" +import { BaseFrontmatter } from "~/content.config" +import * as CONFIG from "~/config" +import LeftSidebar from "~/components/LeftSidebar/LeftSidebar.astro" +import PageContent from "~/components/PageContent/PageContent.astro" + +interface Props { + frontmatter: BaseFrontmatter + headings?: MarkdownHeading[] +} +const { frontmatter, headings } = Astro.props + +const titleHeading: MarkdownHeading = { + text: frontmatter.title, + slug: "overview", + depth: 1, +} + +const filteredHeadings = headings?.filter((h) => h.depth < 5) +const initialHeadings = [titleHeading].concat(filteredHeadings ?? []) + +const formattedContentTitle = `${frontmatter.title} | ${CONFIG.SITE.title}` + +const currentPage = new URL(Astro.request.url).pathname + +const includeLinkToWalletScript = !!Astro.props.frontmatter.metadata?.linkToWallet +--- + +<BaseLayout title={formattedContentTitle} metadata={frontmatter.metadata} pageTitle={frontmatter.title}> + <StickyHeader client:media="(max-width: 50em)" {initialHeadings} /> + + <main> + <div id="left-bg"></div> + <div class="layout"> + <aside id="grid-left"> + <LeftSidebar currentPage={currentPage} section={frontmatter.section} /> + </aside> + <div id="grid-main"> + <PageContent + {titleHeading} + disableDefaultStyles={frontmatter.disableDefaultStyles} + hideTitle={frontmatter.hideTitle} + > + <slot /> + </PageContent> + </div> + </div> + </main> + + <style> + main { + margin-bottom: 0 !important; + } + + .layout { + display: grid; + grid-template-columns: auto; + --gutter: var(--space-6x); + --doc-padding: var(--space-6x); + margin-bottom: 0; + } + + #grid-left, + #grid-right { + display: none; + } + + #grid-main { + padding: var(--doc-padding) var(--gutter); + display: flex; + flex-direction: column; + margin-bottom: var(--space-10x); + min-width: 0; + } + + @media screen and (max-width: 768px) { + #grid-main { + padding: 0 var(--space-12x) var(--doc-padding) var(--space-12x); + } + } + + @media (min-width: 50em) { + main { + display: grid; + grid-template-columns: auto fit-content(100%) auto; + } + + .layout { + grid-template-columns: auto 1fr auto; + gap: var(--gutter); + width: 100vw; + max-width: 1505px; + } + + #grid-left, + #grid-right { + display: flex; + } + + #grid-main { + padding: 0 0 var(--doc-padding) 0; + } + + #grid-left { + width: 260px; + padding-left: var(--space-6x); + } + + #grid-right { + width: 0; + padding-right: 0; + transition: 300ms ease-in-out; + transition-property: width padding-right; + } + } + + @media (min-width: 992px) { + .layout { + gap: var(--doc-padding); + } + + #grid-left { + width: 350px; + padding-left: var(--space-6x); + } + } + + @media (min-width: 1200px) { + #grid-right { + width: 315px; + padding-right: var(--space-16x); + } + } + </style> + + <script define:vars={{ includeLinkToWalletScript }}> + window["includeLinkToWalletScript"] = includeLinkToWalletScript + </script> + + <script> + import "~/scripts" + if (window["includeLinkToWalletScript"]) { + import("~/scripts/link-to-wallet.ts") + } + </script> +</BaseLayout> diff --git a/src/layouts/DocsV3Layout/README.md b/src/layouts/DocsV3Layout/README.md new file mode 100644 index 00000000000..6d316fbf9ef --- /dev/null +++ b/src/layouts/DocsV3Layout/README.md @@ -0,0 +1,110 @@ +# DocsV3Layout Component Guide + +## What is DocsV3Layout? + +DocsV3Layout is the template that creates the standard layout for documentation pages on the Chainlink Docs website. Think of it as a "frame" that wraps around your content to give it a consistent look and feel. + +## What Does It Do? + +When you use this layout, it automatically creates: + +- **A left sidebar** with navigation links to help users find related pages +- **A main content area** where your documentation content appears +- **A header** that shows the page outline (on mobile devices) +- **Responsive design** that adapts to different screen sizes (mobile, tablet, desktop) + +## How to Use It + +### Basic Setup + +To use this layout for a documentation page, you need to specify it at the top of your Markdown file: + +``` +--- +layout: ~/layouts/DocsV3Layout/DocsV3Layout.astro +title: Your Page Title +section: your-section-name +--- + +Your content goes here... +``` + +### Required Information + +You need to provide two key pieces of information: + +1. **Title** - The name of your documentation page + - Example: `title: Getting Started with Chainlink` + +2. **Section** - Which documentation section this page belongs to + - Example: `section: quickstarts` + - This helps organize pages in the left sidebar navigation + +### Optional Information + +You can also include: + +- **Metadata** - Special settings for the page, like SEO information +- **Link to Wallet** - If your page needs blockchain wallet integration, add: + ``` + metadata: + linkToWallet: true + ``` + +## Example Usage + +Here's a complete example of how to set up a documentation page: + +``` +--- +layout: ~/layouts/DocsV3Layout/DocsV3Layout.astro +title: How to Use Chainlink Data Feeds +section: data-feeds +--- + +# How to Use Chainlink Data Feeds + +This guide will teach you how to use data feeds... + +## Step 1: Prerequisites + +Before you begin, make sure you have... + +## Step 2: Installation + +To install the required packages... +``` + +## What Happens Behind the Scenes + +When you use this layout: + +1. **Your title** becomes the main heading and appears in the page outline +2. **Your headings** (anything starting with `#`, `##`, `###`) are automatically collected and used for navigation +3. **The sidebar** is populated with links based on your section +4. **The layout adapts** to the user's screen size automatically + +## Layout Structure + +The page is divided into three columns: + +``` +┌──────────────┬─────────────────────┬──────────────┐ +│ │ │ │ +│ Left │ Main Content │ Right │ +│ Sidebar │ (Your Docs) │ Sidebar │ +│ (Navigation) │ │ (Future) │ +│ │ │ │ +└──────────────┴─────────────────────┴──────────────┘ +``` + +- **Left Sidebar**: Shows navigation for the current section +- **Main Content**: Your documentation content +- **Right Sidebar**: Reserved for future use (currently empty) + +## Tips for Best Results + +1. **Use clear headings** - Your headings create the page outline, so make them descriptive +2. **Keep titles concise** - The title appears in multiple places, so shorter is better +3. **Choose the right section** - Make sure your page is in the correct section so users can find it +4. **Limit heading depth** - Only headings up to level 4 (`####`) are included in the navigation diff --git a/src/layouts/TutorialLayout.astro b/src/layouts/TutorialLayout.astro index 6c572bb9647..c968d9cf957 100644 --- a/src/layouts/TutorialLayout.astro +++ b/src/layouts/TutorialLayout.astro @@ -7,7 +7,6 @@ import WhatsNext from "~/components/PageContent/WhatsNext.astro" import type { MarkdownHeading } from "astro" import StickyHeader from "~/components/StickyHeader/StickyHeader" import BaseLayout from "./BaseLayout.astro" -import DocsNavigation from "~/components/DocsNavigation" import { TutorialProgress } from "~/components/CCIP/TutorialProgress/TutorialProgress" interface Props { @@ -32,7 +31,6 @@ const formattedContentTitle = `${frontmatter.title} | ${SITE.title}` <BaseLayout title={formattedContentTitle} metadata={frontmatter.metadata}> <StickyHeader client:media="(max-width: 50em)" {initialHeadings} /> - <DocsNavigation client:load pathname={currentPage} /> <main> <div id="left-bg"></div> <div class="layout"> diff --git a/src/pages/ccip/index.astro b/src/pages/ccip/index.astro index 816caada5a7..cc8738a8ca7 100644 --- a/src/pages/ccip/index.astro +++ b/src/pages/ccip/index.astro @@ -1,6 +1,6 @@ --- -import DocsLayout from "~/layouts/DocsLayout.astro" import { getEntry, render } from "astro:content" +import DocsV3Layout from "~/layouts/DocsV3Layout/DocsV3Layout.astro" const entry = await getEntry("ccip", "index") if (!entry) { @@ -11,6 +11,6 @@ if (!entry) { const { Content, headings } = await render(entry) --- -<DocsLayout frontmatter={entry.data} {headings}> +<DocsV3Layout frontmatter={entry.data} {headings}> <Content /> -</DocsLayout> +</DocsV3Layout> diff --git a/src/pages/certification.astro b/src/pages/certification.astro new file mode 100644 index 00000000000..2753c60246a --- /dev/null +++ b/src/pages/certification.astro @@ -0,0 +1,933 @@ +--- +import BaseLayout from "~/layouts/BaseLayout.astro" +import { clsx } from "~/lib/clsx/clsx" +import { typographyVariants } from "@chainlink/blocks" + +const formattedContentTitle = `Courses | Chainlink Certifications` +--- + +<!-- NOTE: This page's HTML structure and styling are sourced from Webflow --> +<BaseLayout title={formattedContentTitle}> + <div class="overflow-hidden"> + <section id="demo" data-scroll="mid" class="sec-big sec-big--dark sec-big--light"> + <div class="w-layout-blockcontainer cont cont--cert w-container"> + <div class="demo-h-wrap"></div> + <div class="col col-cert"> + <div class="div-block-107"> + <h2 + class={clsx( + "display-500 display-500--dark", + typographyVariants({ + variant: "h2", + }) + )} + > + Supercharge your career with blockchain developer courses + </h2> + <p class="paragraph paragraph-certified"> + Get Chainlink certified on Cyfrin, with hands-on learning in Web3, blockchain, tokenization, and smart + contracts. Prove your skills and readiness to lead Chainlink-powered projects.<br /><br />Learn to build + secure dApps using Chainlink's core services—Data Feeds, VRF, Automation, and CCIP—through a + developer-focused certification course.<br />‍<br /> + </p> + <a + rel="noopener" + href="https://updraft.cyfrin.io/courses/chainlink-fundamentals" + target="_blank" + class="btn btn-primary btn-small btn-cert w-button">Start learning</a + > + </div> + <div class="margin-bottom space-4x"></div> + <div class="margin-bottom space-6x"></div> + <div> + <img src="/images/certification/image-certificate.svg" loading="lazy" alt="" class="image-22" /> + </div> + </div> + </div> + </section> + </div> + <div class="w-layout-blockcontainer cont w-container"> + <div class="sec-divider"></div> + </div> + <section class="sec-big sec-big--dark"> + <div class="w-layout-blockcontainer cont w-container"> + <div class="section-top"> + <div class="sec-tag sec-tag--blue">THE PLATFORM</div> + </div> + <h2 + class={clsx( + "display-500 display-500--white", + typographyVariants({ + variant: "h2", + }) + )} + > + The Learning Environment + </h2> + <div class="platform-tabs"> + <div class="plat-wrapper"> + <div class="plat-placeholder"></div><img + src="/images/certification/image-200.png" + loading="lazy" + 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" + /><img + src="/images/certification/image-201.png" + loading="lazy" + sizes="(max-width: 607px) 100vw, 607px" + srcset="/images/certification/image-201-p-500.png 500w, /images/certification/image-201.png 607w" + alt="" + class="plat-absolute plat-absolute--2" + /><img + src="/images/certification/image-1.png" + loading="lazy" + sizes="(max-width: 607px) 100vw, 607px" + srcset="/images/certification/image-1-p-500.png 500w, /images/certification/image-1.png 607w" + alt="" + class="plat-absolute plat-absolute--3" + /> + </div> + <div class="academy-accordion"> + <div class="acad-acc-item acad-acc-item--active"> + <div class="acad-acc-item__top"> + <h3 class="acad-acc-item__h">Hands-on learning built by experts</h3><img + src="/images/certification/Tailless--Arrow-Down.svg" + loading="lazy" + alt="" + class="acad-acc-item__arr" + /> + </div> + <p class="acad-acc-item__desc"> + Experience interactive learning where you'll engage in experiential learning through practical use + cases and coding exercises. Dive deep into real-world applications and build your skills with guided + practice. + </p> + </div> + <div class="acard-acc-item__divider"></div> + <div class="acad-acc-item"> + <div class="acad-acc-item__top"> + <h3 class="acad-acc-item__h">Practice your skills</h3><img + src="/images/certification/Tailless--Arrow-Down.svg" + loading="lazy" + width="16" + alt="" + class="acad-acc-item__arr" + /> + </div> + <p class="acad-acc-item__desc"> + Hands-on, high feedback quizzes and tests to grow your blockchain learning and challenge your smart + contract development. + </p> + </div> + <div class="acard-acc-item__divider"></div> + <div class="acad-acc-item"> + <div class="acad-acc-item__top"> + <h3 class="acad-acc-item__h">Become a certified Chainlink developer</h3><img + src="/images/certification/Tailless--Arrow-Down.svg" + loading="lazy" + alt="" + class="acad-acc-item__arr" + /> + </div> + <p class="acad-acc-item__desc"> + Achieve a prestigious certification that is highly regarded in the blockchain industry. This certification + not only validates your expertise but also significantly enhances your professional credibility and career + prospects. + </p> + </div> + <div class="acard-acc-item__divider"></div> + </div> + </div> + </div> + </section> + <section class="section-2"> + <section class="sec-big sec-big--light-bg"> + <div class="w-layout-blockcontainer cont w-container"> + <div class="section-top section-top__align-center"> + <div class="sec-tag">OTHER LEARNINGS</div> + </div> + <div class="center-wrap"> + <h2 + class={clsx( + "display-500 display-500--dark", + typographyVariants({ + variant: "h2", + }) + )} + > + Access free learning resources + </h2> + </div> + <div class="courses-wrap"> + <div class="course-row"> + <div class="course-col"> + <div class="course-card"> + <img src="/images/certification/image-learnings.svg" loading="lazy" alt="" class="cover-image" /> + <div class="course-card__content"> + <div class="course-card_top"> + <h3 class="course-card_h">Chainlink Developer Bootcamps</h3> + <p class="course-card__details"> + Chainlink gives blockchain developers an easy-to-use framework for writing onchain applications. + Join a bootcamp to learn how. + </p> + </div> + </div> + <div class="course-card_btn-wr"> + <a href="https://chain.link/bootcamp" class="btn btn-secondary btn-secondary--academy w-button" + >Explore</a + > + </div> + </div> + </div> + <div class="course-col"> + <div class="course-card"> + <img + 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" + /> + <div class="course-card__content"> + <div class="course-card_top"> + <h3 class="course-card_h">DevHub Videos</h3> + <p class="course-card__details"> + Start learning the basics of smart contracts with these step-by-step video tutorials made by + expert Chainlink Labs developers. + </p> + </div> + </div> + <div class="course-card_btn-wr"> + <a + href="https://dev.chain.link/resources/videos" + class="btn btn-secondary btn-secondary--academy w-button">Explore</a + > + </div> + </div> + </div> + <div class="course-col"> + <div class="course-card"> + <img + 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" + /> + <div class="course-card__content"> + <div class="course-card_top"> + <h3 class="course-card_h">DevHub Resources</h3> + <p class="course-card__details"> + Understand Chainlink's mission and platform by exploring tutorials, docs, blogs, and more, and + learn how Chainlink services underpin the blockchain industry. + </p> + </div> + </div> + <div class="course-card_btn-wr"> + <a href="https://dev.chain.link/resources" class="btn btn-secondary btn-secondary--academy w-button" + >Explore</a + > + </div> + </div> + </div> + </div> + </div> + </div> + </section> + </section> +</BaseLayout> + +<style> + /* CSS Variables */ + :root { + --mirage: #0c162c; + --biscay: #1a2b6b; + --foreground--link: #2e7bff; + --grey-600: #6d7380; + --grey-800: #3d4556; + --grey-500: #858a95; + --grey-700: #555c6c; + --mirage-10-11: #e7e8ea; + --chainlink-blue: #0847f7; + --white: white; + --grey200: #e4e8ed; + --zircon: #f5f7fd; + --perano: #a0b3f2; + --lavender: #dfe7fb; + --grey-300: #ced0d5; + --mirage-90: #252e42; + --mirage-40: #9ea2ab; + --grey-400: #9fa7b2; + --blue-400: #8ca5e1; + --blue-100: #f5f7fd; + --green--400: #38b562; + --grey-900: #191c21; + } + + /* Base container */ + .cont { + grid-column-gap: 16px; + grid-row-gap: 16px; + flex-flow: row; + grid-template-rows: auto auto; + grid-template-columns: 1fr 1fr; + grid-auto-columns: 1fr; + width: 100%; + max-width: 1290px; + margin-left: auto; + margin-right: auto; + padding-left: 32px; + padding-right: 32px; + display: block; + } + + .cont.cont--cert { + grid-column-gap: 16px; + grid-row-gap: 16px; + grid-template-rows: auto auto; + grid-template-columns: 1fr 1fr; + grid-auto-columns: 1fr; + display: block; + } + + /* Column layouts */ + .col.col-cert { + grid-column-gap: 16px; + grid-row-gap: 16px; + vertical-align: baseline; + flex-flow: row; + grid-template-rows: auto auto; + grid-template-columns: 1fr 1fr; + grid-auto-columns: 1fr; + justify-content: space-between; + align-self: auto; + align-items: flex-start; + width: auto; + height: auto; + margin-top: -58px; + padding-left: 0; + padding-right: 0; + display: flex; + } + + .div-block-107 { + width: 624px; + } + + .image-22 { + display: block; + } + + /* Typography */ + .display-500 { + color: var(--biscay); + letter-spacing: -0.02em; + margin-top: 0; + margin-bottom: 0; + font-size: 3rem; + font-weight: 500; + line-height: 1.2em; + } + + .display-500.display-500--dark { + color: var(--mirage); + } + + .display-500.display-500--white { + color: #fff; + } + + .paragraph { + color: var(--grey-600); + margin-bottom: 0; + } + + .paragraph.paragraph-certified { + flex: 0 auto; + width: 624px; + height: 144px; + margin-top: 24px; + margin-bottom: 24px; + padding-top: 0; + padding-left: 0; + position: static; + } + + /* Buttons */ + .btn { + border: 1px solid var(--mirage-10-11); + background-color: var(--mirage-10-11); + box-shadow: none; + color: var(--grey-600); + border-radius: 4px; + padding: 16px 32px; + line-height: 20px; + text-decoration: none; + display: inline-block; + } + + .btn.btn-primary { + border-color: var(--chainlink-blue); + background-color: var(--chainlink-blue); + color: var(--white); + transition: + border-color 0.2s, + background-color 0.2s; + } + + .btn.btn-primary:hover { + background-color: #0036c9; + border-color: #0036c9; + } + + .btn.btn-primary.btn-small { + margin-left: 24px; + padding: 8px 24px; + font-size: 14px; + line-height: 24px; + } + + .btn.btn-primary.btn-small.btn-cert { + float: none; + clear: none; + text-align: center; + vertical-align: baseline; + width: 156px; + margin-bottom: 8px; + margin-left: 0; + padding-left: 24px; + display: inline-block; + position: static; + inset: auto auto 0% 0%; + } + + .btn.btn-secondary { + color: #0847f7; + background-color: #fff; + border: 1px solid #639cff; + transition: + background-color 0.3s, + border-color 0.3s, + color 0.3s; + } + + .btn.btn-secondary:hover { + border-color: #0d5dff; + } + + .btn.btn-secondary.btn-secondary--academy { + justify-content: center; + align-items: flex-start; + width: 100%; + padding-top: 12px; + padding-bottom: 12px; + display: flex; + } + + /* Sections */ + .sec-big { + padding-top: 100px; + padding-bottom: 100px; + overflow: visible; + } + + .sec-big.sec-big--dark { + background-color: var(--mirage); + color: var(--mirage); + } + + .sec-big.sec-big--dark.sec-big--light { + background-color: var(--white); + } + + .sec-big.sec-big--light-bg { + background-color: var(--white); + padding-bottom: 140px; + } + + .sec-tag { + color: var(--grey-600); + letter-spacing: 1.28px; + text-transform: uppercase; + font-weight: 500; + } + + .sec-tag.sec-tag--blue { + color: var(--perano); + } + + .section-top { + justify-content: space-between; + margin-bottom: 16px; + display: flex; + } + + .section-top.section-top__align-center { + justify-content: center; + } + + .sec-divider { + background-color: var(--lavender); + width: 100%; + height: 1px; + } + + /* Course cards */ + .course-card { + grid-column-gap: 24px; + grid-row-gap: 24px; + border: 1px solid var(--grey-400); + border-radius: 8px; + flex-flow: column; + flex: 1; + height: 96%; + padding: 0 0 24px; + transition: + box-shadow 0.2s, + border-color 0.2s; + display: flex; + position: relative; + overflow: hidden; + } + + .course-card:hover { + border-color: var(--chainlink-blue); + box-shadow: 0 8px 40px #0c162c1f; + } + + .course-card__img-wrap { + flex: 0 auto; + align-self: auto; + width: 100%; + height: 100%; + display: block; + position: relative; + } + + .course-card__content { + grid-column-gap: 12px; + grid-row-gap: 12px; + background-color: #fff; + flex-flow: column; + flex: 1; + + padding: 16px; + display: flex; + } + + .course-card_top { + margin-top: 0; + } + + .course-card_h { + color: var(--biscay); + width: 325.33px; + margin-top: 0; + margin-bottom: 10px; + font-size: 22px; + font-weight: 500; + line-height: 28px; + } + + .course-card__details { + color: var(--mirage); + flex-flow: wrap; + justify-content: flex-start; + align-items: center; + margin-bottom: 12px; + display: flex; + } + + .course-card_btn-wr { + height: 40px; + margin-left: auto; + margin-right: auto; + width: 90%; + } + + .course-col { + box-sizing: border-box; + grid-column-gap: 24px; + grid-row-gap: 24px; + flex-flow: row; + order: 1; + grid-template-rows: auto auto; + grid-template-columns: 1fr 1fr; + grid-auto-columns: 1fr; + justify-content: space-between; + align-items: stretch; + width: 373.33px; + max-width: none; + height: 573px; + margin: 0 auto; + padding: 20px 0; + display: flex; + } + + .course-row { + grid-column-gap: 16px; + grid-row-gap: 16px; + flex-flow: wrap; + grid-template: ". . Area" / 1fr 1fr 1fr; + grid-auto-columns: 1fr; + justify-content: space-between; + align-items: stretch; + width: 1200px; + height: 473px; + margin: -20px; + display: flex; + } + + .courses-wrap { + grid-column-gap: 16px; + grid-row-gap: 16px; + flex-flow: row; + grid-template: ". Area" ". ." / 1fr 1fr 1fr; + grid-auto-columns: 1fr; + justify-content: space-between; + align-items: stretch; + width: 1200px; + max-width: 1200px; + margin-top: 48px; + margin-left: auto; + margin-right: auto; + display: flex; + overflow: visible; + } + + .cover-image { + box-sizing: border-box; + object-fit: cover; + width: 100%; + height: auto; + aspect-ratio: 16/9; + margin-top: 0; + padding-bottom: 0; + padding-right: 0; + } + + /* Accordion */ + .acad-acc-item__h { + color: var(--grey-600); + flex: 1; + margin-top: 0; + margin-bottom: 0; + margin-right: 24px; + font-size: 28px; + font-weight: 700; + line-height: 32px; + } + + .acad-acc-item__desc { + color: var(--grey-600); + height: 0; + margin-bottom: 0; + transition: all 0.2s; + overflow: hidden; + } + + .acad-acc-item__top { + cursor: pointer; + justify-content: flex-start; + align-items: center; + padding-top: 24px; + padding-bottom: 24px; + display: flex; + } + + .acard-acc-item__divider { + background-color: var(--grey-800); + width: 100%; + height: 1px; + } + + .acad-acc-item__arr { + display: block; + overflow: clip; + } + + .academy-accordion { + flex: 1; + width: 100%; + max-width: 460px; + min-height: 460px; + } + + .platform-tabs { + justify-content: space-between; + align-items: center; + margin-top: 64px; + display: flex; + } + + .plat-absolute { + aspect-ratio: 16 / 9; + border-radius: 16px; + width: 95%; + transition: transform 0.2s; + position: absolute; + bottom: 0; + right: 0; + overflow: hidden; + } + + .plat-absolute.plat-absolute--1 { + z-index: 3; + transform: translate(0, 0); + } + + .plat-absolute.plat-absolute--2 { + z-index: 2; + transform: translate(-16px, -16px); + } + + .plat-absolute.plat-absolute--3 { + z-index: 1; + transform: translate(-32px, -32px); + } + + .plat-wrapper { + width: 50%; + max-width: 600px; + margin-left: 32px; + margin-right: 40px; + position: relative; + } + + .plat-placeholder { + aspect-ratio: 16 / 9; + } + + /* Layout helpers */ + .center-wrap { + grid-column-gap: 8px; + grid-row-gap: 8px; + text-align: center; + flex-flow: column; + justify-content: flex-start; + align-items: center; + display: flex; + } + + .course-left-shape { + z-index: -1; + position: absolute; + inset: 0% auto auto 0%; + } + + .relative-div { + position: relative; + } + + .relative-div.relative-div--overflow-hidden, + .overflow-hidden { + overflow: hidden; + } + + .margin-bottom.space-4x { + margin-top: 0; + margin-bottom: 16px; + padding: 0; + } + + .margin-bottom.space-6x { + margin-top: 0; + margin-bottom: 24px; + padding: 0; + } + + .demo-h-wrap { + width: 60%; + margin-bottom: 64px; + } + + .section-2 { + background-color: #f5f7fd; + } + + .w-container:before, + .w-container:after { + content: " "; + display: table; + grid-column-start: 1; + grid-row-start: 1; + grid-column-end: 2; + grid-row-end: 2; + } + + .w-container:after { + clear: both; + } + + .w-button { + display: inline-block; + padding: 9px 15px; + background-color: #3898ec; + color: white; + border: 0; + line-height: inherit; + text-decoration: none; + cursor: pointer; + } + + /* Responsive styles */ + @media screen and (max-width: 991px) { + .w-container { + max-width: 728px; + } + + .cont { + padding-left: 24px; + padding-right: 24px; + } + + .demo-h-wrap { + width: 80%; + } + + .col.col-cert { + flex-flow: column; + margin-top: 0; + } + + .div-block-107 { + width: 100%; + } + + .paragraph.paragraph-certified { + width: 100%; + height: auto; + } + + .platform-tabs { + flex-direction: column; + } + + .plat-wrapper { + width: 90%; + margin-left: 0; + margin-right: 0; + margin-bottom: 40px; + } + + .academy-accordion { + max-width: 100%; + min-height: auto; + } + + .course-row { + width: 100%; + height: auto; + flex-direction: column; + margin: 0; + } + + .course-col { + width: 100%; + height: auto; + padding: 0; + margin-bottom: 20px; + } + + .courses-wrap { + width: 100%; + height: auto; + flex-direction: column; + } + + .display-500 { + font-size: 2rem; + } + + .sec-big { + padding-top: 60px; + padding-bottom: 60px; + } + } + + @media screen and (max-width: 767px) { + .w-container { + max-width: none; + } + + .demo-h-wrap { + width: 100%; + margin-bottom: 40px; + } + + .display-500 { + font-size: 2rem; + } + + .acad-acc-item__h { + font-size: 20px; + line-height: 28px; + } + } +</style> + +<style> + .acad-acc-item.acad-acc-item--active .acad-acc-item__desc { + height: auto; + padding-bottom: 24px; + } + .acad-acc-item.acad-acc-item--active .acad-acc-item__h { + color: white; + } + .acad-acc-item.acad-acc-item--active .acad-acc-item__arr { + transform: rotate(-180deg); + } + .acad-acc-item__top:hover .acad-acc-item__h { + color: white; + transition: 200ms ease; + } +</style> + +<script> + // Accordion functionality + document.addEventListener("DOMContentLoaded", function () { + var popularResCols = document.querySelectorAll(".acad-acc-item") + popularResCols.forEach(function (popularResCol) { + popularResCol.addEventListener("click", function () { + if (!this.classList.contains("acad-acc-item--active")) { + // Remove 'acad-acc-item--active' class from all elements + popularResCols.forEach(function (col) { + col.classList.remove("acad-acc-item--active") + }) + // Add 'acad-acc-item--active' class to the clicked element + this.classList.add("acad-acc-item--active") + } + }) + }) + }) + + // Image stack rotation + const items = document.querySelectorAll(".acad-acc-item") + const absoluteItems = document.querySelectorAll(".plat-absolute") + + // Define the z-index and transform pairs + const zIndexValues = [3, 2, 1] + const transformValues = [ + "translate(0, 0)", // For z-index 3 + "translate(-16px, -16px)", // For z-index 2 + "translate(-32px, -32px)", // For z-index 1 + ] + + items.forEach((item, index) => { + item.addEventListener("click", function () { + // Apply z-index and transform based on the clicked index + absoluteItems.forEach((el, i) => { + const htmlEl = el as HTMLElement + const newIndex = (i - index + absoluteItems.length) % absoluteItems.length + htmlEl.style.zIndex = zIndexValues[newIndex].toString() + htmlEl.style.transform = transformValues[newIndex] + }) + }) + }) +</script> diff --git a/src/pages/index.astro b/src/pages/index.astro index 0c08784a072..3ea40693d4d 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,35 +1,77 @@ --- -import ProductTabs from "../features/landing/sections/ProductTabs.astro" -import LandingLayout from "../layouts/LandingLayout.astro" -import HeroCTA from "../features/landing/sections/HeroCTA.astro" +import JourneyCards from "~/components/JourneyCards/JourneyCards.astro" +import TechnicalStandards from "~/components/TechnicalStandards/TechnicalStandards.astro" import BaseLayout from "~/layouts/BaseLayout.astro" import * as CONFIG from "../config" +import Demos from "~/components/Demos.astro" +import { Typography } from "@chainlink/blocks" +import LandingHero from "~/components/LandingHero/LandingHero.astro" +import TryItOut from "~/components/TryItOut/TryItOut.astro" +import CommunityEvents from "~/components/CommunityEvents/CommunityEvents.astro" const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.title}` --- <BaseLayout title={formattedContentTitle}> <main> - <div class="heroContainer"> - <div class="hero"> - <h1>Chainlink Developer Docs</h1> - <h2>What are you building?</h2> - <ProductTabs /> - </div> + <LandingHero /> + + <div class="wrapper"> + <JourneyCards /> </div> - <div class="recommended"> - <h4>Recommended reading</h4> - <h2>We think you'd love to explore</h2> - <div> - <a href="/getting-started/conceptual-overview">General</a> - <a href="/resources/link-token-contracts">Link Token Contracts</a> - <a href="/ccip/getting-started">Getting Started with CCIP</a> - <a href="/ccip/directory">CCIP Directory</a> - <a href="/data-feeds/price-feeds/addresses">Data Feed Addresses</a> - <a href="/data-feeds/smartdata/addresses">SmartData Feed Addresses</a> - <a href="/data-streams/getting-started-hardhat">Getting Started with Data Streams</a> - <a href="/data-streams/crypto-streams">Data Streams Addresses</a> + + <TryItOut + accordionTabs={[ + { + title: "Transfer Tokens Between Chains", + text: "Use Chainlink CCIP to transfer tokens from a smart contract to an account on a different blockchain.", + codeSampleSrc: "/samples/ChainlinkFunctions/FunctionsConsumerDecoder.sol", + }, + { + title: "Leverage MVR feeds", + text: "Use Multiple-Variable Response (MVR) feeds data in your consumer contracts on EVM chains using Solidity.", + codeSampleSrc: "/samples/ChainlinkFunctions/AutomatedFunctionsConsumerExample.sol", + }, + { + title: "Fetch and Decode Real World Asset Streams", + text: "Use the Data Streams SDK for Go/Rust to fetch and decode reports from the Data Streams Aggregation Network.", + codeSampleSrc: "/samples/ChainlinkFunctions/GettingStartedFunctionsConsumer.sol", + }, + { + title: "Automate your Functions", + text: "Use Chainlink Automation to trigger the same functions regularly, such as fetching weather data daily or fetching an asset price on every block.", + codeSampleSrc: "/samples/ChainlinkFunctions/AutomatedFunctionsConsumerExample.sol", + }, + ]} + ctas={[ + { text: "Create CRE account", href: "#", variant: "primary" }, + { text: "Get the SDK", href: "#", variant: "secondary" }, + ]} + /> + + <div class="wrapper"> + <Demos /> + + <TechnicalStandards /> + </div> + + <CommunityEvents /> + + <div class="wrapper"> + <div class="recommended"> + <h4>Recommended reading</h4> + <h2>We think you'd love to explore</h2> + <div> + <a href="/getting-started/conceptual-overview">General</a> + <a href="/resources/link-token-contracts">Link Token Contracts</a> + <a href="/ccip/getting-started">Getting Started with CCIP</a> + <a href="/ccip/directory">CCIP Directory</a> + <a href="/data-feeds/price-feeds/addresses">Data Feed Addresses</a> + <a href="/data-feeds/smartdata/addresses">SmartData Feed Addresses</a> + <a href="/data-streams/getting-started-hardhat">Getting Started with Data Streams</a> + <a href="/data-streams/crypto-streams">Data Streams Addresses</a> + </div> </div> </div> </main> @@ -134,6 +176,15 @@ const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.titl background-color: var(--blue-100); } + .wrapper { + display: flex; + flex-direction: column; + max-width: var(--fullwidth-max-width); + padding: 0 var(--space-10x); + gap: 36px; + } + + /*800px*/ @media (min-width: 50em) { .hero { max-width: var(--fullwidth-max-width); @@ -159,11 +210,6 @@ const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.titl font-weight: 600; } - .recommended { - margin: var(--space-16x) auto; - max-width: var(--fullwidth-max-width); - } - .heroContainer { background: linear-gradient(180deg, #f1f5fe 0%, white 100%); } @@ -178,8 +224,14 @@ const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.titl line-height: var(--space-6x); margin-bottom: var(--space-2x); } + + .wrapper { + gap: 82px; + } } - @media (min-width: 72em) { + + /* 992px */ + @media (min-width: 62em) { .hero { max-width: min(1200px, calc(100% - 2 * var(--space-16x))); padding: 0; @@ -189,5 +241,10 @@ const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.titl max-width: min(1200px, calc(100% - 2 * var(--space-16x))); padding: 0; } + + .wrapper { + margin: 0 auto; + margin-top: 60px; + } } </style> diff --git a/src/stores/tryItOutStore.ts b/src/stores/tryItOutStore.ts new file mode 100644 index 00000000000..fe13f6662e9 --- /dev/null +++ b/src/stores/tryItOutStore.ts @@ -0,0 +1,3 @@ +import { atom } from "nanostores" + +export const activeAccordionIndex = atom(0) diff --git a/src/styles/index.css b/src/styles/index.css index 8593eab6ab5..c282cc9327f 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -1,6 +1,6 @@ -/* +/* * Global styles and CSS variables - * + * * This file contains: * 1. CSS reset and base styles * 2. Global CSS variables for theming diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 00000000000..3dc5b2f5d48 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,4 @@ +import baseConfig from "@chainlink/blocks/src/theme/base" +/** @type {import('tailwindcss').Config} */ + +export default baseConfig diff --git a/tsconfig.json b/tsconfig.json index b5df96aeb68..b718b196200 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "target": "ESNext", "module": "NodeNext", "moduleResolution": "nodenext", + "allowImportingTsExtensions": true, "resolveJsonModule": true, "isolatedModules": true, "esModuleInterop": true, From 716e1d995f7f253e01b7bd327efb3ef646484559 Mon Sep 17 00:00:00 2001 From: Syed Asad Kazmi <36279345+SyedAsadKazmi@users.noreply.github.com> Date: Wed, 26 Nov 2025 15:02:42 +0530 Subject: [PATCH 003/214] Update Aptos Service Limits (#3224) * Update Aptos Service Limits * Update --------- Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> --- src/content/ccip/service-limits/aptos.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/ccip/service-limits/aptos.mdx b/src/content/ccip/service-limits/aptos.mdx index 01d49e476d2..bc0918f6deb 100644 --- a/src/content/ccip/service-limits/aptos.mdx +++ b/src/content/ccip/service-limits/aptos.mdx @@ -27,7 +27,7 @@ These limits apply to messages sent from an EVM-compatible chain to the Aptos bl | Message execution gas limit | The user-specified `gasLimit` in `extraArgs` for the execution of the `ccip_receive` function on Aptos. | 100,000 gas | | Maximum number of tokens | The maximum number of distinct tokens that can be transferred in a single transaction. | 1 | | Smart Execution time window | The maximum duration that CCIP will attempt to automatically execute a message on Aptos before manual execution is required. | 8 hours | -| Token pool execution gas limit | The default gas overhead allocated for a standard token transfer operation on Aptos when a message is received from an EVM chain. | 36 gas | +| Token pool execution gas limit | The default gas overhead allocated for a standard token transfer operation on Aptos when a message is received from an EVM chain. | 10,000 gas | | Out of Order execution | The `allowOutOfOrderExecution` parameter in the `extraArgs` of a CCIP message from an EVM chain. | Must be `true` | ## Aptos to EVM @@ -37,8 +37,8 @@ These limits apply to messages sent from the Aptos blockchain to an EVM-compatib | Item | Description | Limit | | :----------------------------- | :------------------------------------------------------------------------------------------------------------------------- | :------------- | | Maximum message data length | The `data` payload sent within the [CCIP message](/ccip/api-reference/aptos/v1.6.0/messages#aptos2anymessage). | 30,000 bytes | -| Message execution gas limit | The user-specified `gasLimit` in `extraArgs` for the execution of the `ccipReceive` function on the destination EVM chain. | 100,000 gas | +| Message execution gas limit | The user-specified `gasLimit` in `extraArgs` for the execution of the `ccipReceive` function on the destination EVM chain. | 3,000,000 gas | | Maximum number of tokens | The maximum number of distinct tokens that can be transferred in a single transaction. | 1 | | Smart Execution time window | The maximum duration for the execution of a CCIP message on the destination EVM chain. | 8 hours | -| Token pool execution gas limit | The default gas overhead for executing token pool logic on the destination EVM chain for a standard token transfer. | 36 gas | +| Token pool execution gas limit | The default gas overhead for executing token pool logic on the destination EVM chain for a standard token transfer. | 90,000 gas | | Out of Order execution | The `allow_out_of_order_execution` parameter in the `extraArgs` of a CCIP message from Aptos. | Must be `true` | From 4eac4b0223f6a42ead8eccd9648387b45edfd1ad Mon Sep 17 00:00:00 2001 From: "Amine E." <aelmanaa@users.noreply.github.com> Date: Wed, 26 Nov 2025 16:46:56 +0100 Subject: [PATCH 004/214] vooi (#3228) --- .../data/ccip/v1_2_0/mainnet/lanes.json | 428 +++++++++++++++++- .../data/ccip/v1_2_0/mainnet/tokens.json | 65 +++ 2 files changed, 489 insertions(+), 4 deletions(-) diff --git a/src/config/data/ccip/v1_2_0/mainnet/lanes.json b/src/config/data/ccip/v1_2_0/mainnet/lanes.json index 44c5b37f23c..03b56166fc6 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/mainnet/lanes.json @@ -1262,6 +1262,48 @@ "version": "1.6.0" }, "supportedTokens": { + "avETH": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avETHx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "savBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "savETH": { "rateLimiterConfig": { "in": { @@ -1686,6 +1728,20 @@ } } }, + "savBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "savETH": { "rateLimiterConfig": { "in": { @@ -1700,6 +1756,20 @@ } } }, + "savUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "SDY": { "rateLimiterConfig": { "in": { @@ -5171,6 +5241,20 @@ } } }, + "savBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "savUSD": { "rateLimiterConfig": { "in": { @@ -5773,6 +5857,34 @@ } } }, + "savBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "savUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "SDT": { "rateLimiterConfig": { "in": { @@ -6039,6 +6151,20 @@ } } }, + "VOOI": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "VSN": { "rateLimiterConfig": { "in": { @@ -15759,6 +15885,48 @@ "version": "1.6.0" }, "supportedTokens": { + "avETH": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avETHx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "savBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "savETH": { "rateLimiterConfig": { "in": { @@ -15883,6 +16051,20 @@ } } }, + "savBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "savUSD": { "rateLimiterConfig": { "in": { @@ -16221,6 +16403,34 @@ } } }, + "avETH": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avETHx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "BONE": { "rateLimiterConfig": { "in": { @@ -16277,6 +16487,20 @@ } } }, + "savBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "savETH": { "rateLimiterConfig": { "in": { @@ -16291,6 +16515,20 @@ } } }, + "savUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "SHIB": { "rateLimiterConfig": { "in": { @@ -20392,6 +20630,20 @@ } } }, + "savBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "savETH": { "rateLimiterConfig": { "in": { @@ -20406,6 +20658,20 @@ } } }, + "savUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "SDY": { "rateLimiterConfig": { "in": { @@ -21031,14 +21297,14 @@ "uniBTC": { "rateLimiterConfig": { "in": { - "capacity": "2", + "capacity": "200000000", "isEnabled": true, - "rate": "1" + "rate": "2315" }, "out": { - "capacity": "2", + "capacity": "200000000", "isEnabled": true, - "rate": "1" + "rate": "2315" } } } @@ -21427,6 +21693,34 @@ } } }, + "savBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "savUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "SDT": { "rateLimiterConfig": { "in": { @@ -21693,6 +21987,20 @@ } } }, + "VOOI": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "VSN": { "rateLimiterConfig": { "in": { @@ -24377,6 +24685,34 @@ } } }, + "avETH": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avETHx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "BONE": { "rateLimiterConfig": { "in": { @@ -24433,6 +24769,20 @@ } } }, + "savBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "savETH": { "rateLimiterConfig": { "in": { @@ -24447,6 +24797,20 @@ } } }, + "savUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "SHIB": { "rateLimiterConfig": { "in": { @@ -26359,6 +26723,20 @@ } } }, + "savUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "syrupUSDT": { "rateLimiterConfig": { "in": { @@ -26537,6 +26915,20 @@ "rate": "462963" } } + }, + "savUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } }, @@ -30309,6 +30701,20 @@ } } }, + "savUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "syrupUSDT": { "rateLimiterConfig": { "in": { @@ -30774,6 +31180,20 @@ "rate": "462963" } } + }, + "savUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } }, diff --git a/src/config/data/ccip/v1_2_0/mainnet/tokens.json b/src/config/data/ccip/v1_2_0/mainnet/tokens.json index 23ddec47093..aa901b607fb 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/mainnet/tokens.json @@ -184,6 +184,15 @@ "symbol": "avETH", "tokenAddress": "0x223767286Be11d09Ae778fF608687fe858d3A2b4" }, + "ethereum-mainnet-linea-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "avETH", + "poolAddress": "0x9b52Ab55cFA7aB0079f84390b24Fdc0e5bF5Ab6F", + "poolType": "burnMint", + "symbol": "avETH", + "tokenAddress": "0x3449A9155Afc1Bab56A572FdfE22A3a2B803AaC4" + }, "mainnet": { "allowListEnabled": false, "decimals": 18, @@ -204,6 +213,15 @@ "symbol": "avETHx", "tokenAddress": "0xDA63630094Aa23B7a49368b713d68dD98F547f98" }, + "ethereum-mainnet-linea-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "avETH MAX", + "poolAddress": "0x37912A5e451DC711D357E2dC6Bf9035235d6771f", + "poolType": "burnMint", + "symbol": "avETHx", + "tokenAddress": "0x01C9ABFebCDcb53E72bF017Fc1D17F9DB38F722a" + }, "mainnet": { "allowListEnabled": false, "decimals": 18, @@ -4038,6 +4056,24 @@ "poolType": "burnMint", "symbol": "savBTC", "tokenAddress": "0x19452d507b2738aDB8942cD2b0d52BB519f1790a" + }, + "ethereum-mainnet-linea-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "Staked avBTC", + "poolAddress": "0x5b0B44bB38E23193111e7AA03E380Ba841e58B17", + "poolType": "burnMint", + "symbol": "savBTC", + "tokenAddress": "0x45cF31aF4d67899674B50ab14093b55006fFf563" + }, + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Staked avBTC", + "poolAddress": "0x78991cd8ADDf98672A1201D70c6db46e21C25C57", + "poolType": "burnMint", + "symbol": "savBTC", + "tokenAddress": "0x92181c6f0FED1f1A30c0Ec131f41577F81924bf5" } }, "savETH": { @@ -4097,6 +4133,15 @@ "symbol": "savUSD", "tokenAddress": "0x5C247948fD58Bb02B6c4678d9940F5e6B9af1127" }, + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Staked avUSD", + "poolAddress": "0x6d3B65eB14ad3546ab4Aa32cf8645a3610a9737b", + "poolType": "burnMint", + "symbol": "savUSD", + "tokenAddress": "0xb8D89678E75a973E74698c976716308abB8a46A4" + }, "plasma-mainnet": { "allowListEnabled": false, "decimals": 18, @@ -6328,6 +6373,26 @@ "tokenAddress": "6FrrzDk5mQARGc1TDYoyVnSyRdds1t4PbtohCD6p3tgG" } }, + "VOOI": { + "bsc-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "VOOI", + "poolAddress": "0x4D275A287B86E423E01CceE66F4e3313B5F47Cf7", + "poolType": "burnMint", + "symbol": "VOOI", + "tokenAddress": "0x876cEcb73c9ED1B1526F8e35C6a5a51a31BCF341" + }, + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "VOOI", + "poolAddress": "0x8B8461F822FDb00943C2c7d42aa17e1CDd5626F1", + "poolType": "lockRelease", + "symbol": "VOOI", + "tokenAddress": "0xb31561F0e2aaC72406103b1926356D756F07A481" + } + }, "VRTX": { "avalanche-mainnet": { "allowListEnabled": false, From 2275b3fd9d03e81634a890bf7bc99eca2c8522f2 Mon Sep 17 00:00:00 2001 From: Syed Asad Kazmi <36279345+SyedAsadKazmi@users.noreply.github.com> Date: Thu, 27 Nov 2025 09:51:07 +0530 Subject: [PATCH 005/214] Update RMN tooltip in CCIP Directory (#3230) --- src/components/CCIP/ChainHero/ChainHero.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/CCIP/ChainHero/ChainHero.tsx b/src/components/CCIP/ChainHero/ChainHero.tsx index bbeba6b171f..6d49ef92b17 100644 --- a/src/components/CCIP/ChainHero/ChainHero.tsx +++ b/src/components/CCIP/ChainHero/ChainHero.tsx @@ -189,7 +189,7 @@ function ChainHero({ chains, tokens, network, token, environment, lanes }: Chain RMN <Tooltip label="" - tip="The RMN contract verifies RMN blessings, and is used to curse." + tip="The RMN contract is used to curse." labelStyle={{ marginRight: "8px", }} From c622ee2b97ebd8364bfced65997bc39cbc63f8aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 10:17:00 +0000 Subject: [PATCH 006/214] Bump astro from 5.16.0 to 5.16.3 in the astro-framework group (#3234) * Bump astro from 5.16.0 to 5.16.3 in the astro-framework group Bumps the astro-framework group with 1 update: [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro). Updates `astro` from 5.16.0 to 5.16.3 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/astro@5.16.3/packages/astro) --- updated-dependencies: - dependency-name: astro dependency-version: 5.16.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: astro-framework ... Signed-off-by: dependabot[bot] <support@github.com> * fix --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- .github/workflows/test.yml | 21 +++++++++------------ package-lock.json | 14 +++++++------- package.json | 2 +- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c7c86de98a9..98ed932ceca 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: @@ -26,7 +27,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' @@ -55,7 +56,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' @@ -102,7 +103,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' @@ -141,7 +142,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' @@ -173,7 +174,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: '20' + node-version: ${{ env.NODE_VERSION }} cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -205,19 +206,15 @@ jobs: jest: needs: [setup] runs-on: ubuntu-latest - strategy: - matrix: - node-version: [20.x] - fail-fast: false steps: - name: Checkout Repo uses: actions/checkout@v6 - - name: Setup Node.js ${{ matrix.node-version }} + - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: ${{ matrix.node-version }} + node-version: ${{ env.NODE_VERSION }} cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -242,6 +239,6 @@ jobs: if: always() uses: actions/upload-artifact@v5 with: - name: coverage-report-node-${{ matrix.node-version }} + name: coverage-report-node-${{ env.NODE_VERSION }} path: coverage/ retention-days: 30 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 878480f9781..4aa44db8cbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "@solana/wallet-adapter-solflare": "^0.6.32", "@solana/wallet-adapter-trust": "^0.1.17", "@supabase/supabase-js": "^2.84.0", - "astro": "^5.16.0", + "astro": "^5.16.3", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", "clipboard": "^2.0.11", @@ -16696,9 +16696,9 @@ } }, "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.16.3", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.3.tgz", + "integrity": "sha512-KzDk41F9Dspf5fM/Ls4XZhV4/csjJcWBrlenbnp5V3NGwU1zEaJz/HIyrdKdf5yw+FgwCeD2+Yos1Xkx9gnI0A==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.13.0", @@ -16746,7 +16746,7 @@ "rehype": "^13.0.2", "semver": "^7.7.3", "shiki": "^3.15.0", - "smol-toml": "^1.5.0", + "smol-toml": "^1.5.2", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", @@ -16754,7 +16754,7 @@ "ultrahtml": "^1.6.0", "unifont": "~0.6.0", "unist-util-visit": "^5.0.0", - "unstorage": "^1.17.2", + "unstorage": "^1.17.3", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", @@ -16762,7 +16762,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.0", "zod-to-ts": "^1.2.0" }, "bin": { diff --git a/package.json b/package.json index 0bf30cc7c44..97d7018931b 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "@solana/wallet-adapter-solflare": "^0.6.32", "@solana/wallet-adapter-trust": "^0.1.17", "@supabase/supabase-js": "^2.84.0", - "astro": "^5.16.0", + "astro": "^5.16.3", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", "clipboard": "^2.0.11", From f00cec13a5e6957263db694fa34a32c5862f6476 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 10:27:59 +0000 Subject: [PATCH 007/214] CCT: Update changelog with new tokens (#3233) Co-authored-by: khadni <98668332+khadni@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> --- public/changelog.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/public/changelog.json b/public/changelog.json index de6336e6eb0..e9b953630d0 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -342,6 +342,21 @@ } }, "data": [ + { + "category": "integration", + "date": "2025-11-30", + "description": "Newly supported tokens: VOOI", + "relatedTokens": [ + { + "assetName": "VOOI", + "baseAsset": "VOOI", + "url": "https://docs.chain.link/ccip/directory/mainnet/token/VOOI", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/vooi.webp?auto=compress%2Cformat&q=60&w=40&h=40&fit=cover" + } + ], + "title": "Cross-chain token (CCT) standard: Added support for new tokens", + "topic": "CCIP" + }, { "category": "integration", "date": "2025-11-25", From d82ab9d74fc22ebc6f59d7594c28082371a0e58d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 10:30:07 +0000 Subject: [PATCH 008/214] Bump @supabase/supabase-js from 2.84.0 to 2.86.0 (#3238) Bumps [@supabase/supabase-js](https://github.com/supabase/supabase-js/tree/HEAD/packages/core/supabase-js) from 2.84.0 to 2.86.0. - [Release notes](https://github.com/supabase/supabase-js/releases) - [Changelog](https://github.com/supabase/supabase-js/blob/master/packages/core/supabase-js/CHANGELOG.md) - [Commits](https://github.com/supabase/supabase-js/commits/v2.86.0/packages/core/supabase-js) --- updated-dependencies: - dependency-name: "@supabase/supabase-js" dependency-version: 2.86.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> --- package-lock.json | 965 ++++++++-------------------------------------- package.json | 2 +- 2 files changed, 164 insertions(+), 803 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4aa44db8cbb..e5e7bdb4631 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "@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", + "@supabase/supabase-js": "^2.86.0", "astro": "^5.16.3", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", @@ -201,7 +201,6 @@ "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.11.0.tgz", "integrity": "sha512-a7oQ8dwiyoyVmzLY0FcuBqyqcNSq78qlcOtHmNBumRlHCSnXDcuoYGBGPN1F6n8JoGhviDDsIaF/oQrzTzs6Lg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -217,7 +216,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.45.0.tgz", "integrity": "sha512-WTW0VZA8xHMbzuQD5b3f41ovKZ0MNTIXkWfm0F2PU+XGcLxmxX15UqODzF2sWab0vSbi3URM1xLhJx+bXbd1eQ==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -233,7 +231,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.45.0.tgz", "integrity": "sha512-I3g7VtvG/QJOH3tQO7E7zWTwBfK/nIQXShFLR8RvPgWburZ626JNj332M3wHCYcaAMivN9WJG66S2JNXhm6+Xg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -258,7 +255,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.45.0.tgz", "integrity": "sha512-suQTx/1bRL1g/K2hRtbK3ANmbzaZCi13487sxxmqok+alBDKKw0/TI73ZiHjjFXM2NV52inwwcmW4fUR45206Q==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -274,7 +270,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.45.0.tgz", "integrity": "sha512-CId/dbjpzI3eoUhPU6rt/z4GrRsDesqFISEMOwrqWNSrf4FJhiUIzN42Ac+Gzg69uC0RnzRYy60K1y4Na5VSMw==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -290,7 +285,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.45.0.tgz", "integrity": "sha512-tjbBKfA8fjAiFtvl9g/MpIPiD6pf3fj7rirVfh1eMIUi8ybHP4ovDzIaE216vHuRXoePQVCkMd2CokKvYq1CLw==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -327,7 +321,6 @@ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.45.0.tgz", "integrity": "sha512-t+1doBzhkQTeOOjLHMlm4slmXBhvgtEGQhOmNpMPTnIgWOyZyESWdm+XD984qM4Ej1i9FRh8VttOGrdGnAjAng==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -343,7 +336,6 @@ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.45.0.tgz", "integrity": "sha512-IaX3ZX1A/0wlgWZue+1BNWlq5xtJgsRo7uUk/aSiYD7lPbJ7dFuZ+yTLFLKgbl4O0QcyHTj1/mSBj9ryF1Lizg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -359,7 +351,6 @@ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.45.0.tgz", "integrity": "sha512-1jeMLoOhkgezCCPsOqkScwYzAAc1Jr5T2hisZl0s32D94ZV7d1OHozBukgOjf8Dw+6Hgi6j52jlAdUWTtkX9Mg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -734,6 +725,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1252,7 +1244,6 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1284,8 +1275,7 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@capsizecss/unpack": { "version": "3.0.1", @@ -1514,7 +1504,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", @@ -1632,7 +1621,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" @@ -1712,7 +1700,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/abstract-provider": "^5.8.0", @@ -1741,7 +1728,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -1769,7 +1755,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", @@ -1800,7 +1785,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -1887,7 +1871,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" @@ -1927,7 +1910,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -1966,7 +1948,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" @@ -2007,7 +1988,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", @@ -2053,7 +2033,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -2126,7 +2105,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/constants": "^5.8.0", @@ -2148,7 +2126,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -2205,7 +2182,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", @@ -2230,8 +2206,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@chainlink/contracts-1.4.0/node_modules/elliptic": { "version": "6.6.1", @@ -2320,7 +2295,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -2442,7 +2416,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", @@ -2560,7 +2533,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" @@ -2640,7 +2612,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/abstract-provider": "^5.8.0", @@ -2669,7 +2640,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -2697,7 +2667,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", @@ -2728,7 +2697,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -2815,7 +2783,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" @@ -2855,7 +2822,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -2894,7 +2860,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" @@ -2935,7 +2900,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", @@ -2981,7 +2945,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -3054,7 +3017,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/constants": "^5.8.0", @@ -3076,7 +3038,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -3133,7 +3094,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", @@ -3158,8 +3118,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@chainlink/contracts-ccip/node_modules/elliptic": { "version": "6.6.1", @@ -3248,7 +3207,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -3294,7 +3252,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", @@ -3412,7 +3369,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" @@ -3492,7 +3448,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/abstract-provider": "^5.8.0", @@ -3521,7 +3476,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -3549,7 +3503,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", @@ -3580,7 +3533,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -3667,7 +3619,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" @@ -3707,7 +3658,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -3746,7 +3696,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" @@ -3787,7 +3736,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", @@ -3833,7 +3781,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -3906,7 +3853,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/constants": "^5.8.0", @@ -3928,7 +3874,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -3985,7 +3930,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", @@ -3998,8 +3942,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@chainlink/contracts/node_modules/elliptic": { "version": "6.6.1", @@ -4088,7 +4031,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -6909,7 +6851,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -6976,7 +6917,6 @@ "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -6995,7 +6935,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -7009,7 +6948,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -7028,8 +6966,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@jest/console/node_modules/ansi-styles": { "version": "5.2.0", @@ -7037,7 +6974,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -7057,7 +6993,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -7068,7 +7003,6 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -7090,7 +7024,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -7109,7 +7042,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7123,7 +7055,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -7139,7 +7070,6 @@ "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/console": "30.2.0", "@jest/pattern": "30.0.1", @@ -7188,7 +7118,6 @@ "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/get-type": "30.1.0" }, @@ -7202,7 +7131,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -7216,7 +7144,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -7235,8 +7162,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@jest/core/node_modules/ansi-styles": { "version": "5.2.0", @@ -7244,7 +7170,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -7264,7 +7189,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -7275,7 +7199,6 @@ "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", @@ -7294,7 +7217,6 @@ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", @@ -7311,7 +7233,6 @@ "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", @@ -7328,7 +7249,6 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -7350,7 +7270,6 @@ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -7366,7 +7285,6 @@ "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", @@ -7400,7 +7318,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -7419,7 +7336,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7433,7 +7349,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -7449,7 +7364,6 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -7462,7 +7376,6 @@ "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -7476,7 +7389,6 @@ "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } @@ -7546,7 +7458,6 @@ "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } @@ -7573,7 +7484,6 @@ "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "jest-regex-util": "30.0.1" @@ -7588,7 +7498,6 @@ "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "30.2.0", @@ -7632,7 +7541,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -7646,7 +7554,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -7665,8 +7572,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@jest/reporters/node_modules/ansi-styles": { "version": "5.2.0", @@ -7674,7 +7580,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -7694,7 +7599,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -7705,7 +7609,6 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -7727,7 +7630,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -7746,7 +7648,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7760,7 +7661,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -7788,7 +7688,6 @@ "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "chalk": "^4.1.2", @@ -7805,7 +7704,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -7819,7 +7717,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -7838,8 +7735,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@jest/source-map": { "version": "30.0.1", @@ -7847,7 +7743,6 @@ "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "callsites": "^3.1.0", @@ -7863,7 +7758,6 @@ "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/console": "30.2.0", "@jest/types": "30.2.0", @@ -7880,7 +7774,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -7894,7 +7787,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -7913,8 +7805,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@jest/test-sequencer": { "version": "30.2.0", @@ -7922,7 +7813,6 @@ "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/test-result": "30.2.0", "graceful-fs": "^4.2.11", @@ -7939,7 +7829,6 @@ "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.27.4", "@jest/types": "30.2.0", @@ -7967,7 +7856,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -7981,7 +7869,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -8000,8 +7887,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@jest/transform/node_modules/ci-info": { "version": "4.3.1", @@ -8015,7 +7901,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8026,7 +7911,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -8045,7 +7929,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -8104,7 +7987,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -8490,8 +8372,7 @@ "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 + "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { "version": "14.2.33", @@ -8505,7 +8386,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8522,7 +8402,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8539,7 +8418,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8556,7 +8434,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8573,7 +8450,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8590,7 +8466,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8607,7 +8482,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8624,7 +8498,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8641,7 +8514,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8735,6 +8607,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -10546,7 +10419,6 @@ "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.1.tgz", "integrity": "sha512-B1SRwpntaAcckiatxbjzylvNK562Ayza05gdJCjDQHTiDafa1OABmyB5LHt7qWDOpNkaluD+w11vHF7pBmTpzQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -10556,7 +10428,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.1.tgz", "integrity": "sha512-ezXTN70ygVm9l2m0i+pAlct0RntoV4afftWMGUIeAWLgaca9qItQ54uOt32I/9dBJvzBibT33luIR/pBG0dQvg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -10579,7 +10450,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10600,7 +10470,6 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.1.tgz", "integrity": "sha512-H/eMdtOy9nEeX7YVeEG1N2vyCoifw3dr9OV8++xfUElNYV7LtSmJ6AqxZUUfxGJRDFPQvaU/8enmJlM/l11VxQ==", "license": "MIT", - "peer": true, "dependencies": { "@react-native/dev-middleware": "0.82.1", "debug": "^4.4.0", @@ -10631,7 +10500,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -10644,7 +10512,6 @@ "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.1.tgz", "integrity": "sha512-a2O6M7/OZ2V9rdavOHyCQ+10z54JX8+B+apYKCQ6a9zoEChGTxUMG2YzzJ8zZJVvYf1ByWSNxv9Se0dca1hO9A==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -10654,7 +10521,6 @@ "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.1.tgz", "integrity": "sha512-fdRHAeqqPT93bSrxfX+JHPpCXHApfDUdrXMXhoxlPgSzgXQXJDykIViKhtpu0M6slX6xU/+duq+AtP/qWJRpBw==", "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -10668,7 +10534,6 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.1.tgz", "integrity": "sha512-wuOIzms/Qg5raBV6Ctf2LmgzEOCqdP3p1AYN4zdhMT110c39TVMbunpBaJxm0Kbt2HQ762MQViF9naxk7SBo4w==", "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.1", @@ -10692,7 +10557,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -10702,7 +10566,6 @@ "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.1.tgz", "integrity": "sha512-KkF/2T1NSn6EJ5ALNT/gx0MHlrntFHv8YdooH9OOGl9HQn5NM0ZmQSr86o5utJsGc7ME3R6p3SaQuzlsFDrn8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -10712,7 +10575,6 @@ "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.1.tgz", "integrity": "sha512-tf70X7pUodslOBdLN37J57JmDPB/yiZcNDzS2m+4bbQzo8fhx3eG9QEBv5n4fmzqfGAgSB4BWRHgDMXmmlDSVA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.4" } @@ -10721,8 +10583,7 @@ "version": "0.82.1", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.1.tgz", "integrity": "sha512-CCfTR1uX+Z7zJTdt3DNX9LUXr2zWXsNOyLbwupW2wmRzrxlHRYfmLgTABzRL/cKhh0Ubuwn15o72MQChvCRaHw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", @@ -11334,7 +11195,6 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -11361,7 +11221,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11378,7 +11237,6 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.1.tgz", "integrity": "sha512-f5zpJg9gzh7JtCbsIwV+4kP3eI0QBuA93JGmwFRd4onQ3DnCjV2J5pYqdWtM95sjSKK1dyik59Gj01lLeKqs1Q==", "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -11486,7 +11344,6 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "license": "MIT", - "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -11508,7 +11365,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11525,7 +11381,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -11542,7 +11397,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -11558,7 +11412,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "license": "MIT", - "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -11603,7 +11456,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11624,7 +11476,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -11641,7 +11492,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -11651,7 +11501,6 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -11669,7 +11518,6 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -11695,7 +11543,6 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -11705,7 +11552,6 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -11721,7 +11567,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11806,7 +11651,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -11816,7 +11660,6 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -11825,15 +11668,13 @@ "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@solana-mobile/mobile-wallet-adapter-protocol-web3js/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", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -11845,15 +11686,13 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/@solana-mobile/mobile-wallet-adapter-protocol-web3js/node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -11867,7 +11706,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -11897,7 +11735,6 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -11938,7 +11775,6 @@ "integrity": "sha512-f5zpJg9gzh7JtCbsIwV+4kP3eI0QBuA93JGmwFRd4onQ3DnCjV2J5pYqdWtM95sjSKK1dyik59Gj01lLeKqs1Q==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -11963,7 +11799,6 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -11986,7 +11821,6 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "license": "BSD-3-Clause", "optional": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -12004,7 +11838,6 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -12021,7 +11854,6 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -12039,7 +11871,6 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=18" } @@ -12051,7 +11882,6 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "optional": true, - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12073,7 +11903,6 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "license": "BSD-3-Clause", "optional": true, - "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -12091,7 +11920,6 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "optional": true, - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -12102,7 +11930,6 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -12121,7 +11948,6 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -12148,7 +11974,6 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -12159,7 +11984,6 @@ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -12170,84 +11994,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "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", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.32.0", - "base64-js": "^1.5.1", - "commander": "^12.0.0", - "flow-enums-runtime": "^0.0.6", - "glob": "^7.1.1", - "hermes-compiler": "0.0.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", - "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", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.3", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@types/react": "^19.1.1", - "react": "^19.1.1" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -12257,8 +12009,7 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/semver": { "version": "7.7.3", @@ -12266,7 +12017,6 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "optional": true, - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -12279,8 +12029,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC", - "optional": true, - "peer": true + "optional": true }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/supports-color": { "version": "8.1.1", @@ -12288,7 +12037,6 @@ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12305,7 +12053,6 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "license": "ISC", "optional": true, - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -12320,7 +12067,6 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -12346,7 +12092,6 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -12373,7 +12118,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12390,7 +12134,6 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.1.tgz", "integrity": "sha512-f5zpJg9gzh7JtCbsIwV+4kP3eI0QBuA93JGmwFRd4onQ3DnCjV2J5pYqdWtM95sjSKK1dyik59Gj01lLeKqs1Q==", "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -12498,7 +12241,6 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "license": "MIT", - "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -12520,7 +12262,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12537,7 +12278,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -12554,7 +12294,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -12570,7 +12309,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "license": "MIT", - "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -12615,7 +12353,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12636,7 +12373,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -12653,7 +12389,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -12663,7 +12398,6 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -12681,7 +12415,6 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -12707,7 +12440,6 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -12717,7 +12449,6 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -12733,7 +12464,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12818,7 +12548,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -12828,7 +12557,6 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -12837,15 +12565,13 @@ "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@solana-mobile/wallet-standard-mobile/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", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -12857,15 +12583,13 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/@solana-mobile/wallet-standard-mobile/node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -12879,7 +12603,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -13186,6 +12909,7 @@ "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-5.0.0.tgz", "integrity": "sha512-3ahtzmmMgU+1l2YMhQJSKKm14IdvCycOE/m4XNMu/4icBIptmBgZxrmgRpPHqBilBa+Krp/hBuTg4HWl9IAgWw==", "license": "MIT", + "peer": true, "dependencies": { "@solana/accounts": "5.0.0", "@solana/addresses": "5.0.0", @@ -13569,6 +13293,7 @@ "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-5.0.0.tgz", "integrity": "sha512-F/GEb2rS8mrgDd79lDPyu8za9jGE6cRlS4jHNeKCkvOCJxdKQbX34JIzx4kwzjtvk7O8/yrDHfGdpA8nBg/l4w==", "license": "MIT", + "peer": true, "dependencies": { "@solana/accounts": "5.0.0", "@solana/codecs": "5.0.0", @@ -13660,6 +13385,7 @@ "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-base/-/wallet-adapter-base-0.9.27.tgz", "integrity": "sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@solana/wallet-standard-features": "^1.3.0", "@wallet-standard/base": "^1.1.0", @@ -13906,6 +13632,7 @@ "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz", "integrity": "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", @@ -14125,9 +13852,9 @@ "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.86.0", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.86.0.tgz", + "integrity": "sha512-3xPqMvBWC6Haqpr6hEWmSUqDq+6SA1BAEdbiaHdAZM9QjZ5uiQJ+6iD9pZOzOa6MVXZh4GmwjhC9ObIG0K1NcA==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14137,9 +13864,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.86.0", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.86.0.tgz", + "integrity": "sha512-AlOoVfeaq9XGlBFIyXTmb+y+CZzxNO4wWbfgRM6iPpNU5WCXKawtQYSnhivi3UVxS7GA0rWovY4d6cIAxZAojA==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14149,9 +13876,9 @@ } }, "node_modules/@supabase/postgrest-js": { - "version": "2.84.0", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.84.0.tgz", - "integrity": "sha512-oplc/3jfJeVW4F0J8wqywHkjIZvOVHtqzF0RESijepDAv5Dn/LThlGW1ftysoP4+PXVIrnghAbzPHo88fNomPQ==", + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.86.0.tgz", + "integrity": "sha512-QVf+wIXILcZJ7IhWhWn+ozdf8B+oO0Ulizh2AAPxD/6nQL+x3r9lJ47a+fpc/jvAOGXMbkeW534Kw6jz7e8iIA==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14161,9 +13888,9 @@ } }, "node_modules/@supabase/realtime-js": { - "version": "2.84.0", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.84.0.tgz", - "integrity": "sha512-ThqjxiCwWiZAroHnYPmnNl6tZk6jxGcG2a7Hp/3kcolPcMj89kWjUTA3cHmhdIWYsP84fHp8MAQjYWMLf7HEUg==", + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.86.0.tgz", + "integrity": "sha512-dyS8bFoP29R/sj5zLi0AP3JfgG8ar1nuImcz5jxSx7UIW7fbFsXhUCVrSY2Ofo0+Ev6wiATiSdBOzBfWaiFyPA==", "license": "MIT", "dependencies": { "@types/phoenix": "^1.6.6", @@ -14176,11 +13903,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.86.0", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.86.0.tgz", + "integrity": "sha512-PM47jX/Mfobdtx7NNpoj9EvlrkapAVTQBZgGGslEXD6NS70EcGjhgRPBItwHdxZPM5GwqQ0cGMN06uhjeY2mHQ==", "license": "MIT", "dependencies": { + "iceberg-js": "^0.8.0", "tslib": "2.8.1" }, "engines": { @@ -14188,16 +13916,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.86.0", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.86.0.tgz", + "integrity": "sha512-BaC9sv5+HGNy1ulZwY8/Ev7EjfYYmWD4fOMw9bDBqTawEj6JHAiOHeTwXLRzVaeSay4p17xYLN2NSCoGgXMQnw==", "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.86.0", + "@supabase/functions-js": "2.86.0", + "@supabase/postgrest-js": "2.86.0", + "@supabase/realtime-js": "2.86.0", + "@supabase/storage-js": "2.86.0" }, "engines": { "node": ">=20.0.0" @@ -14684,18 +14412,6 @@ } } }, - "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/tree-sitter": { - "version": "0.22.4", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.4.tgz", - "integrity": "sha512-usbHZP9/oxNsUY65MQUsduGRqDHQOou1cagUSwjhoSYAmSahjQDAVsh9s+SlZkn8X8+O1FULRGwHu7AFP3kjzg==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" - } - }, "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", @@ -14787,8 +14503,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@swc/helpers": { "version": "0.5.17", @@ -15063,6 +14778,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -15116,6 +14832,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -15125,6 +14842,7 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -15271,6 +14989,7 @@ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -15470,8 +15189,7 @@ "optional": true, "os": [ "android" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-android-arm64": { "version": "1.11.1", @@ -15485,8 +15203,7 @@ "optional": true, "os": [ "android" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-darwin-arm64": { "version": "1.11.1", @@ -15500,8 +15217,7 @@ "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-darwin-x64": { "version": "1.11.1", @@ -15515,8 +15231,7 @@ "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-freebsd-x64": { "version": "1.11.1", @@ -15530,8 +15245,7 @@ "optional": true, "os": [ "freebsd" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { "version": "1.11.1", @@ -15545,8 +15259,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { "version": "1.11.1", @@ -15560,8 +15273,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { "version": "1.11.1", @@ -15575,8 +15287,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { "version": "1.11.1", @@ -15590,8 +15301,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { "version": "1.11.1", @@ -15605,8 +15315,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { "version": "1.11.1", @@ -15620,8 +15329,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { "version": "1.11.1", @@ -15635,8 +15343,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { "version": "1.11.1", @@ -15650,8 +15357,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { "version": "1.11.1", @@ -15665,8 +15371,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { "version": "1.11.1", @@ -15680,8 +15385,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { "version": "1.11.1", @@ -15693,7 +15397,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, @@ -15708,7 +15411,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", @@ -15727,8 +15429,7 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { "version": "1.11.1", @@ -15742,8 +15443,7 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { "version": "1.11.1", @@ -15757,8 +15457,7 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@vercel/analytics": { "version": "1.5.0", @@ -16158,7 +15857,6 @@ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", - "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -16171,7 +15869,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", - "peer": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -16185,6 +15882,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -16261,6 +15959,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -16339,8 +16038,7 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ansi-align": { "version": "3.0.1", @@ -16395,7 +16093,6 @@ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -16412,7 +16109,6 @@ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=10" }, @@ -16657,8 +16353,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/assertion-error": { "version": "1.1.0", @@ -16700,6 +16395,7 @@ "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.3.tgz", "integrity": "sha512-KzDk41F9Dspf5fM/Ls4XZhV4/csjJcWBrlenbnp5V3NGwU1zEaJz/HIyrdKdf5yw+FgwCeD2+Yos1Xkx9gnI0A==", "license": "MIT", + "peer": true, "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", @@ -17047,8 +16743,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/async-sema": { "version": "3.1.1", @@ -17130,7 +16825,6 @@ "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/transform": "30.2.0", "@types/babel__core": "^7.20.5", @@ -17153,7 +16847,6 @@ "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "workspaces": [ "test/babel-8" ], @@ -17174,7 +16867,6 @@ "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/babel__core": "^7.20.5" }, @@ -17187,7 +16879,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -17233,7 +16924,6 @@ "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "babel-plugin-jest-hoist": "30.2.0", "babel-preset-current-node-syntax": "^1.2.0" @@ -17523,6 +17213,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -17555,6 +17246,7 @@ "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "license": "MIT", + "peer": true, "dependencies": { "base-x": "^5.0.0" } @@ -17596,8 +17288,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/buffer-layout": { "version": "1.2.2", @@ -17608,20 +17299,6 @@ "node": ">=4.5" } }, - "node_modules/bufferutil": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", - "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, "node_modules/bufio": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/bufio/-/bufio-1.2.3.tgz", @@ -17658,7 +17335,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" }, @@ -17858,7 +17534,6 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -17971,7 +17646,6 @@ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -17990,7 +17664,6 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", - "peer": true, "bin": { "is-docker": "cli.js" }, @@ -18006,7 +17679,6 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -18019,7 +17691,6 @@ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -18034,7 +17705,6 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", - "peer": true, "bin": { "is-docker": "cli.js" }, @@ -18050,7 +17720,6 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -18063,7 +17732,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", - "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -18091,8 +17759,7 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.1.tgz", "integrity": "sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/class-variance-authority": { "version": "0.7.0", @@ -18170,8 +17837,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/clipboard": { "version": "2.0.11", @@ -18189,7 +17855,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", @@ -18203,15 +17868,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" } @@ -18221,7 +17884,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", @@ -18236,7 +17898,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", @@ -18273,7 +17934,6 @@ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -18294,8 +17954,7 @@ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", @@ -18381,7 +18040,6 @@ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", @@ -18397,7 +18055,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -18406,8 +18063,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/consola": { "version": "3.4.2", @@ -18790,7 +18446,6 @@ "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -18926,7 +18581,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -18951,7 +18605,6 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -18987,7 +18640,6 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -19260,8 +18912,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.5.260", @@ -19296,7 +18947,6 @@ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -19315,7 +18965,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -19383,7 +19032,6 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "license": "MIT", - "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -19640,8 +19288,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -19662,6 +19309,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -19718,6 +19366,7 @@ "integrity": "sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -19857,6 +19506,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -19950,6 +19600,7 @@ "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "builtins": "^5.0.1", "eslint-plugin-es": "^4.1.0", @@ -20020,6 +19671,7 @@ "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, "license": "ISC", + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -20490,7 +20142,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -20630,7 +20281,6 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -20656,7 +20306,6 @@ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -20680,8 +20329,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/exenv": { "version": "1.2.2", @@ -20695,7 +20343,6 @@ "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8.0" } @@ -20721,8 +20368,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/extend": { "version": "3.0.2", @@ -20921,7 +20567,6 @@ "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "license": "(MIT OR Apache-2.0)", - "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -20984,7 +20629,6 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -21003,7 +20647,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -21012,8 +20655,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/find-up": { "version": "4.1.0", @@ -21083,8 +20725,7 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/focus-trap": { "version": "7.6.6", @@ -21244,7 +20885,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -22247,22 +21887,19 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -22369,7 +22006,6 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", - "peer": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -22386,7 +22022,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -22433,7 +22068,6 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=10.17.0" } @@ -22463,6 +22097,15 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/iceberg-js": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.0.tgz", + "integrity": "sha512-kmgmea2nguZEvRqW79gDqNXyxA3OS5WIgMVffrHpqXV4F/J4UmNIw2vstixioLTNSkd5rFB8G0s3Lwzogm6OFw==", + "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", @@ -22513,7 +22156,6 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "license": "MIT", - "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -22529,6 +22171,7 @@ "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -22564,7 +22207,6 @@ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -23006,7 +22648,6 @@ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -23373,7 +23014,6 @@ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -23391,7 +23031,6 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -23405,7 +23044,6 @@ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -23421,7 +23059,6 @@ "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", @@ -23437,7 +23074,6 @@ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -23451,8 +23087,7 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jackspeak": { "version": "3.4.3", @@ -23552,7 +23187,6 @@ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", @@ -23580,7 +23214,6 @@ "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "execa": "^5.1.1", "jest-util": "30.2.0", @@ -23596,7 +23229,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -23610,7 +23242,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -23629,8 +23260,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-changed-files/node_modules/ci-info": { "version": "4.3.1", @@ -23644,7 +23274,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -23655,7 +23284,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -23674,7 +23302,6 @@ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -23691,7 +23318,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -23705,7 +23331,6 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -23719,7 +23344,6 @@ "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/expect": "30.2.0", @@ -23752,7 +23376,6 @@ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", @@ -23769,7 +23392,6 @@ "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "expect": "30.2.0", "jest-snapshot": "30.2.0" @@ -23784,7 +23406,6 @@ "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/get-type": "30.1.0" }, @@ -23798,7 +23419,6 @@ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", @@ -23817,7 +23437,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -23831,7 +23450,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -23850,8 +23468,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-circus/node_modules/@sinonjs/fake-timers": { "version": "13.0.5", @@ -23859,7 +23476,6 @@ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -23870,7 +23486,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -23890,7 +23505,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -23901,7 +23515,6 @@ "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", @@ -23920,7 +23533,6 @@ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", @@ -23937,7 +23549,6 @@ "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", @@ -23954,7 +23565,6 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -23976,7 +23586,6 @@ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -23992,7 +23601,6 @@ "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", @@ -24026,7 +23634,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24045,7 +23652,6 @@ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -24062,7 +23668,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -24076,7 +23681,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -24092,7 +23696,6 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -24106,7 +23709,6 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -24120,7 +23722,6 @@ "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/test-result": "30.2.0", @@ -24154,7 +23755,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -24168,7 +23768,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -24187,8 +23786,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-cli/node_modules/ci-info": { "version": "4.3.1", @@ -24202,7 +23800,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -24213,7 +23810,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24232,7 +23828,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -24246,7 +23841,6 @@ "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.27.4", "@jest/get-type": "30.1.0", @@ -24299,7 +23893,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -24313,7 +23906,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -24332,8 +23924,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-config/node_modules/ansi-styles": { "version": "5.2.0", @@ -24341,7 +23932,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -24361,7 +23951,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -24372,7 +23961,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24391,7 +23979,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -24405,7 +23992,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -24437,7 +24023,6 @@ "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "detect-newline": "^3.1.0" }, @@ -24451,7 +24036,6 @@ "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "@jest/types": "30.2.0", @@ -24469,7 +24053,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -24483,7 +24066,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -24502,8 +24084,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-each/node_modules/ansi-styles": { "version": "5.2.0", @@ -24511,7 +24092,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -24531,7 +24111,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -24542,7 +24121,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24561,7 +24139,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -24575,7 +24152,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -24591,7 +24167,6 @@ "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/fake-timers": "30.2.0", @@ -24611,7 +24186,6 @@ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", @@ -24628,7 +24202,6 @@ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", @@ -24647,7 +24220,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -24661,7 +24233,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -24680,8 +24251,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-environment-node/node_modules/@sinonjs/fake-timers": { "version": "13.0.5", @@ -24689,7 +24259,6 @@ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -24700,7 +24269,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -24720,7 +24288,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -24731,7 +24298,6 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -24753,7 +24319,6 @@ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24769,7 +24334,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24788,7 +24352,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -24802,7 +24365,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -24827,7 +24389,6 @@ "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24853,7 +24414,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -24867,7 +24427,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -24886,8 +24445,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-haste-map/node_modules/ci-info": { "version": "4.3.1", @@ -24901,7 +24459,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -24912,7 +24469,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24931,7 +24487,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -24945,7 +24500,6 @@ "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "pretty-format": "30.2.0" @@ -24960,7 +24514,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -24973,8 +24526,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-leak-detector/node_modules/ansi-styles": { "version": "5.2.0", @@ -24982,7 +24534,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -24996,7 +24547,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -25062,7 +24612,6 @@ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -25081,7 +24630,6 @@ "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } @@ -25092,7 +24640,6 @@ "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", @@ -25113,7 +24660,6 @@ "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "jest-regex-util": "30.0.1", "jest-snapshot": "30.2.0" @@ -25128,7 +24674,6 @@ "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/get-type": "30.1.0" }, @@ -25142,7 +24687,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -25156,7 +24700,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -25175,8 +24718,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-resolve-dependencies/node_modules/ansi-styles": { "version": "5.2.0", @@ -25184,7 +24726,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -25204,7 +24745,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -25215,7 +24755,6 @@ "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", @@ -25234,7 +24773,6 @@ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", @@ -25251,7 +24789,6 @@ "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", @@ -25268,7 +24805,6 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -25290,7 +24826,6 @@ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -25306,7 +24841,6 @@ "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", @@ -25340,7 +24874,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -25359,7 +24892,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -25373,7 +24905,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -25389,7 +24920,6 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -25403,7 +24933,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -25417,7 +24946,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -25436,8 +24964,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-resolve/node_modules/ci-info": { "version": "4.3.1", @@ -25451,7 +24978,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -25462,7 +24988,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -25481,7 +25006,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -25495,7 +25019,6 @@ "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/console": "30.2.0", "@jest/environment": "30.2.0", @@ -25530,7 +25053,6 @@ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", @@ -25547,7 +25069,6 @@ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", @@ -25566,7 +25087,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -25580,7 +25100,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -25599,8 +25118,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-runner/node_modules/@sinonjs/fake-timers": { "version": "13.0.5", @@ -25608,7 +25126,6 @@ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -25619,7 +25136,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -25639,7 +25155,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -25650,7 +25165,6 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -25672,7 +25186,6 @@ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -25688,7 +25201,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -25707,7 +25219,6 @@ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -25724,7 +25235,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -25738,7 +25248,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -25754,7 +25263,6 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -25768,7 +25276,6 @@ "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/fake-timers": "30.2.0", @@ -25803,7 +25310,6 @@ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", @@ -25820,7 +25326,6 @@ "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "expect": "30.2.0", "jest-snapshot": "30.2.0" @@ -25835,7 +25340,6 @@ "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/get-type": "30.1.0" }, @@ -25849,7 +25353,6 @@ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", @@ -25868,7 +25371,6 @@ "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/expect": "30.2.0", @@ -25885,7 +25387,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -25899,7 +25400,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -25918,8 +25418,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-runtime/node_modules/@sinonjs/fake-timers": { "version": "13.0.5", @@ -25927,7 +25426,6 @@ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -25938,7 +25436,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -25958,7 +25455,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -25969,7 +25465,6 @@ "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", @@ -25988,7 +25483,6 @@ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", @@ -26005,7 +25499,6 @@ "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", @@ -26022,7 +25515,6 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -26044,7 +25536,6 @@ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -26060,7 +25551,6 @@ "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", @@ -26094,7 +25584,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -26113,7 +25602,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -26127,7 +25615,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -26143,7 +25630,6 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -26379,7 +25865,6 @@ "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "@jest/types": "30.2.0", @@ -26398,7 +25883,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -26412,7 +25896,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -26431,8 +25914,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-validate/node_modules/ansi-styles": { "version": "5.2.0", @@ -26440,7 +25922,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -26454,7 +25935,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -26470,7 +25950,6 @@ "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/test-result": "30.2.0", "@jest/types": "30.2.0", @@ -26491,7 +25970,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -26505,7 +25983,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -26524,8 +26001,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-watcher/node_modules/ci-info": { "version": "4.3.1", @@ -26539,7 +26015,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -26550,7 +26025,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -26569,7 +26043,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -26583,7 +26056,6 @@ "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", @@ -26601,7 +26073,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -26615,7 +26086,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -26634,8 +26104,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-worker/node_modules/ci-info": { "version": "4.3.1", @@ -26649,7 +26118,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -26660,7 +26128,6 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -26679,7 +26146,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -26693,7 +26159,6 @@ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -26748,7 +26213,6 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -26762,7 +26226,6 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -26781,8 +26244,7 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jiti": { "version": "2.6.1", @@ -26850,8 +26312,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/jsesc": { "version": "3.1.0", @@ -27124,7 +26585,6 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -27135,7 +26595,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -27144,8 +26603,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lilconfig": { "version": "3.1.3", @@ -27426,8 +26884,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", @@ -27658,7 +27115,6 @@ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "semver": "^7.5.3" }, @@ -27675,7 +27131,6 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -27754,8 +27209,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -28111,8 +27565,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/merge-options": { "version": "3.0.4", @@ -28157,7 +27610,6 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -28212,7 +27664,6 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -28228,7 +27679,6 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "license": "MIT", - "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -28244,7 +27694,6 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -28257,7 +27706,6 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "license": "MIT", - "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -28277,7 +27725,6 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -28295,7 +27742,6 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -28310,7 +27756,6 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -28331,7 +27776,6 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -28347,7 +27791,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -28363,7 +27806,6 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -28377,7 +27819,6 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -28390,7 +27831,6 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -28404,7 +27844,6 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -28426,7 +27865,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -28436,7 +27874,6 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -28457,7 +27894,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -28467,7 +27903,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -28485,7 +27920,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -28509,15 +27943,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/metro/node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -28533,7 +27965,6 @@ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -28543,7 +27974,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -28553,7 +27983,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -28569,7 +27998,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -29346,7 +28774,6 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", - "peer": true, "bin": { "mime": "cli.js" }, @@ -29381,7 +28808,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -29552,6 +28978,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^18.0.0 || >=20.0.0" } @@ -29562,7 +28989,6 @@ "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "napi-postinstall": "lib/cli.js" }, @@ -29592,7 +29018,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -29669,7 +29094,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" @@ -29694,7 +29118,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -29899,7 +29322,6 @@ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-key": "^3.0.0" }, @@ -29923,15 +29345,13 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ob1": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -30085,7 +29505,6 @@ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -30108,7 +29527,6 @@ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -30208,7 +29626,8 @@ "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/optionator": { "version": "0.9.4", @@ -30546,7 +29965,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -30957,7 +30375,6 @@ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "find-up": "^4.0.0" }, @@ -31021,6 +30438,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -31156,6 +30574,7 @@ "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -31186,6 +30605,7 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -31289,7 +30709,6 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "license": "MIT", - "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -31382,8 +30801,7 @@ "url": "https://opencollective.com/fast-check" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/qrcode": { "version": "1.5.4", @@ -31545,7 +30963,6 @@ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -31600,6 +31017,7 @@ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz", "integrity": "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/ramda" @@ -31648,7 +31066,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -31684,6 +31101,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -31722,7 +31140,6 @@ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "license": "MIT", - "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -31733,7 +31150,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -31755,6 +31171,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -32196,7 +31613,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/redux-immutable": { "version": "4.0.0", @@ -32305,8 +31723,7 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/regex": { "version": "6.0.1", @@ -32818,7 +32235,6 @@ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "resolve-from": "^5.0.0" }, @@ -33029,6 +32445,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -33339,7 +32756,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -33364,7 +32780,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -33373,15 +32788,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/send/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -33394,7 +32807,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -33431,7 +32843,6 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "license": "MIT", - "peer": true, "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -33447,7 +32858,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -33510,8 +32920,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.12", @@ -33617,7 +33026,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" }, @@ -34027,7 +33435,6 @@ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -34039,7 +33446,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -34113,15 +33519,13 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -34134,7 +33538,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=8" } @@ -34144,7 +33547,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -34188,7 +33590,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" } @@ -34218,7 +33619,6 @@ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -34405,7 +33805,6 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -34416,7 +33815,6 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -34456,7 +33854,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" }, @@ -34790,6 +34187,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", "license": "MIT", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -34891,7 +34289,6 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -34909,15 +34306,13 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -34927,7 +34322,6 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "license": "MIT", - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -35014,8 +34408,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/through": { "version": "2.3.8", @@ -35082,6 +34475,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -35144,7 +34538,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -35170,18 +34563,6 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, - "node_modules/tree-sitter": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", - "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.8.0" - } - }, "node_modules/tree-sitter-json": { "version": "0.24.8", "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.24.8.tgz", @@ -35386,6 +34767,7 @@ "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -35531,6 +34913,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -35813,7 +35196,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -35831,7 +35213,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "napi-postinstall": "^0.3.0" }, @@ -35961,20 +35342,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -35986,7 +35353,6 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4.0" } @@ -36010,7 +35376,6 @@ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -36067,6 +35432,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -36175,6 +35541,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -36233,8 +35600,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/walk-up-path": { "version": "4.0.0", @@ -36307,8 +35673,7 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/whatwg-url": { "version": "5.0.0", @@ -36585,7 +35950,6 @@ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" @@ -36599,6 +35963,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -36650,7 +36015,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" } @@ -36678,7 +36042,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", @@ -36705,15 +36068,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" } @@ -36723,7 +36084,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", @@ -36783,6 +36143,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 97d7018931b..4951a9e5c0e 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@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", + "@supabase/supabase-js": "^2.86.0", "astro": "^5.16.3", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", From ffdfa3e3c39abc109033473f4fd3c6b086061b96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 10:31:30 +0000 Subject: [PATCH 009/214] Bump tsx from 4.20.6 to 4.21.0 in the typescript group (#3237) Bumps the typescript group with 1 update: [tsx](https://github.com/privatenumber/tsx). Updates `tsx` from 4.20.6 to 4.21.0 - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs) - [Commits](https://github.com/privatenumber/tsx/compare/v4.20.6...v4.21.0) --- updated-dependencies: - dependency-name: tsx dependency-version: 4.21.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: typescript ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> --- package-lock.json | 468 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 2 +- 2 files changed, 464 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e5e7bdb4631..3c0a659d903 100644 --- a/package-lock.json +++ b/package-lock.json @@ -106,7 +106,7 @@ "solhint-plugin-chainlink-solidity": "github:smartcontractkit/chainlink-solhint-rules#v1.3.0", "ts-jest": "^29.4.5", "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", @@ -34762,14 +34762,14 @@ "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", "peer": true, "dependencies": { - "esbuild": "~0.25.0", + "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -34782,6 +34782,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", diff --git a/package.json b/package.json index 4951a9e5c0e..9c35596f2f0 100644 --- a/package.json +++ b/package.json @@ -151,7 +151,7 @@ "solhint-plugin-chainlink-solidity": "github:smartcontractkit/chainlink-solhint-rules#v1.3.0", "ts-jest": "^29.4.5", "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", From 5868d5220e9a5baf01e644bb6627843c19b0fce2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 10:38:09 +0000 Subject: [PATCH 010/214] Bump prettier from 3.6.2 to 3.7.3 in the linting-tools group (#3236) Bumps the linting-tools group with 1 update: [prettier](https://github.com/prettier/prettier). Updates `prettier` from 3.6.2 to 3.7.3 - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.6.2...3.7.3) --- updated-dependencies: - dependency-name: prettier dependency-version: 3.7.3 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: linting-tools ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3c0a659d903..326143e6c7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,7 +96,7 @@ "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", "pino-pretty": "^13.1.2", - "prettier": "^3.5.3", + "prettier": "^3.7.3", "prettier-plugin-astro": "^0.14.1", "remark-gfm": "^4.0.0", "remark-mdx": "^3.1.0", @@ -30600,9 +30600,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.7.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.3.tgz", + "integrity": "sha512-QgODejq9K3OzoBbuyobZlUhznP5SKwPqp+6Q6xw6o8gnhr4O85L2U915iM2IDcfF2NPXVaM9zlo9tdwipnYwzg==", "dev": true, "license": "MIT", "peer": true, diff --git a/package.json b/package.json index 9c35596f2f0..d4de4dc03a2 100644 --- a/package.json +++ b/package.json @@ -141,7 +141,7 @@ "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", "pino-pretty": "^13.1.2", - "prettier": "^3.5.3", + "prettier": "^3.7.3", "prettier-plugin-astro": "^0.14.1", "remark-gfm": "^4.0.0", "remark-mdx": "^3.1.0", From 05a639f79c71fc2713d3744f79735087cd514289 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 10:56:30 +0000 Subject: [PATCH 011/214] Bump the ui-frameworks group with 2 updates (#3235) * Bump the ui-frameworks group with 2 updates Bumps the ui-frameworks group with 2 updates: [swagger-ui-dist](https://github.com/swagger-api/swagger-ui) and [swagger-ui-react](https://github.com/swagger-api/swagger-ui). Updates `swagger-ui-dist` from 5.30.2 to 5.30.3 - [Release notes](https://github.com/swagger-api/swagger-ui/releases) - [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.30.2...v5.30.3) Updates `swagger-ui-react` from 5.30.2 to 5.30.3 - [Release notes](https://github.com/swagger-api/swagger-ui/releases) - [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.30.2...v5.30.3) --- updated-dependencies: - dependency-name: swagger-ui-dist dependency-version: 5.30.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: ui-frameworks - dependency-name: swagger-ui-react dependency-version: 5.30.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: ui-frameworks ... Signed-off-by: dependabot[bot] <support@github.com> * fix * fix --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 937 +++++++++++++++--- package.json | 4 +- .../TutorialBlockchainSelector.tsx | 6 +- 3 files changed, 792 insertions(+), 155 deletions(-) diff --git a/package-lock.json b/package-lock.json index 326143e6c7c..f84902b559a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,8 +62,8 @@ "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.30.3", + "swagger-ui-react": "^5.30.3", "tweetnacl": "^1.0.3", "uuid": "^11.1.0" }, @@ -201,6 +201,7 @@ "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.11.0.tgz", "integrity": "sha512-a7oQ8dwiyoyVmzLY0FcuBqyqcNSq78qlcOtHmNBumRlHCSnXDcuoYGBGPN1F6n8JoGhviDDsIaF/oQrzTzs6Lg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -216,6 +217,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.45.0.tgz", "integrity": "sha512-WTW0VZA8xHMbzuQD5b3f41ovKZ0MNTIXkWfm0F2PU+XGcLxmxX15UqODzF2sWab0vSbi3URM1xLhJx+bXbd1eQ==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -231,6 +233,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.45.0.tgz", "integrity": "sha512-I3g7VtvG/QJOH3tQO7E7zWTwBfK/nIQXShFLR8RvPgWburZ626JNj332M3wHCYcaAMivN9WJG66S2JNXhm6+Xg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -255,6 +258,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.45.0.tgz", "integrity": "sha512-suQTx/1bRL1g/K2hRtbK3ANmbzaZCi13487sxxmqok+alBDKKw0/TI73ZiHjjFXM2NV52inwwcmW4fUR45206Q==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -270,6 +274,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.45.0.tgz", "integrity": "sha512-CId/dbjpzI3eoUhPU6rt/z4GrRsDesqFISEMOwrqWNSrf4FJhiUIzN42Ac+Gzg69uC0RnzRYy60K1y4Na5VSMw==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -285,6 +290,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.45.0.tgz", "integrity": "sha512-tjbBKfA8fjAiFtvl9g/MpIPiD6pf3fj7rirVfh1eMIUi8ybHP4ovDzIaE216vHuRXoePQVCkMd2CokKvYq1CLw==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -321,6 +327,7 @@ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.45.0.tgz", "integrity": "sha512-t+1doBzhkQTeOOjLHMlm4slmXBhvgtEGQhOmNpMPTnIgWOyZyESWdm+XD984qM4Ej1i9FRh8VttOGrdGnAjAng==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -336,6 +343,7 @@ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.45.0.tgz", "integrity": "sha512-IaX3ZX1A/0wlgWZue+1BNWlq5xtJgsRo7uUk/aSiYD7lPbJ7dFuZ+yTLFLKgbl4O0QcyHTj1/mSBj9ryF1Lizg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -351,6 +359,7 @@ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.45.0.tgz", "integrity": "sha512-1jeMLoOhkgezCCPsOqkScwYzAAc1Jr5T2hisZl0s32D94ZV7d1OHozBukgOjf8Dw+6Hgi6j52jlAdUWTtkX9Mg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.45.0", "@algolia/requester-browser-xhr": "5.45.0", @@ -725,7 +734,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1244,6 +1252,7 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1275,7 +1284,8 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@capsizecss/unpack": { "version": "3.0.1", @@ -1504,6 +1514,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", @@ -1621,6 +1632,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" @@ -1700,6 +1712,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/abstract-provider": "^5.8.0", @@ -1728,6 +1741,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -1755,6 +1769,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", @@ -1785,6 +1800,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -1871,6 +1887,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" @@ -1910,6 +1927,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -1948,6 +1966,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" @@ -1988,6 +2007,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", @@ -2033,6 +2053,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -2105,6 +2126,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/constants": "^5.8.0", @@ -2126,6 +2148,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -2182,6 +2205,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", @@ -2206,7 +2230,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@chainlink/contracts-1.4.0/node_modules/elliptic": { "version": "6.6.1", @@ -2295,6 +2320,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -2416,6 +2442,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", @@ -2533,6 +2560,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" @@ -2612,6 +2640,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/abstract-provider": "^5.8.0", @@ -2640,6 +2669,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -2667,6 +2697,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", @@ -2697,6 +2728,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -2783,6 +2815,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" @@ -2822,6 +2855,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -2860,6 +2894,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" @@ -2900,6 +2935,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", @@ -2945,6 +2981,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -3017,6 +3054,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/constants": "^5.8.0", @@ -3038,6 +3076,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -3094,6 +3133,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", @@ -3118,7 +3158,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@chainlink/contracts-ccip/node_modules/elliptic": { "version": "6.6.1", @@ -3207,6 +3248,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -3252,6 +3294,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", @@ -3369,6 +3412,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" @@ -3448,6 +3492,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/abstract-provider": "^5.8.0", @@ -3476,6 +3521,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -3503,6 +3549,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", @@ -3533,6 +3580,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -3619,6 +3667,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" @@ -3658,6 +3707,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -3696,6 +3746,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" @@ -3736,6 +3787,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", @@ -3781,6 +3833,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -3853,6 +3906,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/constants": "^5.8.0", @@ -3874,6 +3928,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -3930,6 +3985,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", @@ -3942,7 +3998,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@chainlink/contracts/node_modules/elliptic": { "version": "6.6.1", @@ -4031,6 +4088,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -6851,6 +6909,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -6917,6 +6976,7 @@ "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -6935,6 +6995,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -6948,6 +7009,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -6966,7 +7028,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@jest/console/node_modules/ansi-styles": { "version": "5.2.0", @@ -6974,6 +7037,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -6993,6 +7057,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -7003,6 +7068,7 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -7024,6 +7090,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -7042,6 +7109,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7055,6 +7123,7 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -7070,6 +7139,7 @@ "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/console": "30.2.0", "@jest/pattern": "30.0.1", @@ -7118,6 +7188,7 @@ "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/get-type": "30.1.0" }, @@ -7131,6 +7202,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -7144,6 +7216,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -7162,7 +7235,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@jest/core/node_modules/ansi-styles": { "version": "5.2.0", @@ -7170,6 +7244,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -7189,6 +7264,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -7199,6 +7275,7 @@ "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", @@ -7217,6 +7294,7 @@ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", @@ -7233,6 +7311,7 @@ "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", @@ -7249,6 +7328,7 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -7270,6 +7350,7 @@ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -7285,6 +7366,7 @@ "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", @@ -7318,6 +7400,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -7336,6 +7419,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7349,6 +7433,7 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -7364,6 +7449,7 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -7376,6 +7462,7 @@ "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -7389,6 +7476,7 @@ "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } @@ -7458,6 +7546,7 @@ "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } @@ -7484,6 +7573,7 @@ "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "jest-regex-util": "30.0.1" @@ -7498,6 +7588,7 @@ "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "30.2.0", @@ -7541,6 +7632,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -7554,6 +7646,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -7572,7 +7665,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@jest/reporters/node_modules/ansi-styles": { "version": "5.2.0", @@ -7580,6 +7674,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -7599,6 +7694,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -7609,6 +7705,7 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -7630,6 +7727,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -7648,6 +7746,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7661,6 +7760,7 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -7688,6 +7788,7 @@ "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "chalk": "^4.1.2", @@ -7704,6 +7805,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -7717,6 +7819,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -7735,7 +7838,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@jest/source-map": { "version": "30.0.1", @@ -7743,6 +7847,7 @@ "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "callsites": "^3.1.0", @@ -7758,6 +7863,7 @@ "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/console": "30.2.0", "@jest/types": "30.2.0", @@ -7774,6 +7880,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -7787,6 +7894,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -7805,7 +7913,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@jest/test-sequencer": { "version": "30.2.0", @@ -7813,6 +7922,7 @@ "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/test-result": "30.2.0", "graceful-fs": "^4.2.11", @@ -7829,6 +7939,7 @@ "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.27.4", "@jest/types": "30.2.0", @@ -7856,6 +7967,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -7869,6 +7981,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -7887,7 +8000,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@jest/transform/node_modules/ci-info": { "version": "4.3.1", @@ -7901,6 +8015,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -7911,6 +8026,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -7929,6 +8045,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7987,6 +8104,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -8372,7 +8490,8 @@ "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" + "license": "MIT", + "peer": true }, "node_modules/@next/swc-darwin-arm64": { "version": "14.2.33", @@ -8386,6 +8505,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 10" } @@ -8402,6 +8522,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 10" } @@ -8418,6 +8539,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -8434,6 +8556,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -8450,6 +8573,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -8466,6 +8590,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -8482,6 +8607,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10" } @@ -8498,6 +8624,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10" } @@ -8514,6 +8641,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10" } @@ -8607,7 +8735,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -10419,6 +10546,7 @@ "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.1.tgz", "integrity": "sha512-B1SRwpntaAcckiatxbjzylvNK562Ayza05gdJCjDQHTiDafa1OABmyB5LHt7qWDOpNkaluD+w11vHF7pBmTpzQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -10428,6 +10556,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.1.tgz", "integrity": "sha512-ezXTN70ygVm9l2m0i+pAlct0RntoV4afftWMGUIeAWLgaca9qItQ54uOt32I/9dBJvzBibT33luIR/pBG0dQvg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", @@ -10450,6 +10579,7 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10470,6 +10600,7 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.1.tgz", "integrity": "sha512-H/eMdtOy9nEeX7YVeEG1N2vyCoifw3dr9OV8++xfUElNYV7LtSmJ6AqxZUUfxGJRDFPQvaU/8enmJlM/l11VxQ==", "license": "MIT", + "peer": true, "dependencies": { "@react-native/dev-middleware": "0.82.1", "debug": "^4.4.0", @@ -10500,6 +10631,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -10512,6 +10644,7 @@ "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.1.tgz", "integrity": "sha512-a2O6M7/OZ2V9rdavOHyCQ+10z54JX8+B+apYKCQ6a9zoEChGTxUMG2YzzJ8zZJVvYf1ByWSNxv9Se0dca1hO9A==", "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -10521,6 +10654,7 @@ "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.1.tgz", "integrity": "sha512-fdRHAeqqPT93bSrxfX+JHPpCXHApfDUdrXMXhoxlPgSzgXQXJDykIViKhtpu0M6slX6xU/+duq+AtP/qWJRpBw==", "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" @@ -10534,6 +10668,7 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.1.tgz", "integrity": "sha512-wuOIzms/Qg5raBV6Ctf2LmgzEOCqdP3p1AYN4zdhMT110c39TVMbunpBaJxm0Kbt2HQ762MQViF9naxk7SBo4w==", "license": "MIT", + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.82.1", @@ -10557,6 +10692,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -10566,6 +10702,7 @@ "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.1.tgz", "integrity": "sha512-KkF/2T1NSn6EJ5ALNT/gx0MHlrntFHv8YdooH9OOGl9HQn5NM0ZmQSr86o5utJsGc7ME3R6p3SaQuzlsFDrn8Q==", "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -10575,6 +10712,7 @@ "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.1.tgz", "integrity": "sha512-tf70X7pUodslOBdLN37J57JmDPB/yiZcNDzS2m+4bbQzo8fhx3eG9QEBv5n4fmzqfGAgSB4BWRHgDMXmmlDSVA==", "license": "MIT", + "peer": true, "engines": { "node": ">= 20.19.4" } @@ -10583,7 +10721,8 @@ "version": "0.82.1", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.1.tgz", "integrity": "sha512-CCfTR1uX+Z7zJTdt3DNX9LUXr2zWXsNOyLbwupW2wmRzrxlHRYfmLgTABzRL/cKhh0Ubuwn15o72MQChvCRaHw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", @@ -11195,6 +11334,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -11221,6 +11361,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11237,6 +11378,7 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.1.tgz", "integrity": "sha512-f5zpJg9gzh7JtCbsIwV+4kP3eI0QBuA93JGmwFRd4onQ3DnCjV2J5pYqdWtM95sjSKK1dyik59Gj01lLeKqs1Q==", "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -11344,6 +11486,7 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "license": "MIT", + "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -11365,6 +11508,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11381,6 +11525,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -11397,6 +11542,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -11412,6 +11558,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "license": "MIT", + "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -11456,6 +11603,7 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11476,6 +11624,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -11492,6 +11641,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -11501,6 +11651,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -11518,6 +11669,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -11543,6 +11695,7 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -11552,6 +11705,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -11567,6 +11721,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11651,6 +11806,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -11660,6 +11816,7 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -11668,13 +11825,15 @@ "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@solana-mobile/mobile-wallet-adapter-protocol-web3js/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", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -11686,13 +11845,15 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/@solana-mobile/mobile-wallet-adapter-protocol-web3js/node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "license": "ISC", + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -11706,6 +11867,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -11735,6 +11897,7 @@ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -11775,6 +11938,7 @@ "integrity": "sha512-f5zpJg9gzh7JtCbsIwV+4kP3eI0QBuA93JGmwFRd4onQ3DnCjV2J5pYqdWtM95sjSKK1dyik59Gj01lLeKqs1Q==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -11799,6 +11963,7 @@ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -11821,6 +11986,7 @@ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "license": "BSD-3-Clause", "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -11838,6 +12004,7 @@ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -11854,6 +12021,7 @@ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -11871,6 +12039,7 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">=18" } @@ -11882,6 +12051,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11903,6 +12073,7 @@ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "license": "BSD-3-Clause", "optional": true, + "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -11920,6 +12091,7 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "optional": true, + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -11930,6 +12102,7 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -11948,6 +12121,7 @@ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -11974,6 +12148,7 @@ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "license": "MIT", "optional": true, + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -11984,6 +12159,7 @@ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -11994,12 +12170,84 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "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==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "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", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "ansi-regex": "^5.0.0", + "babel-jest": "^29.7.0", + "babel-plugin-syntax-hermes-parser": "0.32.0", + "base64-js": "^1.5.1", + "commander": "^12.0.0", + "flow-enums-runtime": "^0.0.6", + "glob": "^7.1.1", + "hermes-compiler": "0.0.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", + "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", + "semver": "^7.1.3", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0", + "ws": "^6.2.3", + "yargs": "^17.6.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@types/react": "^19.1.1", + "react": "^19.1.1" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -12009,7 +12257,8 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/semver": { "version": "7.7.3", @@ -12017,6 +12266,7 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "optional": true, + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -12029,7 +12279,8 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC", - "optional": true + "optional": true, + "peer": true }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/supports-color": { "version": "8.1.1", @@ -12037,6 +12288,7 @@ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12053,6 +12305,7 @@ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "license": "ISC", "optional": true, + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -12067,6 +12320,7 @@ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -12092,6 +12346,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -12118,6 +12373,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12134,6 +12390,7 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.1.tgz", "integrity": "sha512-f5zpJg9gzh7JtCbsIwV+4kP3eI0QBuA93JGmwFRd4onQ3DnCjV2J5pYqdWtM95sjSKK1dyik59Gj01lLeKqs1Q==", "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -12241,6 +12498,7 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "license": "MIT", + "peer": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -12262,6 +12520,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12278,6 +12537,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -12294,6 +12554,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -12309,6 +12570,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "license": "MIT", + "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -12353,6 +12615,7 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12373,6 +12636,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -12389,6 +12653,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -12398,6 +12663,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -12415,6 +12681,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -12440,6 +12707,7 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -12449,6 +12717,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -12464,6 +12733,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12548,6 +12818,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -12557,6 +12828,7 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -12565,13 +12837,15 @@ "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@solana-mobile/wallet-standard-mobile/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", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -12583,13 +12857,15 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/@solana-mobile/wallet-standard-mobile/node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "license": "ISC", + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -12603,6 +12879,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "license": "MIT", + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -12909,7 +13186,6 @@ "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-5.0.0.tgz", "integrity": "sha512-3ahtzmmMgU+1l2YMhQJSKKm14IdvCycOE/m4XNMu/4icBIptmBgZxrmgRpPHqBilBa+Krp/hBuTg4HWl9IAgWw==", "license": "MIT", - "peer": true, "dependencies": { "@solana/accounts": "5.0.0", "@solana/addresses": "5.0.0", @@ -13293,7 +13569,6 @@ "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-5.0.0.tgz", "integrity": "sha512-F/GEb2rS8mrgDd79lDPyu8za9jGE6cRlS4jHNeKCkvOCJxdKQbX34JIzx4kwzjtvk7O8/yrDHfGdpA8nBg/l4w==", "license": "MIT", - "peer": true, "dependencies": { "@solana/accounts": "5.0.0", "@solana/codecs": "5.0.0", @@ -13385,7 +13660,6 @@ "resolved": "https://registry.npmjs.org/@solana/wallet-adapter-base/-/wallet-adapter-base-0.9.27.tgz", "integrity": "sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@solana/wallet-standard-features": "^1.3.0", "@wallet-standard/base": "^1.1.0", @@ -13632,7 +13906,6 @@ "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz", "integrity": "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", @@ -14412,6 +14685,18 @@ } } }, + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/tree-sitter": { + "version": "0.22.4", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.4.tgz", + "integrity": "sha512-usbHZP9/oxNsUY65MQUsduGRqDHQOou1cagUSwjhoSYAmSahjQDAVsh9s+SlZkn8X8+O1FULRGwHu7AFP3kjzg==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + } + }, "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", @@ -14503,7 +14788,8 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@swc/helpers": { "version": "0.5.17", @@ -14778,7 +15064,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -14832,7 +15117,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -14842,7 +15126,6 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -14989,7 +15272,6 @@ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -15189,7 +15471,8 @@ "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-android-arm64": { "version": "1.11.1", @@ -15203,7 +15486,8 @@ "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-darwin-arm64": { "version": "1.11.1", @@ -15217,7 +15501,8 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-darwin-x64": { "version": "1.11.1", @@ -15231,7 +15516,8 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-freebsd-x64": { "version": "1.11.1", @@ -15245,7 +15531,8 @@ "optional": true, "os": [ "freebsd" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { "version": "1.11.1", @@ -15259,7 +15546,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { "version": "1.11.1", @@ -15273,7 +15561,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { "version": "1.11.1", @@ -15287,7 +15576,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { "version": "1.11.1", @@ -15301,7 +15591,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { "version": "1.11.1", @@ -15315,7 +15606,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { "version": "1.11.1", @@ -15329,7 +15621,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { "version": "1.11.1", @@ -15343,7 +15636,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { "version": "1.11.1", @@ -15357,7 +15651,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { "version": "1.11.1", @@ -15371,7 +15666,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { "version": "1.11.1", @@ -15385,7 +15681,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { "version": "1.11.1", @@ -15397,6 +15694,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, @@ -15411,6 +15709,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", @@ -15429,7 +15728,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { "version": "1.11.1", @@ -15443,7 +15743,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { "version": "1.11.1", @@ -15457,7 +15758,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@vercel/analytics": { "version": "1.5.0", @@ -15857,6 +16159,7 @@ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", + "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -15869,6 +16172,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", + "peer": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -15882,7 +16186,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -15959,7 +16262,6 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -16038,7 +16340,8 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ansi-align": { "version": "3.0.1", @@ -16093,6 +16396,7 @@ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -16109,6 +16413,7 @@ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=10" }, @@ -16353,7 +16658,8 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/assertion-error": { "version": "1.1.0", @@ -16395,7 +16701,6 @@ "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.3.tgz", "integrity": "sha512-KzDk41F9Dspf5fM/Ls4XZhV4/csjJcWBrlenbnp5V3NGwU1zEaJz/HIyrdKdf5yw+FgwCeD2+Yos1Xkx9gnI0A==", "license": "MIT", - "peer": true, "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", @@ -16743,7 +17048,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/async-sema": { "version": "3.1.1", @@ -16825,6 +17131,7 @@ "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/transform": "30.2.0", "@types/babel__core": "^7.20.5", @@ -16847,6 +17154,7 @@ "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "workspaces": [ "test/babel-8" ], @@ -16867,6 +17175,7 @@ "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/babel__core": "^7.20.5" }, @@ -16879,6 +17188,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", "license": "MIT", + "peer": true, "dependencies": { "hermes-parser": "0.32.0" } @@ -16924,6 +17234,7 @@ "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "babel-plugin-jest-hoist": "30.2.0", "babel-preset-current-node-syntax": "^1.2.0" @@ -17213,7 +17524,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -17246,7 +17556,6 @@ "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "license": "MIT", - "peer": true, "dependencies": { "base-x": "^5.0.0" } @@ -17288,7 +17597,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/buffer-layout": { "version": "1.2.2", @@ -17299,6 +17609,20 @@ "node": ">=4.5" } }, + "node_modules/bufferutil": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", + "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/bufio": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/bufio/-/bufio-1.2.3.tgz", @@ -17335,6 +17659,7 @@ "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" }, @@ -17534,6 +17859,7 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -17646,6 +17972,7 @@ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -17664,6 +17991,7 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", + "peer": true, "bin": { "is-docker": "cli.js" }, @@ -17679,6 +18007,7 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -17691,6 +18020,7 @@ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -17705,6 +18035,7 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", + "peer": true, "bin": { "is-docker": "cli.js" }, @@ -17720,6 +18051,7 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", + "peer": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -17732,6 +18064,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", + "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -17759,7 +18092,8 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.1.tgz", "integrity": "sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/class-variance-authority": { "version": "0.7.0", @@ -17837,7 +18171,8 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/clipboard": { "version": "2.0.11", @@ -17855,6 +18190,7 @@ "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", @@ -17868,13 +18204,15 @@ "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" + "license": "MIT", + "peer": true }, "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" } @@ -17884,6 +18222,7 @@ "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", @@ -17898,6 +18237,7 @@ "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", @@ -17934,6 +18274,7 @@ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -17954,7 +18295,8 @@ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/color-convert": { "version": "2.0.1", @@ -18040,6 +18382,7 @@ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "license": "MIT", + "peer": true, "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", @@ -18055,6 +18398,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -18063,7 +18407,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/consola": { "version": "3.4.2", @@ -18446,6 +18791,7 @@ "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -18581,6 +18927,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -18605,6 +18952,7 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -18640,6 +18988,7 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -18912,7 +19261,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/electron-to-chromium": { "version": "1.5.260", @@ -18947,6 +19297,7 @@ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -18965,6 +19316,7 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -19032,6 +19384,7 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "license": "MIT", + "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -19288,7 +19641,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -19309,7 +19663,6 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -19366,7 +19719,6 @@ "integrity": "sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -19506,7 +19858,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -19600,7 +19951,6 @@ "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "builtins": "^5.0.1", "eslint-plugin-es": "^4.1.0", @@ -19671,7 +20021,6 @@ "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -20142,6 +20491,7 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -20281,6 +20631,7 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -20306,6 +20657,7 @@ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -20329,7 +20681,8 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/exenv": { "version": "1.2.2", @@ -20343,6 +20696,7 @@ "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -20368,7 +20722,8 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/extend": { "version": "3.0.2", @@ -20567,6 +20922,7 @@ "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "license": "(MIT OR Apache-2.0)", + "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -20629,6 +20985,7 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "license": "MIT", + "peer": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -20647,6 +21004,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -20655,7 +21013,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/find-up": { "version": "4.1.0", @@ -20725,7 +21084,8 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/focus-trap": { "version": "7.6.6", @@ -20885,6 +21245,7 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -21887,19 +22248,22 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hermes-estree": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hermes-parser": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "license": "MIT", + "peer": true, "dependencies": { "hermes-estree": "0.32.0" } @@ -22006,6 +22370,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", + "peer": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -22022,6 +22387,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -22068,6 +22434,7 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=10.17.0" } @@ -22156,6 +22523,7 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "license": "MIT", + "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -22171,7 +22539,6 @@ "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -22207,6 +22574,7 @@ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -22648,6 +23016,7 @@ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -23014,6 +23383,7 @@ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -23031,6 +23401,7 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -23044,6 +23415,7 @@ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -23059,6 +23431,7 @@ "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", @@ -23074,6 +23447,7 @@ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -23087,7 +23461,8 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jackspeak": { "version": "3.4.3", @@ -23187,6 +23562,7 @@ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", @@ -23214,6 +23590,7 @@ "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "execa": "^5.1.1", "jest-util": "30.2.0", @@ -23229,6 +23606,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -23242,6 +23620,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -23260,7 +23639,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-changed-files/node_modules/ci-info": { "version": "4.3.1", @@ -23274,6 +23654,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -23284,6 +23665,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -23302,6 +23684,7 @@ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -23318,6 +23701,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -23331,6 +23715,7 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -23344,6 +23729,7 @@ "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/expect": "30.2.0", @@ -23376,6 +23762,7 @@ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", @@ -23392,6 +23779,7 @@ "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "expect": "30.2.0", "jest-snapshot": "30.2.0" @@ -23406,6 +23794,7 @@ "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/get-type": "30.1.0" }, @@ -23419,6 +23808,7 @@ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", @@ -23437,6 +23827,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -23450,6 +23841,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -23468,7 +23860,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-circus/node_modules/@sinonjs/fake-timers": { "version": "13.0.5", @@ -23476,6 +23869,7 @@ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -23486,6 +23880,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -23505,6 +23900,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -23515,6 +23911,7 @@ "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", @@ -23533,6 +23930,7 @@ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", @@ -23549,6 +23947,7 @@ "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", @@ -23565,6 +23964,7 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -23586,6 +23986,7 @@ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -23601,6 +24002,7 @@ "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", @@ -23634,6 +24036,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -23652,6 +24055,7 @@ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -23668,6 +24072,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -23681,6 +24086,7 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -23696,6 +24102,7 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -23709,6 +24116,7 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -23722,6 +24130,7 @@ "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/test-result": "30.2.0", @@ -23755,6 +24164,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -23768,6 +24178,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -23786,7 +24197,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-cli/node_modules/ci-info": { "version": "4.3.1", @@ -23800,6 +24212,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -23810,6 +24223,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -23828,6 +24242,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -23841,6 +24256,7 @@ "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.27.4", "@jest/get-type": "30.1.0", @@ -23893,6 +24309,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -23906,6 +24323,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -23924,7 +24342,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-config/node_modules/ansi-styles": { "version": "5.2.0", @@ -23932,6 +24351,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -23951,6 +24371,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -23961,6 +24382,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -23979,6 +24401,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -23992,6 +24415,7 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -24023,6 +24447,7 @@ "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "detect-newline": "^3.1.0" }, @@ -24036,6 +24461,7 @@ "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "@jest/types": "30.2.0", @@ -24053,6 +24479,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -24066,6 +24493,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -24084,7 +24512,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-each/node_modules/ansi-styles": { "version": "5.2.0", @@ -24092,6 +24521,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -24111,6 +24541,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -24121,6 +24552,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24139,6 +24571,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -24152,6 +24585,7 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -24167,6 +24601,7 @@ "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/fake-timers": "30.2.0", @@ -24186,6 +24621,7 @@ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", @@ -24202,6 +24638,7 @@ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", @@ -24220,6 +24657,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -24233,6 +24671,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -24251,7 +24690,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-environment-node/node_modules/@sinonjs/fake-timers": { "version": "13.0.5", @@ -24259,6 +24699,7 @@ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -24269,6 +24710,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -24288,6 +24730,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -24298,6 +24741,7 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -24319,6 +24763,7 @@ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24334,6 +24779,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24352,6 +24798,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -24365,6 +24812,7 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -24389,6 +24837,7 @@ "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24414,6 +24863,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -24427,6 +24877,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -24445,7 +24896,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-haste-map/node_modules/ci-info": { "version": "4.3.1", @@ -24459,6 +24911,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -24469,6 +24922,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24487,6 +24941,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -24500,6 +24955,7 @@ "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "pretty-format": "30.2.0" @@ -24514,6 +24970,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -24526,7 +24983,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-leak-detector/node_modules/ansi-styles": { "version": "5.2.0", @@ -24534,6 +24992,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -24547,6 +25006,7 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -24612,6 +25072,7 @@ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" }, @@ -24630,6 +25091,7 @@ "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } @@ -24640,6 +25102,7 @@ "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", @@ -24660,6 +25123,7 @@ "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "jest-regex-util": "30.0.1", "jest-snapshot": "30.2.0" @@ -24674,6 +25138,7 @@ "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/get-type": "30.1.0" }, @@ -24687,6 +25152,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -24700,6 +25166,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -24718,7 +25185,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-resolve-dependencies/node_modules/ansi-styles": { "version": "5.2.0", @@ -24726,6 +25194,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -24745,6 +25214,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -24755,6 +25225,7 @@ "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", @@ -24773,6 +25244,7 @@ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", @@ -24789,6 +25261,7 @@ "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", @@ -24805,6 +25278,7 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -24826,6 +25300,7 @@ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24841,6 +25316,7 @@ "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", @@ -24874,6 +25350,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -24892,6 +25369,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -24905,6 +25383,7 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -24920,6 +25399,7 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -24933,6 +25413,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -24946,6 +25427,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -24964,7 +25446,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-resolve/node_modules/ci-info": { "version": "4.3.1", @@ -24978,6 +25461,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -24988,6 +25472,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -25006,6 +25491,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -25019,6 +25505,7 @@ "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/console": "30.2.0", "@jest/environment": "30.2.0", @@ -25053,6 +25540,7 @@ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", @@ -25069,6 +25557,7 @@ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", @@ -25087,6 +25576,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -25100,6 +25590,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -25118,7 +25609,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-runner/node_modules/@sinonjs/fake-timers": { "version": "13.0.5", @@ -25126,6 +25618,7 @@ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -25136,6 +25629,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -25155,6 +25649,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -25165,6 +25660,7 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -25186,6 +25682,7 @@ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -25201,6 +25698,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -25219,6 +25717,7 @@ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -25235,6 +25734,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -25248,6 +25748,7 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -25263,6 +25764,7 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -25276,6 +25778,7 @@ "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/fake-timers": "30.2.0", @@ -25310,6 +25813,7 @@ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", @@ -25326,6 +25830,7 @@ "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "expect": "30.2.0", "jest-snapshot": "30.2.0" @@ -25340,6 +25845,7 @@ "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/get-type": "30.1.0" }, @@ -25353,6 +25859,7 @@ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", @@ -25371,6 +25878,7 @@ "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/expect": "30.2.0", @@ -25387,6 +25895,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -25400,6 +25909,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -25418,7 +25928,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-runtime/node_modules/@sinonjs/fake-timers": { "version": "13.0.5", @@ -25426,6 +25937,7 @@ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -25436,6 +25948,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -25455,6 +25968,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -25465,6 +25979,7 @@ "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", @@ -25483,6 +25998,7 @@ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", @@ -25499,6 +26015,7 @@ "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", @@ -25515,6 +26032,7 @@ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", @@ -25536,6 +26054,7 @@ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -25551,6 +26070,7 @@ "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", @@ -25584,6 +26104,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -25602,6 +26123,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -25615,6 +26137,7 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -25630,6 +26153,7 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -25865,6 +26389,7 @@ "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/get-type": "30.1.0", "@jest/types": "30.2.0", @@ -25883,6 +26408,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -25896,6 +26422,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -25914,7 +26441,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-validate/node_modules/ansi-styles": { "version": "5.2.0", @@ -25922,6 +26450,7 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -25935,6 +26464,7 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -25950,6 +26480,7 @@ "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/test-result": "30.2.0", "@jest/types": "30.2.0", @@ -25970,6 +26501,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -25983,6 +26515,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -26001,7 +26534,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-watcher/node_modules/ci-info": { "version": "4.3.1", @@ -26015,6 +26549,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -26025,6 +26560,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -26043,6 +26579,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -26056,6 +26593,7 @@ "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", @@ -26073,6 +26611,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -26086,6 +26625,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -26104,7 +26644,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jest-worker/node_modules/ci-info": { "version": "4.3.1", @@ -26118,6 +26659,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -26128,6 +26670,7 @@ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", @@ -26146,6 +26689,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -26159,6 +26703,7 @@ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -26213,6 +26758,7 @@ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sinclair/typebox": "^0.34.0" }, @@ -26226,6 +26772,7 @@ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", @@ -26244,7 +26791,8 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jiti": { "version": "2.6.1", @@ -26312,7 +26860,8 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/jsesc": { "version": "3.1.0", @@ -26585,6 +27134,7 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "license": "Apache-2.0", + "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -26595,6 +27145,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -26603,7 +27154,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lilconfig": { "version": "3.1.3", @@ -26884,7 +27436,8 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.truncate": { "version": "4.4.2", @@ -27115,6 +27668,7 @@ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "semver": "^7.5.3" }, @@ -27131,6 +27685,7 @@ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -27209,7 +27764,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -27565,7 +28121,8 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/merge-options": { "version": "3.0.4", @@ -27610,6 +28167,7 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", @@ -27664,6 +28222,7 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -27679,6 +28238,7 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", "license": "MIT", + "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -27694,6 +28254,7 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27706,6 +28267,7 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", "license": "MIT", + "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -27725,6 +28287,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -27742,6 +28305,7 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -27756,6 +28320,7 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -27776,6 +28341,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -27791,6 +28357,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -27806,6 +28373,7 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -27819,6 +28387,7 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -27831,6 +28400,7 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -27844,6 +28414,7 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", @@ -27865,6 +28436,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27874,6 +28446,7 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -27894,6 +28467,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27903,6 +28477,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27920,6 +28495,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", @@ -27943,13 +28519,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/metro/node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -27965,6 +28543,7 @@ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27974,6 +28553,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -27983,6 +28563,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -27998,6 +28579,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -28774,6 +29356,7 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", + "peer": true, "bin": { "mime": "cli.js" }, @@ -28808,6 +29391,7 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -28978,7 +29562,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": "^18.0.0 || >=20.0.0" } @@ -28989,6 +29572,7 @@ "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "napi-postinstall": "lib/cli.js" }, @@ -29018,6 +29602,7 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -29094,6 +29679,7 @@ "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" @@ -29118,6 +29704,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -29322,6 +29909,7 @@ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "path-key": "^3.0.0" }, @@ -29345,13 +29933,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ob1": { "version": "0.83.3", "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", "license": "MIT", + "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -29505,6 +30095,7 @@ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", + "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -29527,6 +30118,7 @@ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -29626,8 +30218,7 @@ "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/optionator": { "version": "0.9.4", @@ -29965,6 +30556,7 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -30375,6 +30967,7 @@ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "find-up": "^4.0.0" }, @@ -30438,7 +31031,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -30574,7 +31166,6 @@ "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -30605,7 +31196,6 @@ "integrity": "sha512-QgODejq9K3OzoBbuyobZlUhznP5SKwPqp+6Q6xw6o8gnhr4O85L2U915iM2IDcfF2NPXVaM9zlo9tdwipnYwzg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -30709,6 +31299,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "license": "MIT", + "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -30801,7 +31392,8 @@ "url": "https://opencollective.com/fast-check" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/qrcode": { "version": "1.5.4", @@ -30963,6 +31555,7 @@ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "license": "MIT", + "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -31017,7 +31610,6 @@ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz", "integrity": "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/ramda" @@ -31066,6 +31658,7 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -31101,7 +31694,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -31140,6 +31732,7 @@ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "license": "MIT", + "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -31150,6 +31743,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -31171,7 +31765,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -31613,8 +32206,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/redux-immutable": { "version": "4.0.0", @@ -31723,7 +32315,8 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/regex": { "version": "6.0.1", @@ -32235,6 +32828,7 @@ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "resolve-from": "^5.0.0" }, @@ -32445,7 +33039,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -32756,6 +33349,7 @@ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "license": "MIT", + "peer": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -32780,6 +33374,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -32788,13 +33383,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/send/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", + "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -32807,6 +33404,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -32843,6 +33441,7 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "license": "MIT", + "peer": true, "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -32858,6 +33457,7 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -32920,7 +33520,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/sha.js": { "version": "2.4.12", @@ -33026,6 +33627,7 @@ "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" }, @@ -33435,6 +34037,7 @@ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -33446,6 +34049,7 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -33519,13 +34123,15 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "license": "MIT", + "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -33538,6 +34144,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=8" } @@ -33547,6 +34154,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -33590,6 +34198,7 @@ "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" } @@ -33619,6 +34228,7 @@ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -33805,6 +34415,7 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -33815,6 +34426,7 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -33854,6 +34466,7 @@ "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" }, @@ -34005,18 +34618,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.30.3", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.30.3.tgz", + "integrity": "sha512-giQl7/ToPxCqnUAx2wpnSnDNGZtGzw1LyUw6ZitIpTmdrvpxKFY/94v1hihm0zYNpgp1/VY0jTDk//R0BBgnRQ==", "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.30.3", + "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-5.30.3.tgz", + "integrity": "sha512-QIy32nPql6yiV2NVwbww1P7f6HEOAuYrnk8VEJkzPC/p6Xc5Xnz9hhmSHzXTuM70fDbVw/qPzCJ0mZMMultpiw==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.27.1", @@ -34030,7 +34643,7 @@ "ieee754": "^1.2.1", "immutable": "^3.x.x", "js-file-download": "^0.4.12", - "js-yaml": "=4.1.0", + "js-yaml": "=4.1.1", "lodash": "^4.17.21", "prop-types": "^15.8.1", "randexp": "^0.5.3", @@ -34068,18 +34681,6 @@ "@types/trusted-types": "^2.0.7" } }, - "node_modules/swagger-ui-react/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/synckit": { "version": "0.11.11", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", @@ -34187,7 +34788,6 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", "license": "MIT", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -34289,6 +34889,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -34306,13 +34907,15 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -34322,6 +34925,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "license": "MIT", + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -34408,7 +35012,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/through": { "version": "2.3.8", @@ -34475,7 +35080,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -34538,6 +35142,7 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.6" } @@ -34563,6 +35168,18 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, + "node_modules/tree-sitter": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", + "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.0" + } + }, "node_modules/tree-sitter-json": { "version": "0.24.8", "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.24.8.tgz", @@ -34767,7 +35384,6 @@ "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -35371,7 +35987,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -35654,6 +36269,7 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -35671,6 +36287,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "napi-postinstall": "^0.3.0" }, @@ -35800,6 +36417,20 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -35811,6 +36442,7 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -35834,6 +36466,7 @@ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -35890,7 +36523,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -35999,7 +36631,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -36058,7 +36689,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/walk-up-path": { "version": "4.0.0", @@ -36131,7 +36763,8 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/whatwg-url": { "version": "5.0.0", @@ -36408,6 +37041,7 @@ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" @@ -36421,7 +37055,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -36473,6 +37106,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", + "peer": true, "engines": { "node": ">=10" } @@ -36500,6 +37134,7 @@ "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", @@ -36526,13 +37161,15 @@ "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" + "license": "MIT", + "peer": true }, "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" } @@ -36542,6 +37179,7 @@ "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", @@ -36601,7 +37239,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index d4de4dc03a2..4f8affa9d62 100644 --- a/package.json +++ b/package.json @@ -107,8 +107,8 @@ "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.30.3", + "swagger-ui-react": "^5.30.3", "tweetnacl": "^1.0.3", "uuid": "^11.1.0" }, diff --git a/src/components/CCIP/TutorialBlockchainSelector/TutorialBlockchainSelector.tsx b/src/components/CCIP/TutorialBlockchainSelector/TutorialBlockchainSelector.tsx index cc0efbf2652..4d60c741b54 100644 --- a/src/components/CCIP/TutorialBlockchainSelector/TutorialBlockchainSelector.tsx +++ b/src/components/CCIP/TutorialBlockchainSelector/TutorialBlockchainSelector.tsx @@ -32,9 +32,9 @@ export const TutorialBlockchainSelector = () => { const currentState = laneStore.get() const bothChainsSelected = Boolean( currentState.sourceChain && - currentState.destinationChain && - currentState.sourceNetwork && - currentState.destinationNetwork + currentState.destinationChain && + currentState.sourceNetwork && + currentState.destinationNetwork ) updateStepProgress("setup", "blockchains-selected", bothChainsSelected) } From 4243a3b138eb577b961e2347a3e66f6550c1611e Mon Sep 17 00:00:00 2001 From: "Amine E." <aelmanaa@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:28:20 +0000 Subject: [PATCH 012/214] update memento pool (#3240) --- .../data/ccip/v1_2_0/mainnet/lanes.json | 100 +++++++----------- .../data/ccip/v1_2_0/mainnet/tokens.json | 8 +- 2 files changed, 40 insertions(+), 68 deletions(-) diff --git a/src/config/data/ccip/v1_2_0/mainnet/lanes.json b/src/config/data/ccip/v1_2_0/mainnet/lanes.json index 03b56166fc6..e3419d8fb0d 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/mainnet/lanes.json @@ -1068,20 +1068,6 @@ } } }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, "MYST": { "rateLimiterConfig": { "in": { @@ -1689,12 +1675,12 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000000", + "capacity": "250000000000000000000000", "isEnabled": true, "rate": "138880000000000000000" }, "out": { - "capacity": "500000000000000000000000", + "capacity": "250000000000000000000000", "isEnabled": true, "rate": "138880000000000000000" } @@ -1996,12 +1982,12 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000000", + "capacity": "250000000000000000000000", "isEnabled": true, "rate": "138880000000000000000" }, "out": { - "capacity": "500000000000000000000000", + "capacity": "250000000000000000000000", "isEnabled": true, "rate": "138880000000000000000" } @@ -11050,20 +11036,6 @@ } } }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, "MYST": { "rateLimiterConfig": { "in": { @@ -13317,14 +13289,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" } } }, @@ -14058,14 +14030,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" } } }, @@ -20591,12 +20563,12 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000000", + "capacity": "250000000000000000000000", "isEnabled": true, "rate": "138880000000000000000" }, "out": { - "capacity": "500000000000000000000000", + "capacity": "250000000000000000000000", "isEnabled": true, "rate": "138880000000000000000" } @@ -23824,14 +23796,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" } } }, @@ -26279,12 +26251,12 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000000", + "capacity": "250000000000000000000000", "isEnabled": true, "rate": "138880000000000000000" }, "out": { - "capacity": "500000000000000000000000", + "capacity": "250000000000000000000000", "isEnabled": true, "rate": "138880000000000000000" } @@ -28228,12 +28200,12 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000000", + "capacity": "250000000000000000000000", "isEnabled": true, "rate": "138880000000000000000" }, "out": { - "capacity": "500000000000000000000000", + "capacity": "250000000000000000000000", "isEnabled": true, "rate": "138880000000000000000" } @@ -28943,14 +28915,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" } } }, @@ -29469,12 +29441,12 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000000", + "capacity": "250000000000000000000000", "isEnabled": true, "rate": "138880000000000000000" }, "out": { - "capacity": "500000000000000000000000", + "capacity": "250000000000000000000000", "isEnabled": true, "rate": "138880000000000000000" } diff --git a/src/config/data/ccip/v1_2_0/mainnet/tokens.json b/src/config/data/ccip/v1_2_0/mainnet/tokens.json index aa901b607fb..2ee064ddd20 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/mainnet/tokens.json @@ -3168,7 +3168,7 @@ "allowListEnabled": false, "decimals": 18, "name": "DEXTF Token", - "poolAddress": "0x114c782B4d351fdd7b8323716DAc7bB556Cc354A", + "poolAddress": "0x6c9E5fD0FDB36AaF3293Fcc1fb43D9581F706bf7", "poolType": "burnMint", "symbol": "DEXTF", "tokenAddress": "0x4816B2157203D8D4c53918e8d4076Adfe9e2FE22" @@ -3177,7 +3177,7 @@ "allowListEnabled": false, "decimals": 18, "name": "Memento", - "poolAddress": "0x05286231783494D61B1C253E1BC68E4782B41604", + "poolAddress": "0x1c20Db242C0d8EE2cb36480211B9629a00B1e42f", "poolType": "burnMint", "symbol": "DEXTF", "tokenAddress": "0xB69bBB15095C0949489FBB43951d2b750Fa7fA89" @@ -3186,7 +3186,7 @@ "allowListEnabled": false, "decimals": 18, "name": "DEXTF Token", - "poolAddress": "0x0549475Ff447CBC0CfF51CB0719E0AA2dAF4eDC8", + "poolAddress": "0x40fa6991CDbd66e91a25a2875d4d6fb1aF88cD91", "poolType": "lockRelease", "symbol": "DEXTF", "tokenAddress": "0x5F64Ab1544D28732F0A24F4713c2C8ec0dA089f0" @@ -3195,7 +3195,7 @@ "allowListEnabled": false, "decimals": 18, "name": "DEXTF Token", - "poolAddress": "0x6CCF71Db1CAeF39F58f388D8c34d8A49927d73A9", + "poolAddress": "0x1c20Db242C0d8EE2cb36480211B9629a00B1e42f", "poolType": "burnMint", "symbol": "DEXTF", "tokenAddress": "0x5C5C6D078A6458179a2E4837Db25dA4a9330ECD4" From 97a601d4640d0244c4744b7eea9eabbf9a7511ad Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 15:11:14 +0100 Subject: [PATCH 013/214] Changelog Update: New data found (#3232) * Data: Update changelog for new data items * fix cl feeds --------- Co-authored-by: khadni <98668332+khadni@users.noreply.github.com> --- .github/scripts/data/baseline.json | 7 +- public/changelog.json | 105 +++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 1 deletion(-) diff --git a/.github/scripts/data/baseline.json b/.github/scripts/data/baseline.json index b6d478963a2..aea87e7c8e2 100644 --- a/.github/scripts/data/baseline.json +++ b/.github/scripts/data/baseline.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-23T21:03:30Z", + "timestamp": "2025-11-30T21:03:22Z", "knownIds": [ "aptos-apt-usd", "aptos-btc-usd", @@ -185,6 +185,7 @@ "arbitrum-eth-usd", "arbitrum-eth-usd-marketcap", "arbitrum-eth-usd-premium-prod", + "arbitrum-eth-usd-svr", "arbitrum-ethfi-usd-premium-prod", "arbitrum-ethx-eth-exchange-rate", "arbitrum-eur-usd", @@ -365,6 +366,8 @@ "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", @@ -1499,6 +1502,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 +1516,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", diff --git a/public/changelog.json b/public/changelog.json index e9b953630d0..9cae6c20712 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -357,6 +357,111 @@ "title": "Cross-chain token (CCT) standard: Added support for new tokens", "topic": "CCIP" }, + { + "category": "integration", + "date": "2025-11-30", + "description": "New Data Streams available on all [supported networks](https://docs.chain.link/data-streams/crypto-streams):", + "relatedNetworks": [ + "0g", + "apechain", + "aptos", + "arbitrum", + "avalanche", + "base", + "berachain", + "bitlayer", + "blast", + "bnb-chain", + "bob", + "botanix", + "celo", + "ethereum", + "gnosis-chain", + "gravity", + "hashkey", + "hedera", + "hyperliquid", + "injective", + "ink", + "jovay", + "katana", + "lens", + "linea", + "mantle", + "metis", + "monad", + "opbnb", + "optimism", + "polygon", + "plasma", + "ronin", + "scroll", + "shibarium", + "sei", + "soneium", + "sonic", + "solana", + "taiko", + "unichain", + "worldchain", + "zksync" + ], + "relatedTokens": [ + { + "assetName": "Monad", + "baseAsset": "MON", + "quoteAsset": "USD", + "url": "https://data.chain.link/streams/mon-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/mon.webp" + } + ], + "title": "Added support to Data Streams", + "topic": "Data Streams" + }, + { + "category": "integration", + "date": "2025-11-30", + "description": "New SmartData Feeds available:", + "relatedNetworks": ["linea"], + "relatedTokens": [ + { + "assetName": "M", + "baseAsset": "MN", + "network": "linea", + "productTypeCode": "NAV", + "url": "https://data.chain.link/feeds/linea/mainnet/m-nav-linea", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/mn.webp" + } + ], + "title": "Added support to SmartData", + "topic": "SmartData" + }, + { + "category": "integration", + "date": "2025-11-30", + "description": "New Data Feeds available:", + "relatedNetworks": ["linea", "ethereum"], + "relatedTokens": [ + { + "assetName": "Avant Staked ETH", + "baseAsset": "savETH", + "quoteAsset": "avETH", + "network": "linea", + "url": "https://data.chain.link/feeds/linea/mainnet/saveth-aveth-exchange-rate", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/saveth.webp" + }, + { + "assetName": "Monad", + "baseAsset": "MON", + "quoteAsset": "USD", + "network": "arbitrum", + "url": "https://data.chain.link/feeds/arbitrum/mainnet/mon-usd", + "iconUrl": "https://d2f70xi62kby8n.cloudfront.net/tokens/mon.webp" + } + ], + "title": "Added support to Data Feeds", + "topic": "Data Feeds" + }, { "category": "integration", "date": "2025-11-25", From 7307a7203381410be65b8cff36c8b2573d1ffeb2 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Mon, 1 Dec 2025 11:54:35 -0600 Subject: [PATCH 014/214] Copy page & SDK/Chain family components (#3242) * add copy page button * add copy page button * add copy page button * add copy page button * uniformize dropdowns * Restore llms-full in sidebar * refactor: extract shared markdown formatters * copy page position + modal improvements * nit improvements * handle CodeHighlightBlockMulti * nit positioning * shorten copy page desc * fix stripHighlightComments regex * fix stripHighlightComments regex * fix stripHighlightComments regex * reset TS as default for cre --------- Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- jest.config.cjs | 2 + package.json | 2 +- reports/llms-report.json | 8 +- scripts/cleanup-vercel-function.mjs | 49 ++ .../ChainTypeSelector.module.css | 147 ----- .../ChainSelector/ChainTypeSelector.tsx | 130 +---- src/components/LanguageSwitcherDropdown.tsx | 104 +--- src/components/LeftSidebar/LeftSidebar.astro | 16 +- .../LeftSidebar/leftSidebar.module.css | 17 +- src/components/Modal/Modal.tsx | 11 +- .../CopyPageLink/CopyPageLink.module.css | 175 ++++++ .../CopyPageLink/CopyPageLink.tsx | 339 +++++++++++ .../MarkdownPreviewModal.module.css | 259 +++++++++ .../CopyPageLink/MarkdownPreviewModal.tsx | 130 +++++ .../CopyPageLink/contentExtractor.ts | 404 ++++++++++++++ .../RightSidebar/CopyPageLink/index.ts | 8 + .../RightSidebar/CopyPageLink/types.ts | 66 +++ src/components/RightSidebar/LlmsLink.tsx | 30 +- src/components/RightSidebar/MoreMenu.astro | 1 - .../RightSidebar/RightSidebar.astro | 17 +- .../SidebarDropdown.module.css} | 11 + .../SidebarDropdown/SidebarDropdown.tsx | 141 +++++ src/components/SidebarDropdown/index.ts | 2 + src/components/index.ts | 1 + src/config/data/ccip/utils.ts | 2 +- src/content/ccip/llms-full.txt | 6 +- src/features/utils/index.ts | 2 +- src/features/vrf/v2/components/CostTable.tsx | 2 +- src/layouts/DocsLayout.astro | 7 +- src/lib/api/cacheHeaders.ts | 47 ++ .../api => lib}/ccip/faucet/adapters/index.ts | 4 +- .../ccip/faucet/adapters/svm-drip.ts | 6 +- .../api => lib}/ccip/faucet/adapters/svm.ts | 2 +- .../api => lib}/ccip/faucet/chain-resolver.ts | 4 +- .../api => lib}/ccip/faucet/codec/index.ts | 0 src/{pages/api => lib}/ccip/faucet/config.ts | 0 .../ccip/services-api}/chain-config.ts | 2 +- .../services-api}/faucet/drip-orchestrator.ts | 2 +- .../services-api}/faucet/error-handler.ts | 2 +- .../api => lib/ccip}/services/chain-data.ts | 4 +- .../ccip}/services/faucet-service.ts | 6 +- .../api => lib/ccip}/services/lane-data.ts | 4 +- .../api => lib/ccip}/services/token-data.ts | 4 +- src/{pages/api => lib}/ccip/types/faucet.ts | 0 src/{pages/api => lib}/ccip/types/index.ts | 0 src/{pages/api => lib}/ccip/utils.ts | 14 +- src/lib/index.ts | 1 + src/lib/languageStore.ts | 2 +- src/lib/markdown/__tests__/formatters.test.ts | 359 ++++++++++++ .../__tests__/transformMarkdown.test.ts | 112 ++++ src/lib/markdown/componentHandlers.ts | 525 ++++++++++++++++++ src/lib/markdown/formatters.ts | 240 ++++++++ src/lib/markdown/index.ts | 6 + src/lib/markdown/transformMarkdown.ts | 285 ++++++++++ src/lib/markdown/types.ts | 112 ++++ src/lib/markdown/utils.ts | 154 +++++ src/lib/solana/index.ts | 2 +- src/pages/api/ccip/v1/chains.ts | 6 +- .../ccip/v1/drips/[chainName]/challenge.ts | 4 +- .../api/ccip/v1/drips/[chainName]/execute.ts | 12 +- .../api/ccip/v1/drips/[chainName]/index.ts | 4 +- src/pages/api/ccip/v1/lanes.ts | 6 +- src/pages/api/ccip/v1/tokens.ts | 6 +- src/pages/api/page-markdown.ts | 139 +++++ .../copyToClipboard/copyToClipboard.ts | 5 + src/scripts/generate-llms.ts | 37 +- src/tests/chain-api.test.ts | 4 +- 67 files changed, 3721 insertions(+), 490 deletions(-) create mode 100755 scripts/cleanup-vercel-function.mjs delete mode 100644 src/components/ChainSelector/ChainTypeSelector.module.css create mode 100644 src/components/RightSidebar/CopyPageLink/CopyPageLink.module.css create mode 100644 src/components/RightSidebar/CopyPageLink/CopyPageLink.tsx create mode 100644 src/components/RightSidebar/CopyPageLink/MarkdownPreviewModal.module.css create mode 100644 src/components/RightSidebar/CopyPageLink/MarkdownPreviewModal.tsx create mode 100644 src/components/RightSidebar/CopyPageLink/contentExtractor.ts create mode 100644 src/components/RightSidebar/CopyPageLink/index.ts create mode 100644 src/components/RightSidebar/CopyPageLink/types.ts rename src/components/{LanguageSwitcherDropdown.module.css => SidebarDropdown/SidebarDropdown.module.css} (90%) create mode 100644 src/components/SidebarDropdown/SidebarDropdown.tsx create mode 100644 src/components/SidebarDropdown/index.ts create mode 100644 src/lib/api/cacheHeaders.ts rename src/{pages/api => lib}/ccip/faucet/adapters/index.ts (83%) rename src/{pages/api => lib}/ccip/faucet/adapters/svm-drip.ts (94%) rename src/{pages/api => lib}/ccip/faucet/adapters/svm.ts (99%) rename src/{pages/api => lib}/ccip/faucet/chain-resolver.ts (96%) rename src/{pages/api => lib}/ccip/faucet/codec/index.ts (100%) rename src/{pages/api => lib}/ccip/faucet/config.ts (100%) rename src/{pages/api/ccip/services => lib/ccip/services-api}/chain-config.ts (97%) rename src/{pages/api/ccip/services => lib/ccip/services-api}/faucet/drip-orchestrator.ts (99%) rename src/{pages/api/ccip/services => lib/ccip/services-api}/faucet/error-handler.ts (99%) rename src/{pages/api => lib/ccip}/services/chain-data.ts (99%) rename src/{pages/api => lib/ccip}/services/faucet-service.ts (96%) rename src/{pages/api => lib/ccip}/services/lane-data.ts (99%) rename src/{pages/api => lib/ccip}/services/token-data.ts (99%) rename src/{pages/api => lib}/ccip/types/faucet.ts (100%) rename src/{pages/api => lib}/ccip/types/index.ts (100%) rename src/{pages/api => lib}/ccip/utils.ts (97%) create mode 100644 src/lib/markdown/__tests__/formatters.test.ts create mode 100644 src/lib/markdown/__tests__/transformMarkdown.test.ts create mode 100644 src/lib/markdown/componentHandlers.ts create mode 100644 src/lib/markdown/formatters.ts create mode 100644 src/lib/markdown/index.ts create mode 100644 src/lib/markdown/transformMarkdown.ts create mode 100644 src/lib/markdown/types.ts create mode 100644 src/lib/markdown/utils.ts create mode 100644 src/pages/api/page-markdown.ts diff --git a/jest.config.cjs b/jest.config.cjs index fba12927624..74c6196488c 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -13,6 +13,7 @@ module.exports = { extensionsToTreatAsEsm: [".ts", ".tsx"], moduleFileExtensions: ["js", "jsx", "ts", "tsx", "json", "node"], moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", "\\.(css)$": "<rootDir>/src/__mocks__/styleMock.ts", "^~/(.*)$": "<rootDir>/src/$1", "^@api/(.*)$": "<rootDir>/src/pages/api/$1", @@ -29,6 +30,7 @@ module.exports = { "^@variables$": "<rootDir>/src/config/markdown-variables.ts", "^@abi$": "<rootDir>/src/features/abi/index.ts", "^@lib$": "<rootDir>/src/lib/index.ts", + "^@lib/(.*)\\.js$": "<rootDir>/src/lib/$1", "^@lib/(.*)$": "<rootDir>/src/lib/$1", "\\.ya?ml$": "<rootDir>/src/__mocks__/yamlMock.ts", }, diff --git a/package.json b/package.json index 4f8affa9d62..d3cfcb0d571 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", diff --git a/reports/llms-report.json b/reports/llms-report.json index 23c8ab3522c..ccdb883e322 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,5 +1,5 @@ { - "startedAt": "2025-11-25T23:16:10.318Z", + "startedAt": "2025-11-28T16:27:51.081Z", "siteBase": "https://docs.chain.link", "sections": [ { @@ -47,8 +47,8 @@ "pagesProcessed": 54, "outputPath": "src/content/data-streams/llms-full.txt", "bytes": 477065, - "prevBytes": 477061, - "deltaBytes": 4 + "prevBytes": 477065, + "deltaBytes": 0 }, { "section": "dta-technical-standard", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-11-25T23:16:13.816Z" + "finishedAt": "2025-11-28T16:27:55.235Z" } diff --git a/scripts/cleanup-vercel-function.mjs b/scripts/cleanup-vercel-function.mjs new file mode 100755 index 00000000000..85991f22925 --- /dev/null +++ b/scripts/cleanup-vercel-function.mjs @@ -0,0 +1,49 @@ +#!/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 + 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`, + `${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/ChainSelector/ChainTypeSelector.module.css b/src/components/ChainSelector/ChainTypeSelector.module.css deleted file mode 100644 index 41a417e6c67..00000000000 --- a/src/components/ChainSelector/ChainTypeSelector.module.css +++ /dev/null @@ -1,147 +0,0 @@ -.selector { - display: flex; - align-items: center; - padding: var(--space-3x) var(--space-3x); - border-bottom: 1px solid var(--border-color, #e5e7eb); - background: var(--color-background-primary, #ffffff); - position: sticky; - top: 0; - z-index: 10; -} - -.dropdown { - position: relative; - width: auto; - min-width: 160px; -} - -.dropdownButton { - display: flex; - align-items: center; - gap: var(--space-2x); - width: 100%; - padding: var(--space-2x) var(--space-3x); - border: 1.5px solid var(--border-color, #e5e7eb); - border-radius: 6px; - background: var(--color-background-primary, #ffffff); - color: var(--color-text-primary); - font-size: 14px; - font-weight: 500; - cursor: pointer; - transition: all 0.2s ease; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.dropdownButton:hover { - background: var(--color-background-secondary, #f9fafb); - border-color: var(--color-text-tertiary, #9ca3af); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08); - transform: translateY(-1px); -} - -.dropdownButton:active { - transform: translateY(0); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.dropdownButton:focus-visible { - outline: 2px solid var(--color-blue-600, #2563eb); - outline-offset: 2px; - border-color: var(--color-blue-600, #2563eb); -} - -.arrow { - margin-left: auto; - color: var(--color-text-secondary, #6b7280); - transition: transform 0.2s ease; -} - -.arrowOpen { - transform: rotate(180deg); -} - -.dropdownMenu { - position: absolute; - top: calc(100% + 4px); - left: 0; - right: 0; - margin: 0; - padding: var(--space-2x) 0; - list-style: none; - background: var(--color-background-primary, #ffffff); - border: 1.5px solid var(--border-color, #e5e7eb); - border-radius: 6px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); - z-index: 100; - max-height: 300px; - overflow-y: auto; -} - -.dropdownMenu li { - margin: 0; - padding: 0; -} - -.dropdownItem { - display: flex; - align-items: center; - gap: var(--space-2x); - width: 100%; - padding: var(--space-2x) var(--space-3x); - border: none; - background: transparent; - color: var(--color-text-primary); - font-size: 14px; - font-weight: 500; - text-align: left; - cursor: pointer; - transition: all 0.15s ease; -} - -.dropdownItem:hover { - background: var(--color-background-secondary, #f9fafb); - padding-left: calc(var(--space-3x) + 2px); -} - -.dropdownItem:focus-visible { - outline: 2px solid var(--chain-color); - outline-offset: -2px; - background: var(--color-background-secondary, #f9fafb); -} - -.dropdownItemActive { - color: var(--color-blue-600, #2563eb); - font-weight: 600; - background: var(--color-blue-50, #eff6ff); -} - -.icon { - width: 20px; - height: 20px; - flex-shrink: 0; - object-fit: contain; -} - -.name { - white-space: nowrap; - flex: 1; -} - -.checkmark { - margin-left: auto; - color: var(--color-blue-600, #2563eb); - flex-shrink: 0; -} - -@media (max-width: 640px) { - .dropdown { - width: 100%; - min-width: 0; - } -} - -@media (max-width: 480px) { - .dropdownMenu { - max-height: 240px; - } -} diff --git a/src/components/ChainSelector/ChainTypeSelector.tsx b/src/components/ChainSelector/ChainTypeSelector.tsx index 2ebf21e6cdd..e85b99e0996 100644 --- a/src/components/ChainSelector/ChainTypeSelector.tsx +++ b/src/components/ChainSelector/ChainTypeSelector.tsx @@ -1,12 +1,11 @@ /** @jsxImportSource react */ import { useStore } from "@nanostores/react" -import { useState, useRef, useEffect } from "react" import { selectedChainType, setChainType } from "~/stores/chainType.js" import { CHAIN_TYPE_CONFIGS, CCIP_SUPPORTED_CHAINS } from "~/config/chainTypes.js" import { CCIP_SIDEBAR_CONTENT } from "~/config/sidebar/ccip-dynamic.js" import { findEquivalentPageUrlWithFallback } from "~/utils/chainNavigation.js" import type { ChainType } from "~/config/types.js" -import styles from "./ChainTypeSelector.module.css" +import { SidebarDropdown, type DropdownItem } from "../SidebarDropdown/index.js" /** * Chain Type Dropdown Selector Component @@ -30,13 +29,9 @@ import styles from "./ChainTypeSelector.module.css" */ export function ChainTypeSelector() { const activeChain = useStore(selectedChainType) - const [isOpen, setIsOpen] = useState(false) - const dropdownRef = useRef<HTMLDivElement>(null) - const activeConfig = CHAIN_TYPE_CONFIGS[activeChain] - - const handleSelect = (chainType: ChainType) => { - setIsOpen(false) + const handleSelect = (chainId: string) => { + const chainType = chainId as ChainType setChainType(chainType) // Find target URL with intelligent fallback: exact match → parent → section root @@ -45,110 +40,25 @@ export function ChainTypeSelector() { window.location.href = `/${targetUrl}` } - const handleToggle = () => { - setIsOpen(!isOpen) - } - - useEffect(() => { - const handleClickOutside = (event: MouseEvent) => { - if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { - setIsOpen(false) - } + // Convert chain configs to dropdown items format + const chainItems: DropdownItem[] = CCIP_SUPPORTED_CHAINS.map((chainId) => { + const config = CHAIN_TYPE_CONFIGS[chainId] + return { + id: chainId, + label: config.displayName, + icon: config.icon, + description: config.description, } - - const handleEscape = (event: KeyboardEvent) => { - if (event.key === "Escape") { - setIsOpen(false) - } - } - - if (isOpen) { - document.addEventListener("mousedown", handleClickOutside) - document.addEventListener("keydown", handleEscape) - } - - return () => { - document.removeEventListener("mousedown", handleClickOutside) - document.removeEventListener("keydown", handleEscape) - } - }, [isOpen]) + }) return ( - <div className={styles.selector} ref={dropdownRef}> - <div className={styles.dropdown}> - <button - type="button" - className={styles.dropdownButton} - onClick={handleToggle} - aria-expanded={isOpen} - aria-haspopup="listbox" - aria-label="Select blockchain type" - style={{ "--chain-color": activeConfig.color } as React.CSSProperties} - > - <img src={activeConfig.icon} alt="" className={styles.icon} width="20" height="20" aria-hidden="true" /> - <span className={styles.name}>{activeConfig.displayName}</span> - <svg - className={`${styles.arrow} ${isOpen ? styles.arrowOpen : ""}`} - width="12" - height="12" - viewBox="0 0 12 12" - fill="none" - xmlns="http://www.w3.org/2000/svg" - aria-hidden="true" - > - <path - d="M2.5 4.5L6 8L9.5 4.5" - stroke="currentColor" - strokeWidth="1.5" - strokeLinecap="round" - strokeLinejoin="round" - /> - </svg> - </button> - - {isOpen && ( - <ul className={styles.dropdownMenu} role="listbox" aria-label="Blockchain options"> - {CCIP_SUPPORTED_CHAINS.map((chainId) => { - const config = CHAIN_TYPE_CONFIGS[chainId] - const isActive = activeChain === chainId - - return ( - <li key={chainId} role="option" aria-selected={isActive}> - <button - type="button" - className={`${styles.dropdownItem} ${isActive ? styles.dropdownItemActive : ""}`} - onClick={() => handleSelect(chainId)} - style={{ "--chain-color": config.color } as React.CSSProperties} - title={config.description} - > - <img src={config.icon} alt="" className={styles.icon} width="20" height="20" aria-hidden="true" /> - <span className={styles.name}>{config.displayName}</span> - {isActive && ( - <svg - className={styles.checkmark} - width="16" - height="16" - viewBox="0 0 16 16" - fill="none" - xmlns="http://www.w3.org/2000/svg" - aria-hidden="true" - > - <path - d="M13.5 4.5L6 12L2.5 8.5" - stroke="currentColor" - strokeWidth="2" - strokeLinecap="round" - strokeLinejoin="round" - /> - </svg> - )} - </button> - </li> - ) - })} - </ul> - )} - </div> - </div> + <SidebarDropdown + label="Chain Family" + items={chainItems} + selectedId={activeChain} + onSelect={handleSelect} + triggerId="chain-type-selector-trigger" + ariaLabel="Select blockchain type" + /> ) } diff --git a/src/components/LanguageSwitcherDropdown.tsx b/src/components/LanguageSwitcherDropdown.tsx index 88a3f9d1495..c79c808b120 100644 --- a/src/components/LanguageSwitcherDropdown.tsx +++ b/src/components/LanguageSwitcherDropdown.tsx @@ -1,6 +1,6 @@ -import { useState, useEffect, useRef } from "react" +import { useState, useEffect } from "react" import { selectedLanguage, type SupportedLanguage } from "~/lib/languageStore.js" -import styles from "./LanguageSwitcherDropdown.module.css" +import { SidebarDropdown, type DropdownItem } from "./SidebarDropdown/index.js" const goLogo = "/images/icons/go_logo_black.png" const tsLogo = "/images/icons/typescript_logo.png" @@ -23,10 +23,14 @@ function getInitialLanguage(): SupportedLanguage { } } +// Convert language config to dropdown items format +const languageItems: DropdownItem[] = [ + { id: "go", label: "Go", icon: goLogo }, + { id: "ts", label: "TypeScript", icon: tsLogo }, +] + export function LanguageSwitcherDropdown() { const [clientLanguage, setClientLanguage] = useState<SupportedLanguage>(getInitialLanguage) - const [isOpen, setIsOpen] = useState(false) - const dropdownRef = useRef<HTMLDivElement>(null) // After component mounts on client, sync with the store useEffect(() => { @@ -58,91 +62,23 @@ export function LanguageSwitcherDropdown() { } }, []) - // Close dropdown when clicking outside - useEffect(() => { - function handleClickOutside(event: MouseEvent) { - if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { - setIsOpen(false) - } - } - - if (isOpen) { - document.addEventListener("mousedown", handleClickOutside) - } - - return () => { - document.removeEventListener("mousedown", handleClickOutside) - } - }, [isOpen]) - - const setLanguage = (lang: SupportedLanguage) => { + const handleSelect = (lang: string) => { + const newLang = lang as SupportedLanguage // Update nanostore - selectedLanguage.set(lang) - setIsOpen(false) + selectedLanguage.set(newLang) // Dispatch custom event for page-level redirects - window.dispatchEvent(new CustomEvent("languageChanged", { detail: { language: lang } })) + window.dispatchEvent(new CustomEvent("languageChanged", { detail: { language: newLang } })) } - const currentConfig = languageConfig[clientLanguage] - return ( - <div className={styles.dropdown} ref={dropdownRef}> - <label className={styles.label} htmlFor="language-selector-trigger"> - SDK Language - </label> - <button - id="language-selector-trigger" - className={styles.trigger} - onClick={() => setIsOpen(!isOpen)} - aria-haspopup="true" - aria-expanded={isOpen} - aria-label="Select programming language" - type="button" - > - <img src={currentConfig.logo} alt={currentConfig.label} className={styles.triggerIcon} /> - <span className={styles.triggerText}>{currentConfig.label}</span> - <svg className={styles.arrow} width="12" height="12" viewBox="0 0 12 12" fill="none"> - <path - d="M2.5 4.5L6 8L9.5 4.5" - stroke="currentColor" - strokeWidth="1.5" - strokeLinecap="round" - strokeLinejoin="round" - /> - </svg> - </button> - - {isOpen && ( - <div className={styles.menu}> - <div className={styles.menuContent}> - {(Object.entries(languageConfig) as [SupportedLanguage, typeof languageConfig.go][]).map( - ([lang, config]) => ( - <button - key={lang} - className={`${styles.option} ${clientLanguage === lang ? styles.selected : ""}`} - onClick={() => setLanguage(lang)} - type="button" - > - <img src={config.logo} alt={config.label} className={styles.optionIcon} /> - <span>{config.label}</span> - {clientLanguage === lang && ( - <svg className={styles.checkmark} width="16" height="16" viewBox="0 0 16 16" fill="none"> - <path - d="M13.5 4.5L6 12L2.5 8.5" - stroke="currentColor" - strokeWidth="2" - strokeLinecap="round" - strokeLinejoin="round" - /> - </svg> - )} - </button> - ) - )} - </div> - </div> - )} - </div> + <SidebarDropdown + label="SDK Language" + items={languageItems} + selectedId={clientLanguage} + onSelect={handleSelect} + triggerId="language-selector-trigger" + ariaLabel="Select programming language" + /> ) } diff --git a/src/components/LeftSidebar/LeftSidebar.astro b/src/components/LeftSidebar/LeftSidebar.astro index 78f691d9717..3066a4c384a 100644 --- a/src/components/LeftSidebar/LeftSidebar.astro +++ b/src/components/LeftSidebar/LeftSidebar.astro @@ -83,14 +83,10 @@ const sidebarSections = getSidebarSections(section) --- <nav aria-labelledby="grid-left" class={styles.nav}> - { - section === "cre" && ( - <div class={styles.languageSwitcherTablet}> - <LanguageSwitcherDropdown client:only="react" /> - </div> - ) - } - {showChainSelector && <ChainTypeSelector client:only="react" />} + <div class={styles.sidebarDropdowns}> + {section === "cre" && <LanguageSwitcherDropdown client:only="react" />} + {showChainSelector && <ChainTypeSelector client:only="react" />} + </div> <ul class={styles.navGroups} data-sticky> { sidebarSections.map((group) => ( @@ -124,7 +120,7 @@ const sidebarSections = getSidebarSections(section) </style> <script> - import { initializeChainType } from "~/stores/chainType" + import { initializeChainType } from "~/stores/chainType.js" /** * Initialize chain type selection from URL on page load @@ -160,7 +156,7 @@ const sidebarSections = getSidebarSections(section) </script> <script> - import { selectedChainType } from "~/stores/chainType" + import { selectedChainType } from "~/stores/chainType.js" /** * Filters sidebar items based on selected chain type diff --git a/src/components/LeftSidebar/leftSidebar.module.css b/src/components/LeftSidebar/leftSidebar.module.css index 9299511f69d..8a1f5b7a84b 100644 --- a/src/components/LeftSidebar/leftSidebar.module.css +++ b/src/components/LeftSidebar/leftSidebar.module.css @@ -7,6 +7,10 @@ overflow: hidden; /* Prevent nav overflow */ } +.sidebarDropdowns { + padding-top: var(--space-3x); +} + .navGroups { padding: var(--doc-padding) var(--space-8x) var(--doc-padding) 0; height: 100%; @@ -112,16 +116,3 @@ details[open] > .navGroupTitle { :global(:root.theme-dark) .navLink[aria-current="page"] { color: hsla(var(--color-base-white), 100%, 1); } - -/* Language Switcher for tablet screens (800px-1200px) */ -.languageSwitcherTablet { - padding: var(--space-6x) var(--space-6x) 0 var(--space-6x); - display: none; -} - -/* Show on tablet/medium screens where left sidebar is visible but right sidebar is hidden */ -@media (min-width: 50em) and (max-width: 1199px) { - .languageSwitcherTablet { - display: block; - } -} diff --git a/src/components/Modal/Modal.tsx b/src/components/Modal/Modal.tsx index 18d989f7ac2..9e705a665c6 100644 --- a/src/components/Modal/Modal.tsx +++ b/src/components/Modal/Modal.tsx @@ -1,6 +1,6 @@ import React from "react" import styles from "./Modal.module.css" -import FocusTrap from "focus-trap-react" +import { FocusTrap } from "focus-trap-react" import { createPortal } from "react-dom" import { useKeyPress } from "~/hooks/useKeyPress.ts" import { clsx } from "~/lib/clsx/clsx.ts" @@ -24,16 +24,7 @@ export function Modal({ <> {isOpen && createPortal( - // For some reason the error says that the element doesn't match even though it does - // and it also works correctly. - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore <FocusTrap> - {/* - For some reason the error says that the element doesn't match even though it does - and it also works correctly. - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - @ts-ignore */} <div> <div className={styles.overlay} onClick={onClose}></div> <div id={modalId} className={clsx(styles.modal)} tabIndex={0} style={style}> diff --git a/src/components/RightSidebar/CopyPageLink/CopyPageLink.module.css b/src/components/RightSidebar/CopyPageLink/CopyPageLink.module.css new file mode 100644 index 00000000000..4e04dbfdb63 --- /dev/null +++ b/src/components/RightSidebar/CopyPageLink/CopyPageLink.module.css @@ -0,0 +1,175 @@ +/** + * Styles for CopyPageLink component + * Matches left sidebar dropdown styling pattern + */ + +.container { + position: relative; + width: 100%; +} + +.label { + display: block; + font-size: 0.75rem; + font-weight: 500; + color: var(--gray-600, #4b5563); + margin-bottom: 8px; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.trigger { + /* Match left sidebar dropdown styling */ + display: flex; + align-items: center; + gap: 10px; + padding: 12px 14px; + background-color: var(--gray-100, #f3f4f6); + border: none; + border-radius: 6px; + cursor: pointer; + transition: all 0.2s ease; + font-size: 15px; + font-weight: 500; + color: var(--gray-900, #111827); + width: 100%; + position: relative; +} + +.trigger:hover { + background-color: var(--gray-200, #e5e7eb); +} + +.trigger:focus-visible { + outline: 2px solid var(--blue-500, #0847f7); + outline-offset: 2px; +} + +.triggerIcon { + width: 20px; + height: 20px; + flex-shrink: 0; +} + +.triggerText { + flex: 1; + text-align: left; + min-width: 0; + font-weight: 500; + color: var(--gray-900, #111827); +} + +.arrow { + flex-shrink: 0; + width: 16px; + height: 16px; + transition: transform 0.2s ease; + color: var(--gray-500, #6b7280); +} + +.trigger[aria-expanded="true"] .arrow { + transform: rotate(180deg); +} + +.dropdown { + position: absolute; + top: calc(100% + 4px); + left: 0; + right: 0; + background: white; + border: 1px solid var(--blue-200, #bfdbfe); + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + z-index: 1000; + overflow: hidden; + isolation: isolate; +} + +.dropdownContent { + padding: 6px; + display: flex; + flex-direction: column; + gap: 0; +} + +.dropdownItem { + display: flex; + align-items: flex-start; + gap: 12px; + width: 100%; + padding: 10px 12px; + background: transparent; + border: none; + border-bottom: 1px solid var(--gray-200, #e5e7eb); + border-radius: 0; + cursor: pointer; + text-align: left; + transition: all 0.2s ease; + position: relative; +} + +.dropdownItem:last-child { + border-bottom: none; +} + +.dropdownItem:first-child { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +.dropdownItem:last-child { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} + +.dropdownItem:hover { + background-color: var(--blue-50, #eff6ff); +} + +.dropdownItem:focus-visible { + outline: 2px solid var(--blue-500, #0847f7); + outline-offset: -2px; +} + +.itemIcon { + width: 20px; + height: 20px; + flex-shrink: 0; + margin-top: 2px; + opacity: 0.7; +} + +.dropdownItem:hover .itemIcon { + opacity: 1; +} + +.itemContent { + flex: 1; + min-width: 0; +} + +.itemTitle { + font-size: 14px; + font-weight: 500; + color: var(--gray-900, #111827); + margin-bottom: 2px; +} + +.itemDescription { + font-size: 12px; + color: var(--gray-600, #4b5563); + line-height: 1.4; +} + +/* Responsive adjustments */ +@media (max-width: 1200px) { + .trigger { + padding: 10px 12px; + font-size: 14px; + } + + .triggerIcon { + width: 18px; + height: 18px; + } +} diff --git a/src/components/RightSidebar/CopyPageLink/CopyPageLink.tsx b/src/components/RightSidebar/CopyPageLink/CopyPageLink.tsx new file mode 100644 index 00000000000..b699145392c --- /dev/null +++ b/src/components/RightSidebar/CopyPageLink/CopyPageLink.tsx @@ -0,0 +1,339 @@ +/** + * Copy Page Link component for the MoreMenu + * Provides multiple actions for copying page content as markdown + */ + +import { useState, useRef, useEffect } from "react" +import { extractPageContent, copyToClipboard } from "./contentExtractor.js" +import { MarkdownPreviewModal } from "./MarkdownPreviewModal.js" +import type { CopyPageLinkProps, CopyAction } from "./types.js" +import styles from "./CopyPageLink.module.css" + +export function CopyPageLink({ className }: CopyPageLinkProps) { + const [isDropdownOpen, setIsDropdownOpen] = useState(false) + const [isModalOpen, setIsModalOpen] = useState(false) + const [extractedMarkdown, setExtractedMarkdown] = useState("") + const [pageTitle, setPageTitle] = useState("") + const [copiedAction, setCopiedAction] = useState<CopyAction | null>(null) + const dropdownRef = useRef<HTMLDivElement>(null) + const buttonRef = useRef<HTMLButtonElement>(null) + + // Close dropdown when clicking outside + useEffect(() => { + if (!isDropdownOpen) return + + const handleClickOutside = (event: MouseEvent) => { + if ( + dropdownRef.current && + !dropdownRef.current.contains(event.target as Node) && + buttonRef.current && + !buttonRef.current.contains(event.target as Node) + ) { + setIsDropdownOpen(false) + } + } + + document.addEventListener("mousedown", handleClickOutside) + return () => document.removeEventListener("mousedown", handleClickOutside) + }, [isDropdownOpen]) + + // Close dropdown on ESC + useEffect(() => { + if (!isDropdownOpen) return + + const handleEscape = (event: KeyboardEvent) => { + if (event.key === "Escape") { + setIsDropdownOpen(false) + buttonRef.current?.focus() + } + } + + document.addEventListener("keydown", handleEscape) + return () => document.removeEventListener("keydown", handleEscape) + }, [isDropdownOpen]) + + const toggleDropdown = () => { + setIsDropdownOpen(!isDropdownOpen) + } + + const handleAction = async (action: CopyAction) => { + setIsDropdownOpen(false) + + try { + // Try to fetch from API first (high quality markdown) + let markdown: string + let title: string + + try { + const currentPath = window.location.pathname + // Get current language from localStorage (same as left sidebar) + const storedLang = localStorage.getItem("docs-language-preference") + const currentLang = storedLang ? storedLang.replace(/"/g, "") : "go" + const response = await fetch(`/api/page-markdown?path=${encodeURIComponent(currentPath)}&lang=${currentLang}`) + + if (response.ok) { + markdown = await response.text() + // Extract title from markdown (first line after frontmatter) + const titleMatch = markdown.match(/^# (.+)$/m) + title = titleMatch ? titleMatch[1] : document.title + } else { + throw new Error("API fetch failed") + } + } catch (apiError) { + // Fallback to client-side extraction + console.warn("API fetch failed, falling back to client-side extraction:", apiError) + const content = extractPageContent() + + if (!content) { + alert("Failed to extract page content. Please try again.") + return + } + + markdown = content.markdown + title = content.title + } + + setExtractedMarkdown(markdown) + setPageTitle(title) + + switch (action) { + case "copy": + await copyToClipboard(markdown) + showCopyFeedback("copy") + break + + case "preview": + setIsModalOpen(true) + break + + case "chatgpt": { + // Copy markdown to clipboard first + await copyToClipboard(markdown) + + // Create instruction prompt for ChatGPT + const pageUrl = window.location.href + const instructionPrompt = `I'm analyzing a Chainlink documentation page: ${pageUrl} + +I have the full page content on my clipboard as plain text (Markdown). +The Chainlink docs site already copied it for me. + +Please ask me to paste it now. After I paste, please: +- Explain the contents clearly +- Answer any questions I have about Chainlink +- Help me understand how to implement the features described` + + const chatgptUrl = `https://chatgpt.com/?prompt=${encodeURIComponent(instructionPrompt)}` + + window.open(chatgptUrl, "_blank", "noopener,noreferrer") + break + } + + case "claude": { + // Copy markdown to clipboard first + await copyToClipboard(markdown) + + // Create instruction prompt for Claude + const pageUrl = window.location.href + const instructionPrompt = `I'm analyzing a Chainlink documentation page: ${pageUrl} + +I have the full page content on my clipboard as plain text (Markdown). +The Chainlink docs site already copied it for me. + +Please ask me to paste it now. After I paste, please: +- Explain the contents clearly +- Answer any questions I have about Chainlink +- Help me understand how to implement the features described` + + const claudeUrl = `https://claude.ai/new?q=${encodeURIComponent(instructionPrompt)}` + + window.open(claudeUrl, "_blank", "noopener,noreferrer") + break + } + } + } catch (error) { + console.error(`Error handling action ${action}:`, error) + alert(`Failed to ${action} page content. Please try again.`) + } + } + + const showCopyFeedback = (action: CopyAction) => { + setCopiedAction(action) + setTimeout(() => setCopiedAction(null), 2000) + } + + const closeModal = () => { + setIsModalOpen(false) + } + + return ( + <> + <div className={`${styles.container} ${className || ""}`}> + <label className={styles.label} htmlFor="copy-page-trigger"> + Copy Page + </label> + <button + id="copy-page-trigger" + ref={buttonRef} + className={styles.trigger} + onClick={toggleDropdown} + aria-expanded={isDropdownOpen} + aria-haspopup="true" + aria-label="Copy page content options" + type="button" + > + <svg + className={styles.triggerIcon} + width="20" + height="20" + viewBox="0 0 24 24" + fill="none" + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + > + <path + d="M8 5H6C5.46957 5 4.96086 5.21071 4.58579 5.58579C4.21071 5.96086 4 6.46957 4 7V19C4 19.5304 4.21071 20.0391 4.58579 20.4142C4.96086 20.7893 5.46957 21 6 21H18C18.5304 21 19.0391 20.7893 19.4142 20.4142C19.7893 20.0391 20 19.5304 20 19V7C20 6.46957 19.7893 5.96086 19.4142 5.58579C19.0391 5.21071 18.5304 5 18 5H16M8 5C8 5.53043 8.21071 6.03914 8.58579 6.41421C8.96086 6.78929 9.46957 7 10 7H14C14.5304 7 15.0391 6.78929 15.4142 6.41421C15.7893 6.03914 16 5.53043 16 5M8 5C8 4.46957 8.21071 3.96086 8.58579 3.58579C8.96086 3.21071 9.46957 3 10 3H14C14.5304 3 15.0391 3.21071 15.4142 3.58579C15.7893 3.96086 16 4.46957 16 5M12 12H15M12 16H15M9 12H9.01M9 16H9.01" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + /> + </svg> + <span className={styles.triggerText}>{copiedAction === "copy" ? "Copied!" : "Copy page"}</span> + <svg className={styles.arrow} width="12" height="12" viewBox="0 0 12 12" fill="none"> + <path + d="M2.5 4.5L6 8L9.5 4.5" + stroke="currentColor" + strokeWidth="1.5" + strokeLinecap="round" + strokeLinejoin="round" + /> + </svg> + </button> + + {isDropdownOpen && ( + <div ref={dropdownRef} className={styles.dropdown} role="menu"> + <div className={styles.dropdownContent}> + <button + className={styles.dropdownItem} + onClick={() => handleAction("copy")} + role="menuitem" + type="button" + > + <svg + className={styles.itemIcon} + width="20" + height="20" + viewBox="0 0 24 24" + fill="none" + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + > + <path + d="M9 5H7C6.46957 5 5.96086 5.21071 5.58579 5.58579C5.21071 5.96086 5 6.46957 5 7V19C5 19.5304 5.21071 20.0391 5.58579 20.4142C5.96086 20.7893 6.46957 21 7 21H17C17.5304 21 18.0391 20.7893 18.4142 20.4142C18.7893 20.0391 19 19.5304 19 19V7C19 6.46957 18.7893 5.96086 18.4142 5.58579C18.0391 5.21071 17.5304 5 17 5H15M9 5C9 5.53043 9.21071 6.03914 9.58579 6.41421C9.96086 6.78929 10.4696 7 11 7H13C13.5304 7 14.0391 6.78929 14.4142 6.41421C14.7893 6.03914 15 5.53043 15 5M9 5C9 4.46957 9.21071 3.96086 9.58579 3.58579C9.96086 3.21071 10.4696 3 11 3H13C13.5304 3 14.0391 3.21071 14.4142 3.58579C14.7893 3.96086 15 4.46957 15 5M12 12H15M12 16H15M9 12H9.01M9 16H9.01" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + /> + </svg> + <div className={styles.itemContent}> + <div className={styles.itemTitle}>Copy page</div> + <div className={styles.itemDescription}>Copy the page as MarkDown</div> + </div> + </button> + + <button + className={styles.dropdownItem} + onClick={() => handleAction("preview")} + role="menuitem" + type="button" + > + <svg + className={styles.itemIcon} + width="20" + height="20" + viewBox="0 0 24 24" + fill="none" + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + > + <path + d="M15 12C15 13.6569 13.6569 15 12 15C10.3431 15 9 13.6569 9 12C9 10.3431 10.3431 9 12 9C13.6569 9 15 10.3431 15 12Z" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + /> + <path + d="M2.45801 12C3.73201 7.943 7.52301 5 12.001 5C16.479 5 20.268 7.943 21.542 12C20.268 16.057 16.479 19 12.001 19C7.52301 19 3.73201 16.057 2.45801 12Z" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + /> + </svg> + <div className={styles.itemContent}> + <div className={styles.itemTitle}>View as MarkDown</div> + <div className={styles.itemDescription}>View this page as plain text</div> + </div> + </button> + + <button + className={styles.dropdownItem} + onClick={() => handleAction("chatgpt")} + role="menuitem" + type="button" + > + <svg + className={styles.itemIcon} + width="20" + height="20" + fill="currentColor" + xmlns="http://www.w3.org/2000/svg" + strokeWidth="1.5" + viewBox="-0.17090198558635983 0.482230148717937 41.14235318283891 40.0339509076386" + aria-hidden="true" + > + <path + d="M37.532 16.87a9.963 9.963 0 0 0-.856-8.184 10.078 10.078 0 0 0-10.855-4.835A9.964 9.964 0 0 0 18.306.5a10.079 10.079 0 0 0-9.614 6.977 9.967 9.967 0 0 0-6.664 4.834 10.08 10.08 0 0 0 1.24 11.817 9.965 9.965 0 0 0 .856 8.185 10.079 10.079 0 0 0 10.855 4.835 9.965 9.965 0 0 0 7.516 3.35 10.078 10.078 0 0 0 9.617-6.981 9.967 9.967 0 0 0 6.663-4.834 10.079 10.079 0 0 0-1.243-11.813zM22.498 37.886a7.474 7.474 0 0 1-4.799-1.735c.061-.033.168-.091.237-.134l7.964-4.6a1.294 1.294 0 0 0 .655-1.134V19.054l3.366 1.944a.12.12 0 0 1 .066.092v9.299a7.505 7.505 0 0 1-7.49 7.496zM6.392 31.006a7.471 7.471 0 0 1-.894-5.023c.06.036.162.099.237.141l7.964 4.6a1.297 1.297 0 0 0 1.308 0l9.724-5.614v3.888a.12.12 0 0 1-.048.103l-8.051 4.649a7.504 7.504 0 0 1-10.24-2.744zM4.297 13.62A7.469 7.469 0 0 1 8.2 10.333c0 .068-.004.19-.004.274v9.201a1.294 1.294 0 0 0 .654 1.132l9.723 5.614-3.366 1.944a.12.12 0 0 1-.114.01L7.04 23.856a7.504 7.504 0 0 1-2.743-10.237zm27.658 6.437l-9.724-5.615 3.367-1.943a.121.121 0 0 1 .113-.01l8.052 4.648a7.498 7.498 0 0 1-1.158 13.528v-9.476a1.293 1.293 0 0 0-.65-1.132zm3.35-5.043c-.059-.037-.162-.099-.236-.141l-7.965-4.6a1.298 1.298 0 0 0-1.308 0l-9.723 5.614v-3.888a.12.12 0 0 1 .048-.103l8.05-4.645a7.497 7.497 0 0 1 11.135 7.763zm-21.063 6.929l-3.367-1.944a.12.12 0 0 1-.065-.092v-9.299a7.497 7.497 0 0 1 12.293-5.756 6.94 6.94 0 0 0-.236.134l-7.965 4.6a1.294 1.294 0 0 0-.654 1.132l-.006 11.225zm1.829-3.943l4.33-2.501 4.332 2.5v5l-4.331 2.5-4.331-2.5V18z" + fill="currentColor" + /> + </svg> + <div className={styles.itemContent}> + <div className={styles.itemTitle}>Open in ChatGPT</div> + <div className={styles.itemDescription}>Ask questions about this page</div> + </div> + </button> + + <button + className={styles.dropdownItem} + onClick={() => handleAction("claude")} + role="menuitem" + type="button" + > + <svg + className={styles.itemIcon} + width="20" + height="20" + fill="currentColor" + fillRule="evenodd" + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24 24" + aria-hidden="true" + > + <path d="M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z" /> + </svg> + <div className={styles.itemContent}> + <div className={styles.itemTitle}>Open in Claude</div> + <div className={styles.itemDescription}>Ask questions about this page</div> + </div> + </button> + </div> + </div> + )} + </div> + + <MarkdownPreviewModal markdown={extractedMarkdown} isOpen={isModalOpen} onClose={closeModal} title={pageTitle} /> + </> + ) +} diff --git a/src/components/RightSidebar/CopyPageLink/MarkdownPreviewModal.module.css b/src/components/RightSidebar/CopyPageLink/MarkdownPreviewModal.module.css new file mode 100644 index 00000000000..14f42931a77 --- /dev/null +++ b/src/components/RightSidebar/CopyPageLink/MarkdownPreviewModal.module.css @@ -0,0 +1,259 @@ +/** + * Styles for MarkdownPreviewModal component + */ + +.backdrop { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 10000; + padding: var(--space-4x); + animation: fadeIn 0.2s ease-out; +} + +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.modal { + background: var(--color-background-primary, #ffffff); + border-radius: var(--border-radius-primary, 8px); + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2); + display: flex; + flex-direction: column; + max-width: 800px; + width: 100%; + max-height: 90vh; + animation: slideIn 0.3s ease-out; + outline: none; +} + +@keyframes slideIn { + from { + transform: translateY(-20px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +/* Mobile: full screen */ +@media (max-width: 768px) { + .backdrop { + padding: 0; + } + + .modal { + max-width: 100%; + max-height: 100vh; + border-radius: 0; + height: 100%; + } +} + +.header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--space-4x) var(--space-5x); + border-bottom: 1px solid var(--theme-divider, var(--gray-200)); +} + +.title { + margin: 0; + font-size: 18px; + font-weight: 600; + color: var(--color-text-heading, var(--gray-900)); +} + +.closeButton { + background: none; + border: none; + font-size: 24px; + color: var(--gray-600); + cursor: pointer; + padding: var(--space-1x); + line-height: 1; + transition: color 0.2s ease; + border-radius: var(--border-radius-primary, 4px); + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; +} + +.closeButton:hover { + color: var(--gray-900); + background-color: var(--theme-bg-hover, var(--gray-100)); +} + +.closeButton:focus-visible { + outline: 2px solid var(--blue-600); + outline-offset: 2px; +} + +.content { + flex: 1; + overflow: auto; + padding: var(--space-4x) var(--space-5x); +} + +.markdown { + margin: 0; + padding: var(--space-4x); + background-color: var(--gray-50); + border-radius: var(--border-radius-primary, 4px); + overflow: auto; + font-size: 13px; + line-height: 1.6; + font-family: "Courier New", Courier, monospace; + white-space: pre-wrap; + word-break: break-word; + border: 1px solid var(--gray-200); + color: var(--gray-900); +} + +.markdown code { + font-family: inherit; + background: none; + padding: 0; +} + +.footer { + display: flex; + gap: var(--space-3x); + padding: var(--space-4x) var(--space-5x); + border-top: 1px solid var(--theme-divider, var(--gray-200)); + justify-content: flex-end; +} + +.copyButton, +.cancelButton { + display: flex; + align-items: center; + justify-content: center; + gap: var(--space-2x); + padding: var(--space-2x) var(--space-4x); + border-radius: var(--border-radius-primary, 4px); + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + border: none; + min-width: 80px; +} + +.copyButton { + background-color: var(--blue-600); + color: white; +} + +.copyButton:hover { + background-color: var(--blue-700); +} + +.copyButton:active { + background-color: var(--blue-800); +} + +.copyButton:focus-visible { + outline: 2px solid var(--blue-600); + outline-offset: 2px; +} + +.cancelButton { + background-color: transparent; + color: var(--gray-700); + border: 1px solid var(--gray-300); +} + +.cancelButton:hover { + background-color: var(--gray-100); + border-color: var(--gray-400); +} + +.cancelButton:focus-visible { + outline: 2px solid var(--blue-600); + outline-offset: 2px; +} + +/* Mobile adjustments */ +@media (max-width: 768px) { + .header, + .content, + .footer { + padding: var(--space-3x) var(--space-4x); + } + + .footer { + flex-direction: column-reverse; + } + + .copyButton, + .cancelButton { + width: 100%; + } +} + +/* Screen reader only utility */ +.srOnly { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +/* Dark theme support */ +@media (prefers-color-scheme: dark) { + .modal { + background: var(--color-background-primary, #1a1a1a); + } + + .title { + color: var(--color-text-heading, #ffffff); + } + + .markdown { + background-color: var(--gray-900); + color: var(--gray-100); + border-color: var(--gray-700); + } + + .closeButton { + color: var(--gray-400); + } + + .closeButton:hover { + color: var(--gray-100); + background-color: var(--gray-800); + } + + .cancelButton { + color: var(--gray-300); + border-color: var(--gray-600); + } + + .cancelButton:hover { + background-color: var(--gray-800); + border-color: var(--gray-500); + } +} diff --git a/src/components/RightSidebar/CopyPageLink/MarkdownPreviewModal.tsx b/src/components/RightSidebar/CopyPageLink/MarkdownPreviewModal.tsx new file mode 100644 index 00000000000..c4a84face22 --- /dev/null +++ b/src/components/RightSidebar/CopyPageLink/MarkdownPreviewModal.tsx @@ -0,0 +1,130 @@ +/** + * Modal component for previewing markdown content + */ + +import { useEffect, useRef, useState } from "react" +import { createPortal } from "react-dom" +import { FocusTrap } from "focus-trap-react" +import { useKeyPress } from "~/hooks/useKeyPress.ts" +import { copyToClipboard } from "./contentExtractor.js" +import type { MarkdownPreviewModalProps } from "./types.js" +import styles from "./MarkdownPreviewModal.module.css" + +export function MarkdownPreviewModal({ markdown, isOpen, onClose, title }: MarkdownPreviewModalProps) { + const modalRef = useRef<HTMLDivElement>(null) + const previousActiveElement = useRef<HTMLElement | null>(null) + const [isCopied, setIsCopied] = useState(false) + + // Use the shared useKeyPress hook for ESC key handling + useKeyPress("Escape", { onDown: onClose }) + + useEffect(() => { + if (!isOpen) return + + // Store the previously focused element + previousActiveElement.current = document.activeElement as HTMLElement + + // Focus the modal + modalRef.current?.focus() + + // Prevent body scroll when modal is open + document.body.style.overflow = "hidden" + + return () => { + document.body.style.overflow = "" + + // Restore focus to the previous element + previousActiveElement.current?.focus() + } + }, [isOpen]) + + const handleCopyClick = async () => { + try { + await copyToClipboard(markdown) + setIsCopied(true) + setTimeout(() => setIsCopied(false), 2000) + } catch (error) { + console.error("Failed to copy markdown:", error) + alert("Failed to copy to clipboard. Please try again.") + } + } + + const handleBackdropClick = (e: React.MouseEvent<HTMLDivElement>) => { + if (e.target === e.currentTarget) { + onClose() + } + } + + if (!isOpen) return null + if (typeof document === "undefined") return null // SSR safety + + return createPortal( + <FocusTrap> + <div className={styles.backdrop} onClick={handleBackdropClick}> + <div + ref={modalRef} + className={styles.modal} + role="dialog" + aria-modal="true" + aria-labelledby="modal-title" + aria-describedby="modal-description" + tabIndex={-1} + > + <div className={styles.header}> + <h2 id="modal-title" className={styles.title}> + {title || "Markdown Preview"} + </h2> + <button className={styles.closeButton} onClick={onClose} aria-label="Close modal" type="button"> + ✕ + </button> + </div> + + <div className={styles.content}> + <div id="modal-description" className={styles.srOnly}> + Preview of extracted markdown content. You can copy this content or close the preview. + </div> + <pre className={styles.markdown} data-no-copy-button="true"> + <code>{markdown}</code> + </pre> + </div> + + <div className={styles.footer}> + <button className={styles.copyButton} onClick={handleCopyClick} type="button"> + {isCopied ? ( + <> + <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path + d="M13.5 4.5L6 12L2.5 8.5" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + /> + </svg> + Copied! + </> + ) : ( + <> + <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path + d="M9 5H7C6.46957 5 5.96086 5.21071 5.58579 5.58579C5.21071 5.96086 5 6.46957 5 7V19C5 19.5304 5.21071 20.0391 5.58579 20.4142C5.96086 20.7893 6.46957 21 7 21H17C17.5304 21 18.0391 20.7893 18.4142 20.4142C18.7893 20.0391 19 19.5304 19 19V7C19 6.46957 18.7893 5.96086 18.4142 5.58579C18.0391 5.21071 17.5304 5 17 5H15M9 5C9 5.53043 9.21071 6.03914 9.58579 6.41421C9.96086 6.78929 10.4696 7 11 7H13C13.5304 7 14.0391 6.78929 14.4142 6.41421C14.7893 6.03914 15 5.53043 15 5M9 5C9 4.46957 9.21071 3.96086 9.58579 3.58579C9.96086 3.21071 10.4696 3 11 3H13C13.5304 3 14.0391 3.21071 14.4142 3.58579C14.7893 3.96086 15 4.46957 15 5M12 12H15M12 16H15M9 12H9.01M9 16H9.01" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + /> + </svg> + Copy + </> + )} + </button> + <button className={styles.cancelButton} onClick={onClose} type="button"> + Close + </button> + </div> + </div> + </div> + </FocusTrap>, + document.body + ) +} diff --git a/src/components/RightSidebar/CopyPageLink/contentExtractor.ts b/src/components/RightSidebar/CopyPageLink/contentExtractor.ts new file mode 100644 index 00000000000..7a99770e7de --- /dev/null +++ b/src/components/RightSidebar/CopyPageLink/contentExtractor.ts @@ -0,0 +1,404 @@ +/** + * Content extraction utility for converting documentation pages to Markdown + */ + +import type { ExtractedContent, ExtractionConfig } from "./types.js" +import { + formatHeading, + formatLink, + formatBold, + formatItalic, + formatInlineCode, + formatCodeBlock, + formatBlockquote, + formatTable, + formatImage, + formatHorizontalRule, + formatFrontmatter, + cleanText, + resolveUrl, + stripHighlightComments, +} from "~/lib/markdown/index.js" + +/** + * Default configuration for content extraction + */ +const DEFAULT_CONFIG: ExtractionConfig = { + selectorsToRemove: [ + // Navigation and UI elements + "nav", + ".breadcrumb", + ".pagination", + + // Interactive elements + "button", + ".copy-iconbutton", + ".copy-code-button", + + // Sidebar and TOC + ".sidebar", + ".table-of-contents", + ".right-sidebar", + ".left-sidebar", + + // Footer and metadata + "footer", + ".theme-edit-this-page", + ".theme-last-updated", + ".edit-page", + + // Feedback and social + ".feedback", + ".social-links", + ".share-buttons", + + // Ads and external content + ".advertisement", + "iframe", + + // Chainlink-specific elements + ".header-link", + ".anchor-link", + + // Astro-specific elements (hydration scripts, etc.) + "script", + "style", + "astro-island", + ], + contentSelector: "article, main, .content, [role='main']", + includeFrontmatter: true, +} + +/** + * Extracts the main content from the current page + * @param config - Extraction configuration + * @returns The extracted content or null if extraction fails + */ +export function extractPageContent(config: Partial<ExtractionConfig> = {}): ExtractedContent | null { + const fullConfig = { ...DEFAULT_CONFIG, ...config } + + try { + // Find the main content element + const mainContent = document.querySelector(fullConfig.contentSelector) + if (!mainContent) { + console.error("Could not find main content element") + return null + } + + // Clone the content to avoid modifying the page + const contentClone = mainContent.cloneNode(true) as HTMLElement + + // Remove unwanted elements + fullConfig.selectorsToRemove.forEach((selector) => { + const elements = contentClone.querySelectorAll(selector) + elements.forEach((el) => el.remove()) + }) + + // Get page title + const title = getPageTitle() + + // Convert to markdown + const markdown = convertToMarkdown(contentClone) + + // Add frontmatter if enabled + const finalMarkdown = fullConfig.includeFrontmatter + ? addFrontmatter({ markdown, title, url: window.location.href }) + : markdown + + return { + markdown: finalMarkdown, + title, + url: window.location.href, + timestamp: new Date(), + } + } catch (error) { + console.error("Error extracting page content:", error) + return null + } +} + +/** + * Gets the page title from various possible sources + * @returns The page title + */ +function getPageTitle(): string { + // Try document title first + if (document.title && document.title !== "Documentation") { + return document.title.replace(" | Chainlink Documentation", "").trim() + } + + // Try h1 heading + const h1 = document.querySelector("article h1, main h1, h1") + if (h1?.textContent) { + return h1.textContent.trim() + } + + // Try meta og:title + const ogTitle = document.querySelector('meta[property="og:title"]') + const ogTitleContent = ogTitle?.getAttribute("content") + if (ogTitleContent) { + return ogTitleContent.trim() + } + + return "Documentation Page" +} + +/** + * Converts HTML element to Markdown + * @param element - The HTML element to convert + * @returns The markdown string + */ +function convertToMarkdown(element: HTMLElement): string { + let markdown = "" + + // Process child nodes + element.childNodes.forEach((node) => { + if (node.nodeType === Node.TEXT_NODE) { + const text = node.textContent?.trim() + if (text) { + markdown += cleanText(text) + "\n" + } + } else if (node.nodeType === Node.ELEMENT_NODE) { + const el = node as HTMLElement + markdown += convertElementToMarkdown(el) + } + }) + + return markdown.trim() +} + +/** + * Converts a single HTML element to Markdown based on its tag + * @param el - The HTML element + * @returns The markdown representation + */ +function convertElementToMarkdown(el: HTMLElement): string { + // Check for CodeHighlightBlockMulti FIRST before processing by tag + if (el.classList.contains("code-block-container")) { + return convertCodeBlockMultiToMarkdown(el) + } + + const tag = el.tagName.toLowerCase() + + switch (tag) { + case "h1": + return formatHeading(1, cleanText(el.textContent || "")) + case "h2": + return formatHeading(2, cleanText(el.textContent || "")) + case "h3": + return formatHeading(3, cleanText(el.textContent || "")) + case "h4": + return formatHeading(4, cleanText(el.textContent || "")) + case "h5": + return formatHeading(5, cleanText(el.textContent || "")) + case "h6": + return formatHeading(6, cleanText(el.textContent || "")) + + case "p": + return `${convertToMarkdown(el)}\n\n` + + case "a": { + const href = el.getAttribute("href") || "" + const text = cleanText(el.textContent || "") + const fullUrl = resolveUrl(href) + return formatLink(text, fullUrl) + } + + case "strong": + case "b": + return formatBold(cleanText(el.textContent || "")) + + case "em": + case "i": + return formatItalic(cleanText(el.textContent || "")) + + case "code": + // Inline code + if (el.parentElement?.tagName !== "PRE") { + return formatInlineCode(el.textContent || "") + } + // Block code - handled by pre tag + return el.textContent || "" + + case "pre": { + const code = el.querySelector("code") + const language = code?.className?.match(/language-(\w+)/)?.[1] || "" + const codeText = code?.textContent || el.textContent || "" + return formatCodeBlock(codeText, language) + } + + case "ul": + case "ol": { + const items = Array.from(el.children) + .filter((child) => child.tagName.toLowerCase() === "li") + .map((li, index) => { + const bullet = tag === "ul" ? "-" : `${index + 1}.` + const content = convertToMarkdown(li as HTMLElement).trim() + return `${bullet} ${content}` + }) + .join("\n") + return `${items}\n\n` + } + + case "li": + return convertToMarkdown(el) + + case "blockquote": + return formatBlockquote(convertToMarkdown(el)) + + case "table": + return convertTableToMarkdown(el) + + case "img": { + const src = el.getAttribute("src") || "" + const alt = el.getAttribute("alt") || "" + const fullSrc = resolveUrl(src) + return formatImage(alt, fullSrc) + } + + case "hr": + return formatHorizontalRule() + + case "br": + return "\n" + + case "div": + case "section": + case "aside": { + // Check for special Chainlink components (callouts, admonitions, etc.) + if (el.classList.contains("callout") || el.classList.contains("admonition")) { + return convertCalloutToMarkdown(el) + } + return convertToMarkdown(el) + } + + default: + // For unknown tags, process children + return convertToMarkdown(el) + } +} + +/** + * Converts a table element to Markdown + * @param table - The table element + * @returns The markdown table + */ +function convertTableToMarkdown(table: HTMLElement): string { + const rows: string[][] = [] + + // Get all rows + const tableRows = table.querySelectorAll("tr") + tableRows.forEach((row) => { + const cells: string[] = [] + row.querySelectorAll("td, th").forEach((cell) => { + cells.push(cleanText(cell.textContent || "")) + }) + if (cells.length > 0) { + rows.push(cells) + } + }) + + if (rows.length === 0) return "" + + return formatTable(rows) +} + +/** + * Converts CodeHighlightBlockMulti component to Markdown + * @param container - The code block container element (cloned) + * @returns The markdown code block + */ +function convertCodeBlockMultiToMarkdown(container: HTMLElement): string { + // Get the current language from the container + const currentLang = container.getAttribute("data-lang") || "" + const blockId = container.getAttribute("id") || "" + + // The container is a CLONE, so it doesn't have the JavaScript properties. + // We need to find the ORIGINAL element in the page to get _languagesData + interface LanguageData { + code: string + title?: string + } + + let languagesData: Record<string, LanguageData> | undefined + + if (blockId) { + const originalContainer = document.getElementById(blockId) as HTMLElement & { + _languagesData?: Record<string, LanguageData> + } + if (originalContainer) { + languagesData = originalContainer._languagesData + } + } + + // If we found the original data, use it + if (languagesData && languagesData[currentLang]) { + const codeContent = languagesData[currentLang].code || "" + // Strip highlight comments using the shared formatter + const cleanCode = stripHighlightComments(codeContent) + return formatCodeBlock(cleanCode, currentLang) + } + + // Fallback: Extract code from the visible DOM table in the clone + const codeLines: string[] = [] + const lineElements = container.querySelectorAll(".line") + lineElements.forEach((lineElement) => { + const lineText = lineElement.textContent || "" + codeLines.push(lineText) + }) + + const codeContent = codeLines.join("\n") + return formatCodeBlock(codeContent, currentLang) +} + +/** + * Converts callout/admonition elements to Markdown + * @param el - The callout element + * @returns The markdown representation + */ +function convertCalloutToMarkdown(el: HTMLElement): string { + const type = el.getAttribute("data-type") || "note" + const content = convertToMarkdown(el).trim() + return `> **${type.toUpperCase()}**\n> ${content.replace(/\n/g, "\n> ")}\n\n` +} + +/** + * Adds frontmatter to the markdown content + * @param content - The content object + * @returns The markdown with frontmatter + */ +function addFrontmatter(content: { markdown: string; title: string; url: string }): string { + const frontmatter = formatFrontmatter({ + title: content.title, + url: content.url, + extracted: new Date().toISOString(), + }) + + return frontmatter + content.markdown +} + +/** + * Copies text to clipboard using the modern Clipboard API + * @param text - The text to copy + * @returns Promise that resolves when copy is complete + */ +export async function copyToClipboard(text: string): Promise<void> { + try { + if (navigator.clipboard && navigator.clipboard.writeText) { + await navigator.clipboard.writeText(text) + } else { + // Fallback for older browsers + const textArea = document.createElement("textarea") + textArea.value = text + textArea.style.position = "fixed" + textArea.style.left = "-999999px" + document.body.appendChild(textArea) + textArea.select() + document.execCommand("copy") + document.body.removeChild(textArea) + } + } catch (error) { + console.error("Failed to copy to clipboard:", error) + throw new Error("Failed to copy to clipboard") + } +} diff --git a/src/components/RightSidebar/CopyPageLink/index.ts b/src/components/RightSidebar/CopyPageLink/index.ts new file mode 100644 index 00000000000..22a777ffc0d --- /dev/null +++ b/src/components/RightSidebar/CopyPageLink/index.ts @@ -0,0 +1,8 @@ +/** + * Barrel export for CopyPageLink module + */ + +export { CopyPageLink } from "./CopyPageLink.js" +export { MarkdownPreviewModal } from "./MarkdownPreviewModal.js" +export * from "./types.js" +export * from "./contentExtractor.js" diff --git a/src/components/RightSidebar/CopyPageLink/types.ts b/src/components/RightSidebar/CopyPageLink/types.ts new file mode 100644 index 00000000000..86df43198db --- /dev/null +++ b/src/components/RightSidebar/CopyPageLink/types.ts @@ -0,0 +1,66 @@ +/** + * Type definitions for CopyPageLink component + */ + +/** + * Available actions for the copy page feature + */ +export type CopyAction = "copy" | "preview" | "chatgpt" | "claude" + +/** + * Extracted content from the documentation page + */ +export interface ExtractedContent { + /** The markdown content of the page */ + markdown: string + /** The title of the page */ + title: string + /** The full URL of the page */ + url: string + /** Timestamp when content was extracted */ + timestamp: Date +} + +/** + * Props for the CopyPageLink component + */ +export interface CopyPageLinkProps { + /** Optional class name for styling */ + className?: string +} + +/** + * Props for the MarkdownPreviewModal component + */ +export interface MarkdownPreviewModalProps { + /** The markdown content to display */ + markdown: string + /** Whether the modal is open */ + isOpen: boolean + /** Callback to close the modal */ + onClose: () => void + /** Page title for modal header */ + title?: string +} + +/** + * Configuration for content extraction + */ +export interface ExtractionConfig { + /** Selectors for elements to remove from content */ + selectorsToRemove: string[] + /** Main content selector */ + contentSelector: string + /** Whether to include frontmatter */ + includeFrontmatter: boolean +} + +/** + * Result of a copy operation + */ +export interface CopyResult { + /** Whether the operation was successful */ + success: boolean + /** Error message if operation failed */ + error?: string +} diff --git a/src/components/RightSidebar/LlmsLink.tsx b/src/components/RightSidebar/LlmsLink.tsx index 31b6f55b406..42bc23ac2bc 100644 --- a/src/components/RightSidebar/LlmsLink.tsx +++ b/src/components/RightSidebar/LlmsLink.tsx @@ -8,6 +8,20 @@ interface LlmsLinkProps { currentPageLanguage?: string | null } +// Map section slugs to display names +const SECTION_DISPLAY_NAMES: Record<string, string> = { + vrf: "VRF", + ccip: "CCIP", + "data-feeds": "Data Feeds", + "data-streams": "Data Streams", + "dta-technical-standard": "DTA", + automation: "Automation", + "chainlink-functions": "Functions", + quickstarts: "Quickstarts", + resources: "Resources", + // Add more as needed +} + export function LlmsLink({ section, supportedLanguages, currentPageLanguage }: LlmsLinkProps) { // Subscribe to the language store for reactive updates const storeLanguage = useStore(selectedLanguage) @@ -18,17 +32,27 @@ export function LlmsLink({ section, supportedLanguages, currentPageLanguage }: L // Generate the appropriate link const hasLanguages = supportedLanguages.length > 0 let llmsHref = "" - let llmsLabel = "View as plain text for LLMs" + let llmsLabel = "Complete docs (TXT)" if (hasLanguages) { // Language-specific section (like CRE) const langToUse = effectiveLanguage && supportedLanguages.includes(effectiveLanguage) ? effectiveLanguage : supportedLanguages[0] llmsHref = `/${section}/llms-full-${langToUse}.txt` - llmsLabel = `View ${langToUse.toUpperCase()} docs for LLMs` + + // For CRE: just show language, no product name + if (section === "cre") { + llmsLabel = `Complete ${langToUse.toUpperCase()} docs (TXT)` + } else { + // For other language-specific sections (if any in future) + const productName = SECTION_DISPLAY_NAMES[section] || section.toUpperCase() + llmsLabel = `Complete ${productName} ${langToUse.toUpperCase()} docs (TXT)` + } } else { - // Single file section + // Single file section - include product name llmsHref = `/${section}/llms-full.txt` + const productName = SECTION_DISPLAY_NAMES[section] || section.toUpperCase() + llmsLabel = `Complete ${productName} docs (TXT)` } return ( diff --git a/src/components/RightSidebar/MoreMenu.astro b/src/components/RightSidebar/MoreMenu.astro index b7c61cbf93e..75e14d7fc79 100644 --- a/src/components/RightSidebar/MoreMenu.astro +++ b/src/components/RightSidebar/MoreMenu.astro @@ -6,7 +6,6 @@ import { LlmsLink } from "./LlmsLink" const { editHref, frontmatter } = Astro.props const pathname = Astro.url.pathname const section = pathname.split("/").filter(Boolean)[0] - // Determine language from frontmatter or filename const sdkLang = frontmatter?.sdkLang const filename = pathname.split("/").pop() || "" diff --git a/src/components/RightSidebar/RightSidebar.astro b/src/components/RightSidebar/RightSidebar.astro index 4f4517a0148..3d8f0918ba1 100644 --- a/src/components/RightSidebar/RightSidebar.astro +++ b/src/components/RightSidebar/RightSidebar.astro @@ -3,25 +3,20 @@ import MoreMenu from "./MoreMenu.astro" import { Feedback } from "../PageContent/Feedback" import { MarkdownHeading } from "astro" import TableOfContents from "~/components/TableOfContents/TableOfContents" -import { LanguageSwitcherDropdown } from "~/components/LanguageSwitcherDropdown" +import { CopyPageLink } from "./CopyPageLink" export type Props = { githubEditUrl: string headings: MarkdownHeading[] - showLanguageSwitcher?: boolean frontmatter?: Record<string, any> } -const { githubEditUrl, showLanguageSwitcher, headings, frontmatter } = Astro.props +const { githubEditUrl, headings, frontmatter } = Astro.props --- <section class="sidebar-nav" aria-labelledby="grid-right" data-sticky> - { - showLanguageSwitcher && ( - <div class="language-switcher-wrapper"> - <LanguageSwitcherDropdown client:only="react" /> - </div> - ) - } + <div class="copy-page-wrapper"> + <CopyPageLink client:only="react" /> + </div> <h2 class="heading">On this page</h2> <div class="toc-wrapper"> <TableOfContents client:media="(min-width: 50em)" initialHeadings={headings} /> @@ -60,7 +55,7 @@ const { githubEditUrl, showLanguageSwitcher, headings, frontmatter } = Astro.pro margin-top: var(--space-3x); } - .language-switcher-wrapper { + .copy-page-wrapper { margin-bottom: var(--space-6x); } diff --git a/src/components/LanguageSwitcherDropdown.module.css b/src/components/SidebarDropdown/SidebarDropdown.module.css similarity index 90% rename from src/components/LanguageSwitcherDropdown.module.css rename to src/components/SidebarDropdown/SidebarDropdown.module.css index 1df7c41ca4d..7d6e192d3f1 100644 --- a/src/components/LanguageSwitcherDropdown.module.css +++ b/src/components/SidebarDropdown/SidebarDropdown.module.css @@ -1,3 +1,14 @@ +.selector { + display: flex; + align-items: center; + padding: var(--space-3x) var(--space-3x); + border-bottom: 1px solid var(--border-color, #e5e7eb); + background: var(--color-background-primary, #ffffff); + position: sticky; + top: 0; + z-index: 10; +} + .dropdown { position: relative; width: 100%; diff --git a/src/components/SidebarDropdown/SidebarDropdown.tsx b/src/components/SidebarDropdown/SidebarDropdown.tsx new file mode 100644 index 00000000000..753bf0c58cb --- /dev/null +++ b/src/components/SidebarDropdown/SidebarDropdown.tsx @@ -0,0 +1,141 @@ +/** @jsxImportSource react */ +import { useState, useRef, useEffect } from "react" +import styles from "./SidebarDropdown.module.css" + +export interface DropdownItem { + id: string + label: string + icon: string + description?: string +} + +interface SidebarDropdownProps { + label: string + items: DropdownItem[] + selectedId: string + onSelect: (id: string) => void + triggerId: string + ariaLabel: string +} + +/** + * Generic Sidebar Dropdown Component + * + * A reusable dropdown component for sidebar navigation. + * Handles all UI rendering and interaction logic. + * + * Features: + * - Sticky positioning at top of sidebar + * - Click-outside to close + * - Keyboard accessible (ARIA compliant, Escape key) + * - Mobile responsive + */ +export function SidebarDropdown({ label, items, selectedId, onSelect, triggerId, ariaLabel }: SidebarDropdownProps) { + const [isOpen, setIsOpen] = useState(false) + const dropdownRef = useRef<HTMLDivElement>(null) + + const selectedItem = items.find((item) => item.id === selectedId) + + const handleSelect = (id: string) => { + setIsOpen(false) + onSelect(id) + } + + const handleToggle = () => { + setIsOpen(!isOpen) + } + + // Close dropdown when clicking outside + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + setIsOpen(false) + } + } + + const handleEscape = (event: KeyboardEvent) => { + if (event.key === "Escape") { + setIsOpen(false) + } + } + + if (isOpen) { + document.addEventListener("mousedown", handleClickOutside) + document.addEventListener("keydown", handleEscape) + } + + return () => { + document.removeEventListener("mousedown", handleClickOutside) + document.removeEventListener("keydown", handleEscape) + } + }, [isOpen]) + + if (!selectedItem) { + return null + } + + return ( + <div className={styles.selector} ref={dropdownRef}> + <div className={styles.dropdown}> + <label className={styles.label} htmlFor={triggerId}> + {label} + </label> + <button + id={triggerId} + type="button" + className={styles.trigger} + onClick={handleToggle} + aria-expanded={isOpen} + aria-haspopup="true" + aria-label={ariaLabel} + > + <img src={selectedItem.icon} alt={selectedItem.label} className={styles.triggerIcon} /> + <span className={styles.triggerText}>{selectedItem.label}</span> + <svg className={styles.arrow} width="12" height="12" viewBox="0 0 12 12" fill="none"> + <path + d="M2.5 4.5L6 8L9.5 4.5" + stroke="currentColor" + strokeWidth="1.5" + strokeLinecap="round" + strokeLinejoin="round" + /> + </svg> + </button> + + {isOpen && ( + <div className={styles.menu}> + <div className={styles.menuContent}> + {items.map((item) => { + const isActive = selectedId === item.id + + return ( + <button + key={item.id} + type="button" + className={`${styles.option} ${isActive ? styles.selected : ""}`} + onClick={() => handleSelect(item.id)} + title={item.description} + > + <img src={item.icon} alt={item.label} className={styles.optionIcon} /> + <span>{item.label}</span> + {isActive && ( + <svg className={styles.checkmark} width="16" height="16" viewBox="0 0 16 16" fill="none"> + <path + d="M13.5 4.5L6 12L2.5 8.5" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + /> + </svg> + )} + </button> + ) + })} + </div> + </div> + )} + </div> + </div> + ) +} diff --git a/src/components/SidebarDropdown/index.ts b/src/components/SidebarDropdown/index.ts new file mode 100644 index 00000000000..9e63bfe0e2d --- /dev/null +++ b/src/components/SidebarDropdown/index.ts @@ -0,0 +1,2 @@ +export { SidebarDropdown } from "./SidebarDropdown.js" +export type { DropdownItem } from "./SidebarDropdown.js" diff --git a/src/components/index.ts b/src/components/index.ts index b91fe04a3f6..64617eaf7b6 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -10,6 +10,7 @@ export { default as CodeSample } from "./CodeSample/CodeSample.astro" export { default as Address } from "./Address" export { default as CopyText } from "./CopyText" +export { CopyPageLink } from "./RightSidebar/CopyPageLink" export { default as Aside } from "./Aside.astro" export { default as ReleaseNotes } from "./ReleaseNotes.astro" export { default as Icon } from "./Icon.astro" diff --git a/src/config/data/ccip/utils.ts b/src/config/data/ccip/utils.ts index 5a4783a37b6..cac553a82fe 100644 --- a/src/config/data/ccip/utils.ts +++ b/src/config/data/ccip/utils.ts @@ -2,7 +2,7 @@ import { SupportedChain } from "~/config/types.ts" import { chainToTechnology } from "~/config/chains.ts" import { NetworkFeeStructure, PoolType, TokenMechanism, LaneSpecificFeeKey, RateLimiterConfig } from "./types.ts" import { networkFees } from "./data.ts" -import { commify } from "~/utils/index.js" +import { commify } from "~/utils/number.ts" import { formatUnits } from "ethers" // Define valid pool type combinations and their corresponding mechanisms diff --git a/src/content/ccip/llms-full.txt b/src/content/ccip/llms-full.txt index 5340e42d537..8c07ff7f400 100644 --- a/src/content/ccip/llms-full.txt +++ b/src/content/ccip/llms-full.txt @@ -423,7 +423,7 @@ These limits apply to messages sent from an EVM-compatible chain to the Aptos bl | Message execution gas limit | The user-specified `gasLimit` in `extraArgs` for the execution of the `ccip_receive` function on Aptos. | 100,000 gas | | Maximum number of tokens | The maximum number of distinct tokens that can be transferred in a single transaction. | 1 | | Smart Execution time window | The maximum duration that CCIP will attempt to automatically execute a message on Aptos before manual execution is required. | 8 hours | -| Token pool execution gas limit | The default gas overhead allocated for a standard token transfer operation on Aptos when a message is received from an EVM chain. | 36 gas | +| Token pool execution gas limit | The default gas overhead allocated for a standard token transfer operation on Aptos when a message is received from an EVM chain. | 10,000 gas | | Out of Order execution | The `allowOutOfOrderExecution` parameter in the `extraArgs` of a CCIP message from an EVM chain. | Must be `true` | ## Aptos to EVM @@ -433,10 +433,10 @@ These limits apply to messages sent from the Aptos blockchain to an EVM-compatib | Item | Description | Limit | | :----------------------------- | :------------------------------------------------------------------------------------------------------------------------- | :------------- | | Maximum message data length | The `data` payload sent within the [CCIP message](/ccip/api-reference/aptos/v1.6.0/messages#aptos2anymessage). | 30,000 bytes | -| Message execution gas limit | The user-specified `gasLimit` in `extraArgs` for the execution of the `ccipReceive` function on the destination EVM chain. | 100,000 gas | +| Message execution gas limit | The user-specified `gasLimit` in `extraArgs` for the execution of the `ccipReceive` function on the destination EVM chain. | 3,000,000 gas | | Maximum number of tokens | The maximum number of distinct tokens that can be transferred in a single transaction. | 1 | | Smart Execution time window | The maximum duration for the execution of a CCIP message on the destination EVM chain. | 8 hours | -| Token pool execution gas limit | The default gas overhead for executing token pool logic on the destination EVM chain for a standard token transfer. | 36 gas | +| Token pool execution gas limit | The default gas overhead for executing token pool logic on the destination EVM chain for a standard token transfer. | 90,000 gas | | Out of Order execution | The `allow_out_of_order_execution` parameter in the `extraArgs` of a CCIP message from Aptos. | Must be `true` | --- diff --git a/src/features/utils/index.ts b/src/features/utils/index.ts index 5b9732cd5a8..95faa271bc8 100644 --- a/src/features/utils/index.ts +++ b/src/features/utils/index.ts @@ -10,7 +10,7 @@ import { } from "@config/index.ts" import { CCIP_TOKEN_ICON_MAPPINGS } from "@config/data/ccip/tokenIconMappings.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 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/layouts/DocsLayout.astro b/src/layouts/DocsLayout.astro index 3693d42a46a..29f092bdac0 100644 --- a/src/layouts/DocsLayout.astro +++ b/src/layouts/DocsLayout.astro @@ -96,12 +96,7 @@ const howToSteps = initialHeadings {whatsNext && <WhatsNext content={whatsNext} />} </div> <aside id="grid-right"> - <RightSidebar - {githubEditUrl} - headings={initialHeadings} - showLanguageSwitcher={frontmatter.section === "cre"} - frontmatter={frontmatter} - /> + <RightSidebar {githubEditUrl} headings={initialHeadings} frontmatter={frontmatter} /> </aside> </div> </main> diff --git a/src/lib/api/cacheHeaders.ts b/src/lib/api/cacheHeaders.ts new file mode 100644 index 00000000000..92312d1448a --- /dev/null +++ b/src/lib/api/cacheHeaders.ts @@ -0,0 +1,47 @@ +/** + * Shared cache header configurations for API endpoints + * + * Cache Strategy: + * - 5-minute CDN cache (s-max-age=300) + * - Stale-while-revalidate for graceful degradation + * - CDN-specific headers for Vercel optimization + * - No browser cache (CDN-only caching) + */ + +/** + * Standard cache headers for all API endpoints + * - CDN cache: 5 minutes + * - Serves stale content while revalidating in background + * - Optimized for Vercel CDN + */ +export const standardCacheHeaders = { + "Cache-Control": "s-max-age=300, stale-while-revalidate", + "CDN-Cache-Control": "max-age=300", + "Vercel-CDN-Cache-Control": "max-age=300", +} + +/** + * Cache headers for text/plain responses + * Used by: /api/page-markdown + */ +export const textPlainHeaders = { + "Content-Type": "text/plain; charset=utf-8", + ...standardCacheHeaders, +} + +/** + * Cache headers for application/json responses + * Used by: /api/ccip/v1/* endpoints + */ +export const jsonHeaders = { + "Content-Type": "application/json", + ...standardCacheHeaders, +} + +/** + * Common headers without caching directives + * For endpoints that need custom cache control + */ +export const commonHeaders = { + "Content-Type": "application/json", +} diff --git a/src/pages/api/ccip/faucet/adapters/index.ts b/src/lib/ccip/faucet/adapters/index.ts similarity index 83% rename from src/pages/api/ccip/faucet/adapters/index.ts rename to src/lib/ccip/faucet/adapters/index.ts index 1a27125ced8..ae1962dad49 100644 --- a/src/pages/api/ccip/faucet/adapters/index.ts +++ b/src/lib/ccip/faucet/adapters/index.ts @@ -1,5 +1,5 @@ import { ChainFamily } from "@config/types.ts" -import { FamilyAdapter } from "@api/ccip/types/faucet.ts" +import { FamilyAdapter } from "~/lib/ccip/types/faucet.ts" import { SvmAdapter } from "./svm.ts" export const prerender = false @@ -20,6 +20,6 @@ export class FaucetAdapterFactory { } // Re-export types and adapters -export type { FamilyAdapter } from "@api/ccip/types/faucet.ts" +export type { FamilyAdapter } from "~/lib/ccip/types/faucet.ts" export { SvmAdapter } from "./svm.ts" export { SvmDripAdapter } from "./svm-drip.ts" diff --git a/src/pages/api/ccip/faucet/adapters/svm-drip.ts b/src/lib/ccip/faucet/adapters/svm-drip.ts similarity index 94% rename from src/pages/api/ccip/faucet/adapters/svm-drip.ts rename to src/lib/ccip/faucet/adapters/svm-drip.ts index 4fc62dba32a..190bd4f6c83 100644 --- a/src/pages/api/ccip/faucet/adapters/svm-drip.ts +++ b/src/lib/ccip/faucet/adapters/svm-drip.ts @@ -2,9 +2,9 @@ import { randomUUID } from "node:crypto" import { createSolanaLogger } from "@lib/logging/index.js" import type { Logger } from "@lib/logging/index.js" import { ensureSolAddress } from "@lib/solana/index.js" -import { ChainConfigurationService } from "@api/ccip/services/chain-config.ts" -import { DripOrchestrator, type DripParams, type DripResult } from "@api/ccip/services/faucet/drip-orchestrator.ts" -import type { FaucetChainConfig } from "@api/ccip/types/faucet.ts" +import { ChainConfigurationService } from "~/lib/ccip/services-api/chain-config.ts" +import { DripOrchestrator, type DripParams, type DripResult } from "~/lib/ccip/services-api/faucet/drip-orchestrator.ts" +import type { FaucetChainConfig } from "~/lib/ccip/types/faucet.ts" export const prerender = false diff --git a/src/pages/api/ccip/faucet/adapters/svm.ts b/src/lib/ccip/faucet/adapters/svm.ts similarity index 99% rename from src/pages/api/ccip/faucet/adapters/svm.ts rename to src/lib/ccip/faucet/adapters/svm.ts index cf156985bf9..4b0fecd4848 100644 --- a/src/pages/api/ccip/faucet/adapters/svm.ts +++ b/src/lib/ccip/faucet/adapters/svm.ts @@ -1,4 +1,4 @@ -import { FamilyAdapter, VerifySignatureArgs, FaucetChainConfig } from "@api/ccip/types/faucet.ts" +import { FamilyAdapter, VerifySignatureArgs, FaucetChainConfig } from "~/lib/ccip/types/faucet.ts" import { ensureSolAddress } from "@lib/solana/core/address/validator.ts" import { SolanaSignatureService } from "@lib/solana/domain/services/signature-verification.ts" import { logger } from "@lib/logging/index.js" diff --git a/src/pages/api/ccip/faucet/chain-resolver.ts b/src/lib/ccip/faucet/chain-resolver.ts similarity index 96% rename from src/pages/api/ccip/faucet/chain-resolver.ts rename to src/lib/ccip/faucet/chain-resolver.ts index 88a6f81c189..a8d5d0f7798 100644 --- a/src/pages/api/ccip/faucet/chain-resolver.ts +++ b/src/lib/ccip/faucet/chain-resolver.ts @@ -1,7 +1,7 @@ import { getSelectorEntry } from "@config/data/ccip/selectors.ts" -import { resolveChainOrThrow } from "@api/ccip/utils.ts" +import { resolveChainOrThrow } from "~/lib/ccip/utils.ts" import { getChainTypeAndFamily, getChainId, directoryToSupportedChain } from "@features/utils/index.ts" -import { FaucetChainConfig } from "@api/ccip/types/faucet.ts" +import { FaucetChainConfig } from "~/lib/ccip/types/faucet.ts" import { getFaucetAddress, getSolanaDevnetConfig } from "@lib/core/config/index.ts" import { BNM_MINT_ADDRESSES } from "@lib/solana/core/constants/token-resolver.ts" diff --git a/src/pages/api/ccip/faucet/codec/index.ts b/src/lib/ccip/faucet/codec/index.ts similarity index 100% rename from src/pages/api/ccip/faucet/codec/index.ts rename to src/lib/ccip/faucet/codec/index.ts diff --git a/src/pages/api/ccip/faucet/config.ts b/src/lib/ccip/faucet/config.ts similarity index 100% rename from src/pages/api/ccip/faucet/config.ts rename to src/lib/ccip/faucet/config.ts diff --git a/src/pages/api/ccip/services/chain-config.ts b/src/lib/ccip/services-api/chain-config.ts similarity index 97% rename from src/pages/api/ccip/services/chain-config.ts rename to src/lib/ccip/services-api/chain-config.ts index 0123472a0ce..3c67528964d 100644 --- a/src/pages/api/ccip/services/chain-config.ts +++ b/src/lib/ccip/services-api/chain-config.ts @@ -7,7 +7,7 @@ import { getSolanaDevnetConfig } from "@lib/core/config/index.ts" import { createRpcContext } from "@lib/solana/infrastructure/rpc/solana-rpc.ts" import type { IRpcContext } from "@lib/solana/infrastructure/rpc/types.ts" -import type { FaucetChainConfig } from "@api/ccip/types/faucet.ts" +import type { FaucetChainConfig } from "~/lib/ccip/types/faucet.ts" export const prerender = false diff --git a/src/pages/api/ccip/services/faucet/drip-orchestrator.ts b/src/lib/ccip/services-api/faucet/drip-orchestrator.ts similarity index 99% rename from src/pages/api/ccip/services/faucet/drip-orchestrator.ts rename to src/lib/ccip/services-api/faucet/drip-orchestrator.ts index 95cd2c97af9..6eb6aa3ecb0 100644 --- a/src/pages/api/ccip/services/faucet/drip-orchestrator.ts +++ b/src/lib/ccip/services-api/faucet/drip-orchestrator.ts @@ -16,7 +16,7 @@ import { TransactionManager } from "@lib/solana/domain/transaction/services/mana import { detectTokenProgram, getBackendSigner } from "@lib/solana/core/services/index.ts" import { NetworkComputeBudgetService, TransactionComplexity } from "@lib/solana/core/services/network-compute-budget.ts" import type { IRpcContext } from "@lib/solana/infrastructure/rpc/types.ts" -import type { FaucetChainConfig } from "@api/ccip/types/faucet.ts" +import type { FaucetChainConfig } from "~/lib/ccip/types/faucet.ts" import type { Address } from "@solana/kit" import { directoryToSupportedChain } from "@features/utils/index.ts" diff --git a/src/pages/api/ccip/services/faucet/error-handler.ts b/src/lib/ccip/services-api/faucet/error-handler.ts similarity index 99% rename from src/pages/api/ccip/services/faucet/error-handler.ts rename to src/lib/ccip/services-api/faucet/error-handler.ts index e79b173580f..a34b6e00c1c 100644 --- a/src/pages/api/ccip/services/faucet/error-handler.ts +++ b/src/lib/ccip/services-api/faucet/error-handler.ts @@ -4,7 +4,7 @@ * to appropriate HTTP status codes following RESTful principles */ -import { APIErrorType, createErrorResponse } from "@api/ccip/utils.ts" +import { APIErrorType, createErrorResponse } from "~/lib/ccip/utils.ts" import { FaucetStateService } from "@lib/solana/domain/services/faucet-state.ts" import { address } from "@lib/solana/index.js" import { logger } from "@lib/logging/index.js" diff --git a/src/pages/api/services/chain-data.ts b/src/lib/ccip/services/chain-data.ts similarity index 99% rename from src/pages/api/services/chain-data.ts rename to src/lib/ccip/services/chain-data.ts index 4e0b6a6fd22..c268c3ea39b 100644 --- a/src/pages/api/services/chain-data.ts +++ b/src/lib/ccip/services/chain-data.ts @@ -1,7 +1,7 @@ -import { Environment, ChainDetails, FilterType, ChainConfigError, FeeTokenEnriched } from "../ccip/types/index.ts" +import { Environment, ChainDetails, FilterType, ChainConfigError, FeeTokenEnriched } from "~/lib/ccip/types/index.ts" import { ChainsConfig } from "@config/data/ccip/index.ts" import { getSelectorEntry } from "@config/data/ccip/selectors.ts" -import { resolveChainOrThrow } from "@api/ccip/utils.ts" +import { resolveChainOrThrow } from "~/lib/ccip/utils.ts" import { logger } from "@lib/logging/index.js" import { getChainId, getNativeCurrency, getTitle, getChainTypeAndFamily } from "../../../features/utils/index.ts" import { SupportedChain, ChainType, ChainFamily } from "~/config/index.ts" diff --git a/src/pages/api/services/faucet-service.ts b/src/lib/ccip/services/faucet-service.ts similarity index 96% rename from src/pages/api/services/faucet-service.ts rename to src/lib/ccip/services/faucet-service.ts index 676a407008d..ef0ddab181d 100644 --- a/src/pages/api/services/faucet-service.ts +++ b/src/lib/ccip/services/faucet-service.ts @@ -1,7 +1,7 @@ import { logger } from "@lib/logging/index.js" -import { resolveFaucetChain } from "@api/ccip/faucet/chain-resolver.ts" -import { FaucetAdapterFactory } from "@api/ccip/faucet/adapters/index.ts" -import { ChallengeParams, ChallengeResponse, VerifyRequest, VerifyResponse } from "@api/ccip/types/faucet.ts" +import { resolveFaucetChain } from "~/lib/ccip/faucet/chain-resolver.ts" +import { FaucetAdapterFactory } from "~/lib/ccip/faucet/adapters/index.ts" +import { ChallengeParams, ChallengeResponse, VerifyRequest, VerifyResponse } from "~/lib/ccip/types/faucet.ts" export const prerender = false diff --git a/src/pages/api/services/lane-data.ts b/src/lib/ccip/services/lane-data.ts similarity index 99% rename from src/pages/api/services/lane-data.ts rename to src/lib/ccip/services/lane-data.ts index 211bb888393..a61316bc506 100644 --- a/src/pages/api/services/lane-data.ts +++ b/src/lib/ccip/services/lane-data.ts @@ -9,10 +9,10 @@ import { OutputKeyType, ChainType, ChainFamily, -} from "../ccip/types/index.ts" +} 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 "@api/ccip/utils.ts" +import { generateChainKey, normalizeVersion } from "~/lib/ccip/utils.ts" import { logger } from "@lib/logging/index.js" import { getChainId, diff --git a/src/pages/api/services/token-data.ts b/src/lib/ccip/services/token-data.ts similarity index 99% rename from src/pages/api/services/token-data.ts rename to src/lib/ccip/services/token-data.ts index d72dca0b9eb..ed76fc93c2b 100644 --- a/src/pages/api/services/token-data.ts +++ b/src/lib/ccip/services/token-data.ts @@ -6,11 +6,11 @@ import { TokenChainData, TokenDataResponse, TokenServiceResponse, -} from "../ccip/types/index.ts" +} from "~/lib/ccip/types/index.ts" import { Version } from "@config/data/ccip/types.ts" import { SupportedChain } from "@config/index.ts" import { getAllSupportedTokens, getAllTokenLanes, getTokenData } from "@config/data/ccip/data.ts" -import { resolveChainOrThrow, generateChainKey } from "@api/ccip/utils.ts" +import { resolveChainOrThrow, generateChainKey } from "~/lib/ccip/utils.ts" import { logger } from "@lib/logging/index.js" import { getChainId, getChainTypeAndFamily, getTitle } from "../../../features/utils/index.ts" import { getSelectorEntry } from "@config/data/ccip/selectors.ts" 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/pages/api/ccip/types/index.ts b/src/lib/ccip/types/index.ts similarity index 100% rename from src/pages/api/ccip/types/index.ts rename to src/lib/ccip/types/index.ts diff --git a/src/pages/api/ccip/utils.ts b/src/lib/ccip/utils.ts similarity index 97% rename from src/pages/api/ccip/utils.ts rename to src/lib/ccip/utils.ts index c10232bc66c..4496319a028 100644 --- a/src/pages/api/ccip/utils.ts +++ b/src/lib/ccip/utils.ts @@ -5,6 +5,7 @@ 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 { jsonHeaders, commonHeaders as sharedCommonHeaders } from "@lib/api/cacheHeaders.js" export const prerender = false @@ -15,20 +16,15 @@ export type { SelectorsConfig } from "@config/data/ccip/selectors.ts" /** * Common HTTP headers used across all API responses + * @deprecated Use sharedCommonHeaders from @lib/api/cacheHeaders.js instead */ -export const commonHeaders = { - "Content-Type": "application/json", -} +export const commonHeaders = sharedCommonHeaders /** * Extended headers for successful responses with caching directives + * @deprecated Use jsonHeaders from @lib/api/cacheHeaders.js instead */ -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", -} +export const successHeaders = jsonHeaders /** * Custom error class for CCIP-specific errors 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<SupportedLanguage>( "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..f97bb69e859 --- /dev/null +++ b/src/lib/markdown/componentHandlers.ts @@ -0,0 +1,525 @@ +/** + * 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<string, string> { + 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<string, string> = {} + + 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<string, string> = {} + + 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<string, unknown>[]) { + 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<string, unknown>[] })?.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 <div> 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 possiblePaths = [path.resolve(`public/${src}`), path.resolve(src), path.resolve(`src/${src}`)] + + let codeContent: string | null = null + for (const p of possiblePaths) { + if (fs.existsSync(p)) { + codeContent = fs.readFileSync(p, "utf-8") + break + } + } + + if (codeContent) { + // Detect language from file extension + const ext = path.extname(src).slice(1) + const lang = ext || "text" + + parent.children[index] = { + type: "code", + lang, + value: codeContent.trim(), + } as Literal & { lang: string } + } else { + // Fallback to link if file not found + const fileName = path.basename(src) + parent.children[index] = { + type: "paragraph", + children: [ + { + type: "text", + value: `Code sample: ${fileName} (file not found at build time)`, + } as Literal, + ], + } as Parent + } + } + } catch (e) { + console.warn(`Failed to process CodeSample in ${context.mdxAbsPath}:`, e) + } +} + +/** + * Handle Billing component - generate markdown table with CCIP network fees + * @param node - AST node + * @param parent - Parent node + * @param index - Index in parent's children + * @param context - Component context + * @returns New index or void + */ +export function handleBilling( + node: MdxJsxNode, + parent: Parent, + index: number, + context: ComponentContext +): number | void { + try { + // Calculate fees using the same logic as Billing.astro + const lockAndUnlockAllLanes = calculateNetworkFeesForTokenMechanismDirect(TokenMechanism.LockAndUnlock, "allLanes") + const restFromEthereum = calculateNetworkFeesForTokenMechanismDirect(TokenMechanism.BurnAndMint, "fromEthereum") + const restToEthereum = calculateNetworkFeesForTokenMechanismDirect(TokenMechanism.BurnAndMint, "toEthereum") + const restMechanismNonEthereum = calculateNetworkFeesForTokenMechanismDirect( + TokenMechanism.BurnAndMint, + "nonEthereum" + ) + const messagingFeesFromToEthereum = calculateMessagingNetworkFeesDirect("fromToEthereum") + const messagingFeesNonEthereum = calculateMessagingNetworkFeesDirect("nonEthereum") + + // Generate markdown table + const tableRows = [ + "| Use case | Token Pool Mechanism | Lanes | LINK | Others |", + "|----------|----------------------|-------|------|--------|", + `| Token Transfers / Programmable Token Transfers | Lock and Unlock | All Lanes | ${lockAndUnlockAllLanes.linkFee} | ${lockAndUnlockAllLanes.gasTokenFee} |`, + `| Token Transfers / Programmable Token Transfers | Lock and Mint / Burn and Mint / Burn and Unlock | Non-Ethereum | ${restMechanismNonEthereum.linkFee} | ${restMechanismNonEthereum.gasTokenFee} |`, + `| Token Transfers / Programmable Token Transfers | Lock and Mint / Burn and Mint / Burn and Unlock | From: Ethereum | ${restFromEthereum.linkFee} | ${restFromEthereum.gasTokenFee} |`, + `| Token Transfers / Programmable Token Transfers | Lock and Mint / Burn and Mint / Burn and Unlock | To: Ethereum | ${restToEthereum.linkFee} | ${restToEthereum.gasTokenFee} |`, + `| Messaging | N/A | Non-Ethereum | ${messagingFeesNonEthereum.linkFee} | ${messagingFeesNonEthereum.gasTokenFee} |`, + `| Messaging | N/A | From/To: Ethereum | ${messagingFeesFromToEthereum.linkFee} | ${messagingFeesFromToEthereum.gasTokenFee} |`, + ] + + const markdownTable = tableRows.join("\n") + + // Parse the table markdown and insert it + const tableTree = context.processor.parse(markdownTable) + if (tableTree && tableTree.children) { + parent.children.splice(index, 1, ...tableTree.children) + return index + tableTree.children.length + } + } catch (e) { + console.warn(`Failed to process Billing in ${context.mdxAbsPath}:`, e) + // Fallback: replace with a note about the table + parent.children[index] = { + type: "paragraph", + children: [ + { + type: "text", + value: "(Network fee table - see https://docs.chain.link/ccip/billing for details)", + } as Literal, + ], + } as Parent + } +} diff --git a/src/lib/markdown/formatters.ts b/src/lib/markdown/formatters.ts new file mode 100644 index 00000000000..73161aa8a4b --- /dev/null +++ b/src/lib/markdown/formatters.ts @@ -0,0 +1,240 @@ +/** + * Shared markdown formatting utilities + * Used by both build-time (generate-llms.ts) and runtime (CopyPageLink) markdown generation + */ + +/** + * Format a heading at the specified level + */ +export function formatHeading(level: 1 | 2 | 3 | 4 | 5 | 6, text: string): string { + const hashes = "#".repeat(level) + return `${hashes} ${text}\n\n` +} + +/** + * Format a link + */ +export function formatLink(text: string, url: string): string { + return `[${text}](${url})` +} + +/** + * Format bold text + */ +export function formatBold(text: string): string { + return `**${text}**` +} + +/** + * Format italic text + */ +export function formatItalic(text: string): string { + return `*${text}*` +} + +/** + * Format inline code + */ +export function formatInlineCode(text: string): string { + return `\`${text}\`` +} + +/** + * Format a code block with optional language + */ +export function formatCodeBlock(code: string, language = ""): string { + return `\`\`\`${language}\n${code}\n\`\`\`\n\n` +} + +/** + * Format a blockquote + */ +export function formatBlockquote(text: string): string { + const lines = text.split("\n").filter((line) => line.trim()) + return lines.map((line) => `> ${line}`).join("\n") + "\n\n" +} + +/** + * Format a horizontal rule + */ +export function formatHorizontalRule(): string { + return "---\n\n" +} + +/** + * Format an unordered list + */ +export function formatUnorderedList(items: string[]): string { + return items.map((item) => `- ${item}`).join("\n") + "\n\n" +} + +/** + * Format an ordered list + */ +export function formatOrderedList(items: string[]): string { + return items.map((item, index) => `${index + 1}. ${item}`).join("\n") + "\n\n" +} + +/** + * Format a markdown table + * @param rows - Array of rows, where each row is an array of cell values + * @param hasHeader - Whether the first row should be treated as a header (default: true) + */ +export function formatTable(rows: string[][], hasHeader = true): string { + if (rows.length === 0) return "" + + let markdown = "" + const firstRow = rows[0] + + // Header row + markdown += `| ${firstRow.join(" | ")} |\n` + + // Separator row + if (hasHeader) { + markdown += `| ${firstRow.map(() => "---").join(" | ")} |\n` + } + + // Data rows (skip first if it's a header) + const dataRows = hasHeader ? rows.slice(1) : rows + dataRows.forEach((row) => { + // Pad rows to match header length + const paddedRow = [...row] + while (paddedRow.length < firstRow.length) { + paddedRow.push("") + } + markdown += `| ${paddedRow.join(" | ")} |\n` + }) + + return `${markdown}\n` +} + +/** + * Format an image + */ +export function formatImage(alt: string, src: string, title?: string): string { + const titlePart = title ? ` "${title}"` : "" + return `![${alt}](${src}${titlePart})` +} + +/** + * Format YAML frontmatter + */ +export function formatFrontmatter(data: Record<string, string | number | boolean>): 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/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 = /<Aside\s+type="(\w+)"(?:\s+title="([^"]*)")?\s*>([\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 = /<ClickToZoom\s+[^>]*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 = /<CcipCommon\s+callout="(\w+)"\s*\/>/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<TransformConfig> = {} +): Promise<string> { + 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 <div> 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<TransformConfig> = {} +): Promise<string> { + // 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<string, ComponentHandler> +} + +/** + * Result of markdown transformation + */ +export interface TransformResult { + /** The transformed markdown content */ + markdown: string + /** Metadata extracted from the page */ + metadata: PageMetadata +} + +/** + * Code block with metadata + */ +export interface CodeBlock { + /** Programming language */ + lang: string + /** Code content */ + value: string + /** Optional title */ + title?: string +} diff --git a/src/lib/markdown/utils.ts b/src/lib/markdown/utils.ts new file mode 100644 index 00000000000..1fad5aaa9d5 --- /dev/null +++ b/src/lib/markdown/utils.ts @@ -0,0 +1,154 @@ +/** + * Utility functions for markdown transformation + */ + +import path from "path" +import type { Frontmatter } from "./types.js" + +/** + * Extract frontmatter from raw MDX content + * @param raw - Raw MDX file content + * @returns Frontmatter data and body content + */ +export function extractFrontmatter(raw: string): Frontmatter { + // Lightweight frontmatter extractor to avoid extra deps + // Supports triple-dash YAML frontmatter at the start of the file + if (raw.startsWith("---")) { + const end = raw.indexOf("\n---", 3) + if (end > 0) { + const fm = raw.slice(3, end).trim() + const body = raw.slice(end + 4) + // Very minimal parsing for title, metadata.lastModified, and sdkLang + const fmTitleMatch = fm.match(/^\s*title:\s*"?(.+?)"?\s*$/m) + const lastModMatch = fm.match(/^\s*metadata:\s*[\s\S]*?lastModified:\s*"?(.+?)"?\s*$/m) + const sdkLangMatch = fm.match(/^\s*sdkLang:\s*"?(.+?)"?\s*$/m) + const fmTitle = fmTitleMatch ? fmTitleMatch[1] : undefined + const fmLastModified = lastModMatch ? lastModMatch[1] : undefined + const sdkLang = sdkLangMatch ? sdkLangMatch[1] : undefined + return { body, fmTitle, fmLastModified, sdkLang } + } + } + return { body: raw } +} + +/** + * Convert absolute file path to content-relative path + * @param absFile - Absolute file path + * @returns Path relative to src/content/ + */ +export function toContentRelative(absFile: string): string { + const idx = absFile.indexOf(path.normalize("src/content/")) + return idx >= 0 ? absFile.slice(idx + "src/content/".length) : absFile +} + +/** + * Convert content-relative path to canonical URL + * @param section - Section name (e.g., 'ccip') + * @param relFromContent - Path relative to src/content/ + * @param siteBase - Base URL for the site + * @returns Full canonical URL + */ +export function toCanonicalUrl(section: string, relFromContent: string, siteBase: string): string { + // relFromContent like "ccip/index.mdx" or "ccip/foo/bar.mdx" + const withoutExt = relFromContent.replace(/\.(md|mdx)$/i, "") + let slug = withoutExt + if (slug.endsWith("/index")) slug = slug.slice(0, -"/index".length) + if (!slug.startsWith(section)) slug = `${section}/${slug}` + if (!slug.startsWith("/")) slug = `/${slug}` + return `${siteBase}${slug}` +} + +/** + * Infer page title from file path + * @param relFromContent - Path relative to src/content/ + * @returns Inferred title + */ +export function inferTitleFromPath(relFromContent: string): string { + const base = path.basename(relFromContent, path.extname(relFromContent)) + if (base.toLowerCase() === "index") { + const parts = relFromContent.split(path.sep).filter(Boolean) + return parts.length >= 2 ? titleCase(parts[parts.length - 2]) : "Documentation" + } + return titleCase(base) +} + +/** + * Convert string to title case + * @param s - Input string + * @returns Title-cased string + */ +export function titleCase(s: string): string { + return s + .replace(/[-_]/g, " ") + .replace(/\s+/g, " ") + .trim() + .replace(/\b\w/g, (m) => m.toUpperCase()) +} + +/** + * Get page language from filename or frontmatter + * @param absFile - Absolute file path + * @param sdkLang - SDK language from frontmatter + * @returns Language code or null if not language-specific + */ +export function getPageLanguage(absFile: string, sdkLang?: string): string | null { + // Return the language if specified in frontmatter + if (sdkLang) return sdkLang.toLowerCase() + + // Check filename suffix (e.g., "page-go.mdx" -> "go", "page-ts.mdx" -> "ts") + const basename = path.basename(absFile, path.extname(absFile)) + const match = basename.match(/-(go|ts)$/) + if (match) return match[1] + + // No language specified = common to all languages + return null +} + +/** + * Check if page should be included in language-specific file + * @param pageLanguage - Language of the page + * @param targetLanguage - Target language for the file + * @returns True if page should be included + */ +export function shouldIncludeInLanguageFile(pageLanguage: string | null, targetLanguage: string): boolean { + // Include if page is common (no language) or matches target language + return pageLanguage === null || pageLanguage === targetLanguage +} + +/** + * Convert value to ISO date string + * @param val - Date value (string or Date) + * @returns ISO date string (YYYY-MM-DD) or undefined + */ +export function getIsoStringOrUndefined(val: unknown): string | undefined { + if (typeof val !== "string") return undefined + const d = new Date(val) + return isNaN(d.getTime()) ? undefined : d.toISOString().slice(0, 10) +} + +/** + * Unescape markdown for plain text output + * @param s - Markdown string + * @returns Unescaped string + */ +export function unescapeForPlainText(s: string): string { + let inFence = false + return s + .split("\n") + .map((line) => { + const trimmed = line.trim() + if (trimmed.startsWith("```") || trimmed.startsWith("~~~")) { + inFence = !inFence + return line + } + if (inFence) return line + return line + .replace(/\\_/g, "_") + .replace(/\\\[/g, "[") + .replace(/\\\]/g, "]") + .replace(/\\\(/g, "(") + .replace(/\\\)/g, ")") + }) + .filter((line) => line.trim() !== "{/* prettier-ignore */}") + .join("\n") +} diff --git a/src/lib/solana/index.ts b/src/lib/solana/index.ts index ab6c225c01c..a4f53569577 100644 --- a/src/lib/solana/index.ts +++ b/src/lib/solana/index.ts @@ -10,7 +10,7 @@ * 4. Wallet - Browser wallet integration * * Migration Complete: All legacy code has been removed. - * Use DripOrchestrator from @api/ccip/services/faucet/drip-orchestrator for business logic. + * Use DripOrchestrator from ~/lib/ccip/services-api/faucet/drip-orchestrator for business logic. */ // Core layer - Pure utilities with no dependencies diff --git a/src/pages/api/ccip/v1/chains.ts b/src/pages/api/ccip/v1/chains.ts index 64413aa9d68..5f733985065 100644 --- a/src/pages/api/ccip/v1/chains.ts +++ b/src/pages/api/ccip/v1/chains.ts @@ -14,11 +14,11 @@ import { APIErrorType, createErrorResponse, CCIPError, -} from "../utils.ts" +} from "~/lib/ccip/utils.ts" import { logger } from "@lib/logging/index.js" -import type { ChainDetails, ChainApiResponse } from "../types/index.ts" -import { ChainDataService } from "../../services/chain-data.ts" +import type { ChainDetails, ChainApiResponse } from "~/lib/ccip/types/index.ts" +import { ChainDataService } from "~/lib/ccip/services/chain-data.ts" export const prerender = false diff --git a/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts b/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts index 9c578ededb1..7cb73fe1999 100644 --- a/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts +++ b/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts @@ -1,8 +1,8 @@ import type { APIRoute } from "astro" -import { APIErrorType, createErrorResponse, commonHeaders, CCIPError } from "@api/ccip/utils.ts" +import { APIErrorType, createErrorResponse, commonHeaders, CCIPError } from "~/lib/ccip/utils.ts" import { logger } from "@lib/logging/index.js" import { getFaucetConfig } from "@lib/core/config/index.ts" -import { FaucetService } from "../../../../services/faucet-service.ts" +import { FaucetService } from "~/lib/ccip/services/faucet-service.ts" export const prerender = false export const runtime = "nodejs" // Required for crypto operations diff --git a/src/pages/api/ccip/v1/drips/[chainName]/execute.ts b/src/pages/api/ccip/v1/drips/[chainName]/execute.ts index 4d88f178c45..eed4c9a4724 100644 --- a/src/pages/api/ccip/v1/drips/[chainName]/execute.ts +++ b/src/pages/api/ccip/v1/drips/[chainName]/execute.ts @@ -1,11 +1,11 @@ import type { APIRoute } from "astro" -import { APIErrorType, createErrorResponse, commonHeaders, CCIPError } from "@api/ccip/utils.ts" +import { APIErrorType, createErrorResponse, commonHeaders, CCIPError } from "~/lib/ccip/utils.ts" import { logger } from "@lib/logging/index.js" -import { FaucetService } from "../../../../services/faucet-service.ts" -import { SvmDripAdapter } from "@api/ccip/faucet/adapters/svm-drip.ts" -import { resolveFaucetChain } from "@api/ccip/faucet/chain-resolver.ts" -import { handleFaucetError } from "@api/ccip/services/faucet/error-handler.ts" -import { ChainConfigurationService } from "@api/ccip/services/chain-config.ts" +import { FaucetService } from "~/lib/ccip/services/faucet-service.ts" +import { SvmDripAdapter } from "~/lib/ccip/faucet/adapters/svm-drip.ts" +import { resolveFaucetChain } from "~/lib/ccip/faucet/chain-resolver.ts" +import { handleFaucetError } from "~/lib/ccip/services-api/faucet/error-handler.ts" +import { ChainConfigurationService } from "~/lib/ccip/services-api/chain-config.ts" export const prerender = false export const runtime = "nodejs" diff --git a/src/pages/api/ccip/v1/drips/[chainName]/index.ts b/src/pages/api/ccip/v1/drips/[chainName]/index.ts index b89cee85286..b56a1ce31ce 100644 --- a/src/pages/api/ccip/v1/drips/[chainName]/index.ts +++ b/src/pages/api/ccip/v1/drips/[chainName]/index.ts @@ -1,7 +1,7 @@ import type { APIRoute } from "astro" -import { APIErrorType, createErrorResponse, commonHeaders, CCIPError } from "@api/ccip/utils.ts" +import { APIErrorType, createErrorResponse, commonHeaders, CCIPError } from "~/lib/ccip/utils.ts" import { logger } from "@lib/logging/index.js" -import { FaucetService } from "../../../../services/faucet-service.ts" +import { FaucetService } from "~/lib/ccip/services/faucet-service.ts" export const prerender = false export const runtime = "nodejs" // Required for crypto operations diff --git a/src/pages/api/ccip/v1/lanes.ts b/src/pages/api/ccip/v1/lanes.ts index d0936224e3f..aab2b95d7c3 100644 --- a/src/pages/api/ccip/v1/lanes.ts +++ b/src/pages/api/ccip/v1/lanes.ts @@ -8,11 +8,11 @@ import { APIErrorType, createErrorResponse, CCIPError, -} from "../utils.ts" +} from "~/lib/ccip/utils.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 diff --git a/src/pages/api/ccip/v1/tokens.ts b/src/pages/api/ccip/v1/tokens.ts index c11a39d77e5..7a3fb65de0a 100644 --- a/src/pages/api/ccip/v1/tokens.ts +++ b/src/pages/api/ccip/v1/tokens.ts @@ -10,11 +10,11 @@ import { createErrorResponse, CCIPError, loadChainConfiguration, -} from "../utils.ts" +} from "~/lib/ccip/utils.ts" import { logger } from "@lib/logging/index.js" -import type { TokenFilterType, TokenApiResponse } from "../types/index.ts" -import { TokenDataService } from "../../services/token-data.ts" +import type { TokenFilterType, TokenApiResponse } from "~/lib/ccip/types/index.ts" +import { TokenDataService } from "~/lib/ccip/services/token-data.ts" export const prerender = false 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<string, { markdown: string; timestamp: number }>() +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/scripts/copyToClipboard/copyToClipboard.ts b/src/scripts/copyToClipboard/copyToClipboard.ts index 99201d6a5a5..da7ffee25af 100644 --- a/src/scripts/copyToClipboard/copyToClipboard.ts +++ b/src/scripts/copyToClipboard/copyToClipboard.ts @@ -47,6 +47,11 @@ document.addEventListener("DOMContentLoaded", () => { return // Skip if already initialized } + // Skip if element has data-no-copy-button attribute + if (codeBlock.hasAttribute("data-no-copy-button")) { + return + } + const copyButtonContainer = document.createElement("div") copyButtonContainer.className = styles.copyCodeButtonWrapper diff --git a/src/scripts/generate-llms.ts b/src/scripts/generate-llms.ts index 83e2104c634..042d46a0e71 100644 --- a/src/scripts/generate-llms.ts +++ b/src/scripts/generate-llms.ts @@ -12,6 +12,7 @@ import { LLM_SECTIONS_CONFIG, SUPPORTED_LLM_SECTIONS, type LlmsSectionConfig } f import { SIDEBAR } from "../config/sidebar.js" import type { SectionEntry, SectionContent } from "../config/sidebar.js" import fsSync from "fs" +import { stripHighlightComments, unescapeMarkdown } from "../lib/markdown/index.js" interface MdxJsxAttribute { name: string @@ -85,7 +86,7 @@ async function main() { const lastModified = getIsoStringOrUndefined(fmLastModified) const cleaned = await transformMarkdown(body, absFile, lang) - const cleanedPlain = unescapeForPlainText(cleaned) + const cleanedPlain = unescapeMarkdown(cleaned) const headerLines = [ `# ${title}`, @@ -138,7 +139,7 @@ async function main() { const lastModified = getIsoStringOrUndefined(fmLastModified) const cleaned = await transformMarkdown(body, absFile) - const cleanedPlain = unescapeForPlainText(cleaned) + const cleanedPlain = unescapeMarkdown(cleaned) const headerLines = [ `# ${title}`, @@ -455,10 +456,7 @@ async function transformMarkdown(markdown: string, mdxAbsPath: string, targetLan let codeContent = fsSync.readFileSync(codeAbsPath, "utf-8") // Strip highlighter comments - codeContent = codeContent - .split("\n") - .map((line) => line.replace(/\s*\/\/\s*highlight-(line|start|end)/, "")) - .join("\n") + codeContent = stripHighlightComments(codeContent) // Infer language from file extension const fileExt = path.extname(codeAbsPath).slice(1) @@ -506,10 +504,7 @@ async function transformMarkdown(markdown: string, mdxAbsPath: string, targetLan const codeAbsPath = path.resolve(path.dirname(mdxAbsPath), importPath) let codeContent = fsSync.readFileSync(codeAbsPath, "utf-8") // Strip highlighter comments - codeContent = codeContent - .split("\n") - .map((line) => line.replace(/\s*\/\/\s*highlight-(line|start|end)/, "")) - .join("\n") + codeContent = stripHighlightComments(codeContent) const langAttr = (node as MdxJsxNode).attributes?.find((a) => a.name === "lang") const titleAttr = (node as MdxJsxNode).attributes?.find((a) => a.name === "title") const newNodes: Node[] = [] @@ -644,28 +639,6 @@ async function transformMarkdown(markdown: string, mdxAbsPath: string, targetLan return String(file) } -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") -} - async function writeReports(report: Report) { const reportsDir = path.resolve("reports") await fs.mkdir(reportsDir, { recursive: true }) diff --git a/src/tests/chain-api.test.ts b/src/tests/chain-api.test.ts index da55a4ea2dd..346f5127e13 100644 --- a/src/tests/chain-api.test.ts +++ b/src/tests/chain-api.test.ts @@ -7,9 +7,9 @@ import { createMetadata, CCIPError, handleApiError, -} from "../pages/api/ccip/utils.ts" +} from "~/lib/ccip/utils.ts" import type { Environment } from "../config/data/ccip/types.ts" -import { ChainDataService } from "../pages/api/services/chain-data.ts" +import { ChainDataService } from "~/lib/ccip/services/chain-data.ts" import { mockReferenceData } from "../__mocks__/chainMock.ts" // Mock the Environment enum From bf816ce5e54a4e8a1e1672f8a012fbd535538ec4 Mon Sep 17 00:00:00 2001 From: gfletcher-cll <grace.fletcher@smartcontract.com> Date: Mon, 1 Dec 2025 11:30:34 -0800 Subject: [PATCH 015/214] Ccip arch fix (#3243) * update overview links * llms --- reports/llms-report.json | 12 ++++++------ .../ccip/concepts/architecture/index.mdx | 5 ++--- src/content/ccip/concepts/index.mdx | 2 +- src/content/ccip/concepts/manual-execution.mdx | 6 +++--- src/content/ccip/index.mdx | 2 +- src/content/ccip/llms-full.txt | 18 +++++++++--------- src/content/ccip/tutorials/aptos/receivers.mdx | 2 +- .../tutorials/evm/cross-chain-tokens/index.mdx | 2 +- src/content/ccip/tutorials/svm/receivers.mdx | 2 +- .../ccip/foundry/cct-burn-and-mint-fork.mdx | 2 +- .../ccip/foundry/cct-lock-and-release-fork.mdx | 2 +- src/content/chainlink-local/llms-full.txt | 4 ++-- 12 files changed, 29 insertions(+), 30 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index ccdb883e322..6090a043287 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,5 +1,5 @@ { - "startedAt": "2025-11-28T16:27:51.081Z", + "startedAt": "2025-12-01T18:57:15.612Z", "siteBase": "https://docs.chain.link", "sections": [ { @@ -30,9 +30,9 @@ "section": "ccip", "pagesProcessed": 260, "outputPath": "src/content/ccip/llms-full.txt", - "bytes": 2849278, + "bytes": 2849282, "prevBytes": 2849278, - "deltaBytes": 0 + "deltaBytes": 4 }, { "section": "data-feeds", @@ -118,10 +118,10 @@ "section": "chainlink-local", "pagesProcessed": 55, "outputPath": "src/content/chainlink-local/llms-full.txt", - "bytes": 297263, + "bytes": 297281, "prevBytes": 297263, - "deltaBytes": 0 + "deltaBytes": 18 } ], - "finishedAt": "2025-11-28T16:27:55.235Z" + "finishedAt": "2025-12-01T18:57:19.195Z" } diff --git a/src/content/ccip/concepts/architecture/index.mdx b/src/content/ccip/concepts/architecture/index.mdx index 7b271641134..771bde0354f 100644 --- a/src/content/ccip/concepts/architecture/index.mdx +++ b/src/content/ccip/concepts/architecture/index.mdx @@ -4,8 +4,7 @@ date: Last Modified title: "CCIP Architecture" metadata: description: "Learn about the core architecture of Chainlink CCIP. Explore key concepts, onchain components (EVM/Solana/Aptos), and offchain systems for cross-chain communication." - image: "/images/ccip/concepts/architecture/ccip-offchain-architecture.jpg" - excerpt: "ccip architecture, cross‑chain infrastructure, on‑chain components, off‑chain systems, decentralized oracle networks, risk management network, EVM smart contracts, Solana programs, router, onramp, offramp" + excerpt: "ccip architecture, cross‑chain infrastructure, on‑chain components, off‑chain systems, decentralized oracle networks, EVM smart contracts, Solana programs, router, onramp, offramp" datePublished: "2025-05-19T11:22:47Z" lastModified: "2025-06-09T15:41:42Z" isIndex: true @@ -16,4 +15,4 @@ This section explains the core architecture of the Cross-Chain Interoperability - **[Overview](/ccip/concepts/architecture/overview)**: Get a high-level summary of the CCIP architecture. - **[Key Concepts](/ccip/concepts/architecture/key-concepts)**: Understand the essential terms and components within the CCIP ecosystem. - **[Onchain Components](/ccip/concepts/architecture/onchain)**: Explore the on‑chain components, including EVM smart contracts and Solana programs, and Aptos modules, that operate directly on blockchains. -- **[Offchain Components](/ccip/concepts/architecture/offchain)**: Discover the offchain systems, like the Risk Management Network and Decentralized Oracle Network, that support CCIP operations. +- **[Offchain Components](/ccip/concepts/architecture/offchain/overview)**: Discover the offchain systems that support CCIP operations. diff --git a/src/content/ccip/concepts/index.mdx b/src/content/ccip/concepts/index.mdx index ee298def9ff..d0617da379d 100644 --- a/src/content/ccip/concepts/index.mdx +++ b/src/content/ccip/concepts/index.mdx @@ -13,7 +13,7 @@ isIndex: true This section explores the foundational concepts of the Cross-Chain Interoperability Protocol (CCIP). Understanding these concepts will help you effectively build and deploy secure cross-chain applications. -- **[Architecture](/ccip/concepts/architecture)**: Understand the core components and structure of CCIP, including onchain and offchain systems. +- **[Architecture](/ccip/concepts/architecture/overview)**: Understand the core components and structure of CCIP, including onchain and offchain systems. - **[Cross-Chain Token Standard](/ccip/concepts/cross-chain-token)**: Learn about the Cross-Chain Token (CCT) standard that enables secure token transfers across different blockchains. - **[Best Practices](/ccip/concepts/best-practices)**: Discover recommended guidelines for using CCIP effectively and securely on both EVM and SVM blockchains. - **[Manual Execution](/ccip/concepts/manual-execution)**: Learn why some CCIP messages might require manual execution and how to handle these situations. diff --git a/src/content/ccip/concepts/manual-execution.mdx b/src/content/ccip/concepts/manual-execution.mdx index 278b7ea1daf..f5746053712 100644 --- a/src/content/ccip/concepts/manual-execution.mdx +++ b/src/content/ccip/concepts/manual-execution.mdx @@ -20,11 +20,11 @@ whatsnext: import { Aside, ClickToZoom, CopyText } from "@components" <Aside type="note" title="Prerequisites"> - Read the CCIP [Concepts](/ccip/concepts) and [Architecture](/ccip/concepts/architecture) pages to understand all the - concepts discussed on this page. + Read the CCIP [Concepts](/ccip/concepts) and [Architecture](/ccip/concepts/architecture/overview) pages to understand + all the concepts discussed on this page. </Aside> -In general, messages are successfully delivered and processed via CCIP as described in the [Architecture](/ccip/concepts/architecture) page. However, some exceptional conditions might require users to manually execute the transaction on the destination blockchain: +In general, messages are successfully delivered and processed via CCIP as described in the [Architecture](/ccip/concepts/architecture/overview) page. However, some exceptional conditions might require users to manually execute the transaction on the destination blockchain: - The receiver contract on the destination blockchain reverted due to an unhandled exception such as a logical error. - For token pools, if the combined execution of the required functions (`balanceOf` checks and `releaseOrMint`) exceeds the default gas limit of **90,000 gas** on the destination blockchain, CCIP execution will fail. Read the Token pools [common requirements](/ccip/concepts/cross-chain-token/evm/token-pools#common-requirements) to learn more. diff --git a/src/content/ccip/index.mdx b/src/content/ccip/index.mdx index a2bc305caff..279cad0d771 100644 --- a/src/content/ccip/index.mdx +++ b/src/content/ccip/index.mdx @@ -49,7 +49,7 @@ CCIP's robust security framework is built upon several core components: style="display: block; margin: 2rem auto; max-height: 60vh; width: auto;" /> -To understand how Chainlink CCIP works, refer to the [architecture](/ccip/concepts/architecture) section. If you are new to using Chainlink CCIP, read these guides before you deploy any contracts that use CCIP. +To understand how Chainlink CCIP works, refer to the [architecture](/ccip/concepts/architecture/overview) section. If you are new to using Chainlink CCIP, read these guides before you deploy any contracts that use CCIP. ## Chainlink CCIP core capabilities diff --git a/src/content/ccip/llms-full.txt b/src/content/ccip/llms-full.txt index 8c07ff7f400..48b565589c6 100644 --- a/src/content/ccip/llms-full.txt +++ b/src/content/ccip/llms-full.txt @@ -31,7 +31,7 @@ CCIP's robust security framework is built upon several core components: - **Timelocked Upgrades**: All on-chain, security-critical configuration changes and core infrastructure upgrades must pass through a Role-based Access Control Timelock contract. This process provides a review period during which CCIP node operators can veto the upgrade, or, in time-sensitive situations, explicitly approve it. - **High-Quality, Sybil-Resistant Node Operators**: The system is secured by the same globally distributed, security-reviewed, public node operators that secure other Chainlink services, validate leading blockchain networks, and operate traditional Web2 infrastructure. Each independent CCIP node is run by a distinct organization with extensive DevOps expertise and rigorous private key management security practices. -To understand how Chainlink CCIP works, refer to the [architecture](/ccip/concepts/architecture) section. If you are new to using Chainlink CCIP, read these guides before you deploy any contracts that use CCIP. +To understand how Chainlink CCIP works, refer to the [architecture](/ccip/concepts/architecture/overview) section. If you are new to using Chainlink CCIP, read these guides before you deploy any contracts that use CCIP. ## Chainlink CCIP core capabilities @@ -4202,11 +4202,11 @@ Source: https://docs.chain.link/ccip/concepts/manual-execution Last Updated: 2025-07-21 <Aside type="note" title="Prerequisites"> - Read the CCIP [Concepts](/ccip/concepts) and [Architecture](/ccip/concepts/architecture) pages to understand all the - concepts discussed on this page. + Read the CCIP [Concepts](/ccip/concepts) and [Architecture](/ccip/concepts/architecture/overview) pages to understand + all the concepts discussed on this page. </Aside> -In general, messages are successfully delivered and processed via CCIP as described in the [Architecture](/ccip/concepts/architecture) page. However, some exceptional conditions might require users to manually execute the transaction on the destination blockchain: +In general, messages are successfully delivered and processed via CCIP as described in the [Architecture](/ccip/concepts/architecture/overview) page. However, some exceptional conditions might require users to manually execute the transaction on the destination blockchain: - The receiver contract on the destination blockchain reverted due to an unhandled exception such as a logical error. - For token pools, if the combined execution of the required functions (`balanceOf` checks and `releaseOrMint`) exceeds the default gas limit of **90,000 gas** on the destination blockchain, CCIP execution will fail. Read the Token pools [common requirements](/ccip/concepts/cross-chain-token/evm/token-pools#common-requirements) to learn more. @@ -7385,7 +7385,7 @@ Last Updated: 2025-05-19 <Aside type="note" title="Prerequisites"> Familiarize yourself with the [CCT standard](/ccip/concepts/cross-chain-token/overview) and [CCIP - architecture](/ccip/concepts/architecture) before proceeding with these tutorials. + architecture](/ccip/concepts/architecture/overview) before proceeding with these tutorials. </Aside> Before diving into the [tutorials](#tutorials), it's important first to understand the overall procedure for enabling your tokens in CCIP. This procedure involves deploying tokens and token pools, registering administrative roles, and configuring token pools to enable secure token transfers using CCIP. The diagram below outlines the entire process: @@ -12436,7 +12436,7 @@ Last Updated: 2025-07-25 framework](https://www.anchor-lang.com/) - [Solana program development](https://solana.com/docs) - - [CCIP architecture](/ccip/concepts/architecture) + - [CCIP architecture](/ccip/concepts/architecture/overview) </Aside> # Implementing CCIP Receivers for Solana @@ -17992,7 +17992,7 @@ Last Updated: 2025-09-03 - The [Move language](https://move-language.github.io/move/) and the [Aptos framework](https://aptos.dev/en/network/blockchain/move) - [Aptos module development and deployment](https://aptos.dev/en/build/smart-contracts) - - The [CCIP architecture](/ccip/concepts/architecture) + - The [CCIP architecture](/ccip/concepts/architecture/overview) </Aside> # Implementing CCIP Receivers for Aptos @@ -60049,7 +60049,7 @@ This section explains the core architecture of the Cross-Chain Interoperability - **[Overview](/ccip/concepts/architecture/overview)**: Get a high-level summary of the CCIP architecture. - **[Key Concepts](/ccip/concepts/architecture/key-concepts)**: Understand the essential terms and components within the CCIP ecosystem. - **[Onchain Components](/ccip/concepts/architecture/onchain)**: Explore the on‑chain components, including EVM smart contracts and Solana programs, and Aptos modules, that operate directly on blockchains. -- **[Offchain Components](/ccip/concepts/architecture/offchain)**: Discover the offchain systems, like the Risk Management Network and Decentralized Oracle Network, that support CCIP operations. +- **[Offchain Components](/ccip/concepts/architecture/offchain/overview)**: Discover the offchain systems that support CCIP operations. --- @@ -60111,7 +60111,7 @@ Last Updated: 2025-06-09 This section explores the foundational concepts of the Cross-Chain Interoperability Protocol (CCIP). Understanding these concepts will help you effectively build and deploy secure cross-chain applications. -- **[Architecture](/ccip/concepts/architecture)**: Understand the core components and structure of CCIP, including onchain and offchain systems. +- **[Architecture](/ccip/concepts/architecture/overview)**: Understand the core components and structure of CCIP, including onchain and offchain systems. - **[Cross-Chain Token Standard](/ccip/concepts/cross-chain-token)**: Learn about the Cross-Chain Token (CCT) standard that enables secure token transfers across different blockchains. - **[Best Practices](/ccip/concepts/best-practices)**: Discover recommended guidelines for using CCIP effectively and securely on both EVM and SVM blockchains. - **[Manual Execution](/ccip/concepts/manual-execution)**: Learn why some CCIP messages might require manual execution and how to handle these situations. diff --git a/src/content/ccip/tutorials/aptos/receivers.mdx b/src/content/ccip/tutorials/aptos/receivers.mdx index 5aa87ecef4b..c72e5cca84b 100644 --- a/src/content/ccip/tutorials/aptos/receivers.mdx +++ b/src/content/ccip/tutorials/aptos/receivers.mdx @@ -23,7 +23,7 @@ This reference guide assumes familiarity with: - The [Move language](https://move-language.github.io/move/) and the [Aptos framework](https://aptos.dev/en/network/blockchain/move) - [Aptos module development and deployment](https://aptos.dev/en/build/smart-contracts) -- The [CCIP architecture](/ccip/concepts/architecture) +- The [CCIP architecture](/ccip/concepts/architecture/overview) </Aside> diff --git a/src/content/ccip/tutorials/evm/cross-chain-tokens/index.mdx b/src/content/ccip/tutorials/evm/cross-chain-tokens/index.mdx index e4c5f5249dc..5e624468435 100644 --- a/src/content/ccip/tutorials/evm/cross-chain-tokens/index.mdx +++ b/src/content/ccip/tutorials/evm/cross-chain-tokens/index.mdx @@ -18,7 +18,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" <Aside type="note" title="Prerequisites"> Familiarize yourself with the [CCT standard](/ccip/concepts/cross-chain-token/overview) and [CCIP - architecture](/ccip/concepts/architecture) before proceeding with these tutorials. + architecture](/ccip/concepts/architecture/overview) before proceeding with these tutorials. </Aside> Before diving into the [tutorials](#tutorials), it's important first to understand the overall procedure for enabling your tokens in CCIP. This procedure involves deploying tokens and token pools, registering administrative roles, and configuring token pools to enable secure token transfers using CCIP. The diagram below outlines the entire process: diff --git a/src/content/ccip/tutorials/svm/receivers.mdx b/src/content/ccip/tutorials/svm/receivers.mdx index 8c92b8d0ccf..d10406b357b 100644 --- a/src/content/ccip/tutorials/svm/receivers.mdx +++ b/src/content/ccip/tutorials/svm/receivers.mdx @@ -25,7 +25,7 @@ This reference guide assumes familiarity with: framework](https://www.anchor-lang.com/) - [Solana program development](https://solana.com/docs) -- [CCIP architecture](/ccip/concepts/architecture) +- [CCIP architecture](/ccip/concepts/architecture/overview) </Aside> diff --git a/src/content/chainlink-local/build/ccip/foundry/cct-burn-and-mint-fork.mdx b/src/content/chainlink-local/build/ccip/foundry/cct-burn-and-mint-fork.mdx index 4e3a49e6a34..1adf27d6485 100644 --- a/src/content/chainlink-local/build/ccip/foundry/cct-burn-and-mint-fork.mdx +++ b/src/content/chainlink-local/build/ccip/foundry/cct-burn-and-mint-fork.mdx @@ -17,7 +17,7 @@ This tutorial will guide you through the process of testing the procedure of ena <Aside type="note" title="Prerequisites"> Familiarize yourself with the [CCT standard](/ccip/concepts/cross-chain-token/overview) and [CCIP - architecture](/ccip/concepts/architecture) before proceeding with this tutorial. + architecture](/ccip/concepts/architecture/overview) before proceeding with this tutorial. </Aside> Before we start with this guide, let's recap parts of the CCT standard that we will need for it. diff --git a/src/content/chainlink-local/build/ccip/foundry/cct-lock-and-release-fork.mdx b/src/content/chainlink-local/build/ccip/foundry/cct-lock-and-release-fork.mdx index 3dedccb65c0..c58eb041a0d 100644 --- a/src/content/chainlink-local/build/ccip/foundry/cct-lock-and-release-fork.mdx +++ b/src/content/chainlink-local/build/ccip/foundry/cct-lock-and-release-fork.mdx @@ -17,7 +17,7 @@ This tutorial will guide you through the process of testing the procedure of ena <Aside type="note" title="Prerequisites"> Familiarize yourself with the [CCT standard](/ccip/concepts/cross-chain-token/overview) and [CCIP - architecture](/ccip/concepts/architecture) before proceeding with this tutorial. + architecture](/ccip/concepts/architecture/overview) before proceeding with this tutorial. </Aside> Before we start with this guide, let's recap parts of the CCT standard that we will need for it. diff --git a/src/content/chainlink-local/llms-full.txt b/src/content/chainlink-local/llms-full.txt index 78665fff997..9d11dc72a82 100644 --- a/src/content/chainlink-local/llms-full.txt +++ b/src/content/chainlink-local/llms-full.txt @@ -5820,7 +5820,7 @@ This tutorial will guide you through the process of testing the procedure of ena <Aside type="note" title="Prerequisites"> Familiarize yourself with the [CCT standard](/ccip/concepts/cross-chain-token/overview) and [CCIP - architecture](/ccip/concepts/architecture) before proceeding with this tutorial. + architecture](/ccip/concepts/architecture/overview) before proceeding with this tutorial. </Aside> Before we start with this guide, let's recap parts of the CCT standard that we will need for it. @@ -6629,7 +6629,7 @@ This tutorial will guide you through the process of testing the procedure of ena <Aside type="note" title="Prerequisites"> Familiarize yourself with the [CCT standard](/ccip/concepts/cross-chain-token/overview) and [CCIP - architecture](/ccip/concepts/architecture) before proceeding with this tutorial. + architecture](/ccip/concepts/architecture/overview) before proceeding with this tutorial. </Aside> Before we start with this guide, let's recap parts of the CCT standard that we will need for it. From 790dc263d8f09e64aa746844854ccfede6d8cee2 Mon Sep 17 00:00:00 2001 From: devin distefano <devin.distefano@smartcontract.com> Date: Mon, 1 Dec 2025 16:14:36 -0800 Subject: [PATCH 016/214] Feed Lists: isFeedVisible() utility (#3185) --- src/features/feeds/components/FeedList.tsx | 46 +++-- src/features/feeds/components/Tables.tsx | 188 ++------------------- src/features/feeds/utils/feedVisibility.ts | 134 +++++++++++++++ 3 files changed, 178 insertions(+), 190 deletions(-) create mode 100644 src/features/feeds/utils/feedVisibility.ts diff --git a/src/features/feeds/components/FeedList.tsx b/src/features/feeds/components/FeedList.tsx index f3071e16b08..682e13a3dda 100644 --- a/src/features/feeds/components/FeedList.tsx +++ b/src/features/feeds/components/FeedList.tsx @@ -15,6 +15,7 @@ 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" export type DataFeedType = | "default" @@ -606,24 +607,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 - } - - 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") + 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.feedCategory !== "hidden" && !feed.docs?.hidden + ) + return !!hasVisible + } - return true - }) + 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 + }) + .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)) + }) // Check available network types filteredNetworks.forEach((network) => { diff --git a/src/features/feeds/components/Tables.tsx b/src/features/feeds/components/Tables.tsx index 31baeb4545e..c4badc54af8 100644 --- a/src/features/feeds/components/Tables.tsx +++ b/src/features/feeds/components/Tables.tsx @@ -13,6 +13,7 @@ import { FEED_CATEGORY_CONFIG } from "../../../db/feedCategories.js" import { useBatchedFeedCategories, getFeedCategoryFromBatch, getNetworkIdentifier } from "./useBatchedFeedCategories.ts" import { isSharedSVR, isAaveSVR } from "~/features/feeds/utils/svrDetection.ts" import { ExpandableTableWrapper } from "./ExpandableTableWrapper.tsx" +import { isFeedVisible } from "~/features/feeds/utils/feedVisibility.ts" const feedItems = monitoredFeeds.mainnet @@ -1145,87 +1146,13 @@ export const MainnetTable = ({ 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 - } - - // 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 === "streamsNav") { - return metadata.contractType === "verifier" && metadata.docs.feedType === "Net Asset Value" - } - - if (dataFeedType === "streamsExRate") { - return metadata.contractType === "verifier" && metadata.docs?.productTypeCode === "ExRate" - } - - if (dataFeedType === "streamsBacked") { - return metadata.contractType === "verifier" && metadata.docs.feedType === "Tokenized Equities" - } - - if (isSmartData) { - if (showOnlyMVRFeeds) { - return !metadata.docs?.hidden && metadata.docs?.isMVR === true && metadata.docs?.deliveryChannelCode !== "DS" - } - - 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" - ) + // Use shared visibility logic with filters + return isFeedVisible(metadata, dataFeedType as any, ecosystem, { + showOnlyDEXFeeds, + streamCategoryFilter, + rwaSchemaFilter, + showOnlyMVRFeeds, + }) }) .filter((metadata) => { if (isSmartData) { @@ -1428,98 +1355,13 @@ export const TestnetTable = ({ } 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 - } - - if (isSmartData) { - if (showOnlyMVRFeeds) { - return !metadata.docs?.hidden && metadata.docs?.isMVR === true && metadata.docs?.deliveryChannelCode !== "DS" - } - - // 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 (isRates) - return !!(metadata.docs.productType === "Rates" || metadata.docs.productSubType === "Realized Volatility") - - if (isUSGovernmentMacroeconomicData) { - return metadata.docs?.productTypeCode === "RefMacro" - } - - // 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" - ) + // Use shared visibility logic with filters + return isFeedVisible(metadata, dataFeedType as any, undefined, { + showOnlyDEXFeeds, + streamCategoryFilter, + rwaSchemaFilter, + showOnlyMVRFeeds, + }) }) .filter((metadata) => { if (isSmartData) { diff --git a/src/features/feeds/utils/feedVisibility.ts b/src/features/feeds/utils/feedVisibility.ts new file mode 100644 index 00000000000..1f7280bc054 --- /dev/null +++ b/src/features/feeds/utils/feedVisibility.ts @@ -0,0 +1,134 @@ +import { DataFeedType } from "../components/FeedList.tsx" + +/** + * 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 +} + +/** + * 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 + // =========================================================================== + // Always hide feeds marked as hidden in metadata or docs + if (feed.feedCategory === "hidden" || feed.docs?.hidden) 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 { + // 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 + + if (options.rwaSchemaFilter === "v8" && feed.docs?.schema === "v11") return false + if (options.rwaSchemaFilter === "v11" && feed.docs?.schema !== "v11") return false + } + + // Filter: Show only MVR feeds (SmartData) + if (isSmartData && options.showOnlyMVRFeeds) { + if (feed.docs?.isMVR !== true) return false + } + + return true +} From 1b02e246085595037ec99c511623da4d77e4d361 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Tue, 2 Dec 2025 16:14:32 -0600 Subject: [PATCH 017/214] fix: noindex CRE redirect pages, preserve shared links (#3244) --- src/pages/cre/[...id].astro | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) 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) { --- <DocsLayout frontmatter={currentEntry.data} {headings}> + {/* noindex for redirect pages */} + {isCanonical && <meta name="robots" content="noindex, follow" slot="head-scripts" />} + { - isCanonical ? ( + isCanonical && ( <script is:inline slot="head-scripts" define:vars={{ goUrl: `/cre/${goEntry!.id}`, tsUrl: `/cre/${tsEntry!.id}` }} set:html={`(function(){try{var s=localStorage.getItem("docs-language-preference"),l=s==="go"||s==='"go"'?"go":"ts",u=l==="go"?goUrl:tsUrl;u&&window.location.replace(u)}catch(e){tsUrl&&window.location.replace(tsUrl)}})();`} /> - ) : ( - goEntry && - tsEntry && ( - <script - is:inline - slot="head-scripts" - define:vars={{ goUrl: `/cre/${goEntry.id}`, tsUrl: `/cre/${tsEntry.id}`, currentLang: entry!.data.sdkLang }} - set:html={`(function(){try{var s=localStorage.getItem("docs-language-preference");if(s){var l=s==="go"||s==='"go"'?"go":"ts";if(l!==currentLang){var u=l==="go"?goUrl:tsUrl;u&&window.location.replace(u)}}else{try{localStorage.setItem("docs-language-preference",currentLang)}catch(e){}}}catch(e){}})();`} - /> - ) + ) + } + + { + !isCanonical && goEntry && tsEntry && ( + <script + is:inline + slot="head-scripts" + define:vars={{ currentLang: entry!.data.sdkLang }} + set:html={`(function(){try{localStorage.setItem("docs-language-preference",currentLang)}catch(e){}})();`} + /> ) } From ddf49369b9fd9b20a1bd088d78ad92f52b91e44c Mon Sep 17 00:00:00 2001 From: "Mark S. Shenouda" <49324987+markshenouda@users.noreply.github.com> Date: Wed, 3 Dec 2025 14:12:47 +0200 Subject: [PATCH 018/214] Landing Page update (#173) * Add Grid component and refactor NetworkGrid and TokenGrid to use it * Refactor card components to use a unified Card component and update styles for consistency * Add LazyVerifierGrid component and integrate verifiers section in CCIP landing page * Enhance Grid and SeeMore components with href support and adjust grid gap for better layout * Add AddButton component and integrate it into Chain and CCIP landing pages; include add icon SVG and update theme styles for consistency * Refactor AddButton styles for consistency; use CSS variables for spacing and dimensions * fix lint * fix lint --- public/assets/icons/add.svg | 3 ++ src/components/CCIP/AddButton/AddButton.astro | 42 ++++++++++++++++ src/components/CCIP/Cards/Card.css | 40 +++++++++++++++ src/components/CCIP/Cards/Card.tsx | 43 ++++++++++++++++ src/components/CCIP/Cards/NetworkCard.tsx | 16 ++---- src/components/CCIP/Cards/TokenCard.css | 26 +++++----- src/components/CCIP/Cards/TokenCard.tsx | 49 +++++++------------ src/components/CCIP/Chain/Chain.astro | 10 +--- src/components/CCIP/Landing/Grid.css | 12 +++++ src/components/CCIP/Landing/Grid.tsx | 27 ++++++++++ src/components/CCIP/Landing/NetworkGrid.css | 2 +- src/components/CCIP/Landing/NetworkGrid.tsx | 42 ++++++++-------- .../CCIP/Landing/ccip-landing.astro | 19 +++++-- src/components/CCIP/SeeMore/SeeMore.css | 2 +- src/components/CCIP/SeeMore/SeeMore.tsx | 16 ++++-- src/components/CCIP/TokenGrid/TokenGrid.tsx | 48 +++++++++++------- .../CCIP/VerifierGrid/LazyVerifierGrid.tsx | 46 +++++++++++++++++ .../CCIP/VerifierGrid/VerifierGrid.tsx | 46 +++++++++++++++++ src/styles/theme.css | 4 ++ 19 files changed, 380 insertions(+), 113 deletions(-) create mode 100644 public/assets/icons/add.svg create mode 100644 src/components/CCIP/AddButton/AddButton.astro create mode 100644 src/components/CCIP/Cards/Card.css create mode 100644 src/components/CCIP/Cards/Card.tsx create mode 100644 src/components/CCIP/Landing/Grid.css create mode 100644 src/components/CCIP/Landing/Grid.tsx create mode 100644 src/components/CCIP/VerifierGrid/LazyVerifierGrid.tsx create mode 100644 src/components/CCIP/VerifierGrid/VerifierGrid.tsx diff --git a/public/assets/icons/add.svg b/public/assets/icons/add.svg new file mode 100644 index 00000000000..6a3c331c298 --- /dev/null +++ b/public/assets/icons/add.svg @@ -0,0 +1,3 @@ +<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M6 0.5V11.5M0.5 6H11.5" stroke="#141921" stroke-linecap="round" stroke-linejoin="round"/> +</svg> diff --git a/src/components/CCIP/AddButton/AddButton.astro b/src/components/CCIP/AddButton/AddButton.astro new file mode 100644 index 00000000000..f2ade415216 --- /dev/null +++ b/src/components/CCIP/AddButton/AddButton.astro @@ -0,0 +1,42 @@ +--- +export interface Props { + href: string + text: string +} + +const { href, text } = Astro.props +--- + +<a class="add-button" href={href}> + <img src="/assets/icons/add.svg" alt="Add" class="add-button-icon" /> + {text} +</a> + +<style> + .add-button { + display: inline-flex; + align-items: center; + gap: var(--space-2x); + padding: var(--space-2x) var(--space-4x); + border: 1px solid var(--tertiary-border); + border-radius: var(--space-1x); + font-family: "Inter", sans-serif; + font-size: var(--space-3x); + font-weight: 600; + line-height: var(--space-4x); + color: var(--tertiary-foreground); + text-decoration: none; + background-color: transparent; + transition: all 0.2s ease; + } + + .add-button:hover { + background-color: var(--gray-100); + border-color: var(--gray-400); + } + + .add-button-icon { + width: var(--space-3x); + height: var(--space-3x); + } +</style> 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} + <div> + <h3>{title}</h3> + {subtitle && <p>{subtitle}</p>} + </div> + </> + ) + + if (link) { + return ( + <a href={link} aria-label={ariaLabel}> + <div className="card__container">{content}</div> + </a> + ) + } + + if (onClick) { + return ( + <button type="button" className="card__container" onClick={onClick} aria-label={ariaLabel || title}> + {content} + </button> + ) + } + + return <div className="card__container">{content}</div> +}) + +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 ( - <div className="network-card__container"> - <img src={logo} alt="" loading="lazy" /> - <div> - <h3>{name}</h3> - <p> - {totalLanes} {totalLanes > 1 ? "lanes" : "lane"} | {totalTokens} {totalTokens > 1 ? "tokens" : "token"} - </p> - </div> - </div> - ) + const subtitle = `${totalLanes} ${totalLanes === 1 ? "lane" : "lanes"} | ${totalTokens} ${totalTokens === 1 ? "token" : "tokens"}` + + return <Card logo={<img src={logo} alt="" loading="lazy" />} 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..d8e2b7d6e2d 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 { diff --git a/src/components/CCIP/Cards/TokenCard.tsx b/src/components/CCIP/Cards/TokenCard.tsx index 653908ec260..7810da7f4f7 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,28 @@ interface TokenCardProps { logo?: string link?: string onClick?: () => void + totalNetworks?: number } -const TokenCard = memo(function TokenCard({ id, logo, link, onClick }: TokenCardProps) { - if (link) { - return ( - <a href={link}> - <div className="token-card__container"> - {/* 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. */} - <object data={logo} type="image/png" aria-label={`${id} token logo`}> - <img src={fallbackTokenIconUrl} alt={`${id} token logo`} loading="lazy" /> - </object> - <h3>{id}</h3> - </div> - </a> - ) - } +const TokenCard = memo(function TokenCard({ id, logo, link, onClick, totalNetworks }: TokenCardProps) { + const logoElement = ( + <object data={logo} type="image/png" aria-label={`${id} token logo`}> + <img src={fallbackTokenIconUrl} alt={`${id} token logo`} loading="lazy" /> + </object> + ) - if (onClick) { - return ( - <button type="button" className="token-card__container" onClick={onClick} aria-label={`View ${id} token details`}> - <object data={logo} type="image/png" aria-label={`${id} token logo`}> - <img src={fallbackTokenIconUrl} alt={`${id} token logo`} loading="lazy" /> - </object> - <h3>{id}</h3> - </button> - ) - } + const subtitle = + totalNetworks !== undefined ? `${totalNetworks} ${totalNetworks === 1 ? "network" : "networks"}` : undefined return ( - <div className="token-card__container"> - <object data={logo} type="image/png"> - <img src={fallbackTokenIconUrl} alt="" loading="lazy" /> - </object> - <h3>{id}</h3> - </div> + <Card + logo={logoElement} + title={id} + subtitle={subtitle} + link={link} + onClick={onClick} + ariaLabel={`View ${id} token details`} + /> ) }) diff --git a/src/components/CCIP/Chain/Chain.astro b/src/components/CCIP/Chain/Chain.astro index fd726a209a2..6a424001c00 100644 --- a/src/components/CCIP/Chain/Chain.astro +++ b/src/components/CCIP/Chain/Chain.astro @@ -17,6 +17,7 @@ import ChainTokenGrid from "./ChainTokenGrid" import { generateChainStructuredData } from "~/utils/ccipStructuredData" import StructuredData from "~/components/StructuredData.astro" import { DOCS_BASE_URL } from "~/utils/structuredData" +import AddButton from "~/components/CCIP/AddButton/AddButton.astro" interface Props { environment: Environment @@ -128,14 +129,7 @@ const chainStructuredData = generateChainStructuredData( <h2>Tokens <span>({allTokens.length})</span></h2> { network.chainType !== "solana" && network.chainType !== "aptos" && ( - <a class="button secondary" href="/ccip/tutorials/evm/token-manager#verifying-your-token"> - <img - src="/assets/icons/plus.svg" - alt="Add" - style={{ width: "1em", height: "1em", marginRight: "0.5em", verticalAlign: "middle" }} - /> - Add my token - </a> + <AddButton href="/ccip/tutorials/evm/token-manager#verifying-your-token" text="Add my token" /> ) } </div> diff --git a/src/components/CCIP/Landing/Grid.css b/src/components/CCIP/Landing/Grid.css new file mode 100644 index 00000000000..14c77deb4b0 --- /dev/null +++ b/src/components/CCIP/Landing/Grid.css @@ -0,0 +1,12 @@ +.grid { + display: grid; + grid-template-columns: 1fr; + gap: var(--space-2x); +} + +@media (min-width: 992px) { + .grid { + grid-template-columns: 1fr 1fr 1fr 1fr; + gap: var(--space-4x); + } +} diff --git a/src/components/CCIP/Landing/Grid.tsx b/src/components/CCIP/Landing/Grid.tsx new file mode 100644 index 00000000000..cdc929b6b64 --- /dev/null +++ b/src/components/CCIP/Landing/Grid.tsx @@ -0,0 +1,27 @@ +import { useState, type ReactNode } from "react" +import SeeMore from "../SeeMore/SeeMore.tsx" +import "./Grid.css" + +interface GridProps { + items: any[] + renderItem: (item: any, index: number) => ReactNode + initialDisplayCount: number + seeMoreLabel: string + className?: string + seeMoreLink?: string +} + +function Grid({ items, renderItem, initialDisplayCount, seeMoreLabel, className = "grid", seeMoreLink }: GridProps) { + const [seeMore, setSeeMore] = useState(items.length <= initialDisplayCount) + + return ( + <> + <div className={className}> + {items.slice(0, seeMore ? items.length : initialDisplayCount).map((item, index) => renderItem(item, index))} + </div> + {!seeMore && <SeeMore onClick={() => setSeeMore(!seeMore)} label={seeMoreLabel} href={seeMoreLink} />} + </> + ) +} + +export default Grid diff --git a/src/components/CCIP/Landing/NetworkGrid.css b/src/components/CCIP/Landing/NetworkGrid.css index acf154ba8dc..191be522985 100644 --- a/src/components/CCIP/Landing/NetworkGrid.css +++ b/src/components/CCIP/Landing/NetworkGrid.css @@ -6,7 +6,7 @@ @media (min-width: 992px) { .networks__grid { - grid-template-columns: 1fr 1fr; + grid-template-columns: 1fr 1fr 1fr 1fr; gap: var(--space-6x); } } diff --git a/src/components/CCIP/Landing/NetworkGrid.tsx b/src/components/CCIP/Landing/NetworkGrid.tsx index fc4ff7b26d9..13728a0260c 100644 --- a/src/components/CCIP/Landing/NetworkGrid.tsx +++ b/src/components/CCIP/Landing/NetworkGrid.tsx @@ -1,7 +1,5 @@ -import { useState } from "react" -import NetworkCard from "../Cards/NetworkCard.tsx" -import SeeMore from "../SeeMore/SeeMore.tsx" -import "./NetworkGrid.css" +import Card from "../Cards/Card.tsx" +import Grid from "./Grid.tsx" interface NetworkGridProps { networks: { @@ -14,27 +12,27 @@ interface NetworkGridProps { environment: string } -const BEFORE_SEE_MORE = 2 * 7 // Number of networks to show before the "See more" button, 2 rows x 7 items +const BEFORE_SEE_MORE = 2 * 4 // Number of networks to show before the "See more" button, 2 rows x 4 items function NetworkGrid({ networks, environment }: NetworkGridProps) { - const [seeMore, setSeeMore] = useState(networks.length <= BEFORE_SEE_MORE) return ( - <> - <div className="networks__grid"> - {networks.slice(0, seeMore ? networks.length : BEFORE_SEE_MORE).map((chain) => ( - <a href={`/ccip/directory/${environment}/chain/${chain.chain}`} key={chain.chain}> - <NetworkCard - name={chain.name} - totalLanes={chain.totalLanes} - totalTokens={chain.totalTokens} - logo={chain.logo} - key={chain.chain} - /> - </a> - ))} - </div> - {!seeMore && <SeeMore onClick={() => setSeeMore(!seeMore)} />} - </> + <Grid + items={networks} + initialDisplayCount={BEFORE_SEE_MORE} + seeMoreLabel="View all networks" + renderItem={(chain) => { + const subtitle = `${chain.totalLanes} ${chain.totalLanes === 1 ? "lane" : "lanes"} | ${chain.totalTokens} ${chain.totalTokens === 1 ? "token" : "tokens"}` + return ( + <Card + key={chain.chain} + logo={<img src={chain.logo} alt="" loading="lazy" />} + title={chain.name} + subtitle={subtitle} + link={`/ccip/directory/${environment}/chain/${chain.chain}`} + /> + ) + }} + /> ) } diff --git a/src/components/CCIP/Landing/ccip-landing.astro b/src/components/CCIP/Landing/ccip-landing.astro index e1135ffcb4b..4e101df4cbe 100644 --- a/src/components/CCIP/Landing/ccip-landing.astro +++ b/src/components/CCIP/Landing/ccip-landing.astro @@ -6,6 +6,7 @@ import { Environment, getAllNetworks, getAllSupportedTokens, + getAllUniqueVerifiers, getChainsOfToken, getSearchLanes, Version, @@ -13,9 +14,11 @@ import { import { getTokenIconUrl } from "~/features/utils" import LazyNetworkGrid from "./LazyNetworkGrid" import LazyTokenGrid from "../TokenGrid/LazyTokenGrid" +import LazyVerifierGrid from "../VerifierGrid/LazyVerifierGrid" import StructuredData from "~/components/StructuredData.astro" import { generateDirectoryStructuredData } from "~/utils/ccipStructuredData" import { DOCS_BASE_URL } from "~/utils/structuredData" +import AddButton from "~/components/CCIP/AddButton/AddButton.astro" export type Props = { environment: Environment @@ -43,6 +46,10 @@ const allTokens = tokens.map((token) => { totalNetworks: getChainsOfToken({ token, filter: environment }).length, } }) +const allVerifiers = getAllUniqueVerifiers({ + environment, + version: Version.V1_2_0, +}) const searchLanes = getSearchLanes({ environment }) // Generate directory-level structured data (DataCatalog/Dataset) @@ -76,10 +83,16 @@ const directoryStructuredData = generateDirectoryStructuredData(environment, net <div> <div class="ccip-heading"> <h2>Tokens <span>({allTokens.length})</span></h2> - <a class="button secondary" href="/ccip/tutorials/evm/token-manager#verifying-your-token">Add my token</a> + <AddButton href="/ccip/tutorials/evm/token-manager#verifying-your-token" text="Add my token" /> </div> <LazyTokenGrid tokens={allTokens} environment={environment} client:visible /> </div> + <div> + <div class="ccip-heading"> + <h2>Verifiers <span>({allVerifiers.length})</span></h2> + </div> + <LazyVerifierGrid verifiers={allVerifiers} environment={environment} client:visible /> + </div> </section> </CcipDirectoryLayout> @@ -125,11 +138,9 @@ const directoryStructuredData = generateDirectoryStructuredData(environment, net @media (min-width: 992px) { .layout { --doc-padding: var(--space-10x); - display: grid; padding-top: var(--doc-padding); padding-bottom: var(--doc-padding); - grid-template-columns: 1fr 1fr; - gap: var(--space-24x); + gap: var(--space-10x); } } </style> diff --git a/src/components/CCIP/SeeMore/SeeMore.css b/src/components/CCIP/SeeMore/SeeMore.css index 8c4c9209c51..102d96cf4b1 100644 --- a/src/components/CCIP/SeeMore/SeeMore.css +++ b/src/components/CCIP/SeeMore/SeeMore.css @@ -7,6 +7,6 @@ } .seeMore__container { display: flex; - justify-content: center; + justify-content: flex-start; align-items: center; } diff --git a/src/components/CCIP/SeeMore/SeeMore.tsx b/src/components/CCIP/SeeMore/SeeMore.tsx index 3e0b7c17278..cab963897c7 100644 --- a/src/components/CCIP/SeeMore/SeeMore.tsx +++ b/src/components/CCIP/SeeMore/SeeMore.tsx @@ -1,14 +1,22 @@ import "./SeeMore.css" interface SeeMoreProps { onClick?: () => void + label?: string + href?: string } -function SeeMore({ onClick }: SeeMoreProps) { +function SeeMore({ onClick, label = "See more", href }: SeeMoreProps) { return ( <div className="seeMore__container"> - <button className="seeMore" onClick={onClick} aria-label="See more items"> - See more - </button> + {href ? ( + <a href={href} className="seeMore" aria-label={label}> + {label} + </a> + ) : ( + <button className="seeMore" onClick={onClick} aria-label={label}> + {label} + </button> + )} </div> ) } diff --git a/src/components/CCIP/TokenGrid/TokenGrid.tsx b/src/components/CCIP/TokenGrid/TokenGrid.tsx index 9c303e264a5..7938ef0406a 100644 --- a/src/components/CCIP/TokenGrid/TokenGrid.tsx +++ b/src/components/CCIP/TokenGrid/TokenGrid.tsx @@ -1,35 +1,47 @@ -import { useState } from "react" -import SeeMore from "../SeeMore/SeeMore.tsx" -import "./TokenGrid.css" -import TokenCard from "../Cards/TokenCard.tsx" +import { fallbackTokenIconUrl } from "~/features/utils/index.ts" +import Card from "../Cards/Card.tsx" +import Grid from "../Landing/Grid.tsx" interface TokenGridProps { tokens: { id: string logo: string + totalNetworks?: number }[] environment: string } -const BEFORE_SEE_MORE = 6 * 4 // Number of networks to show before the "See more" button, 6 rows x 4 items +const BEFORE_SEE_MORE = 2 * 4 // Number of tokens to show before the "See more" button, 2 rows x 4 items -function NetworkGrid({ tokens, environment }: TokenGridProps) { - const [seeMore, setSeeMore] = useState(tokens.length <= BEFORE_SEE_MORE) +function TokenGrid({ tokens, environment }: TokenGridProps) { return ( - <> - <div className="tokens__grid"> - {tokens.slice(0, seeMore ? tokens.length : BEFORE_SEE_MORE).map((token) => ( - <TokenCard - id={token.id} + <Grid + items={tokens} + initialDisplayCount={BEFORE_SEE_MORE} + seeMoreLabel="View all tokens" + renderItem={(token) => { + const subtitle = + token.totalNetworks !== undefined + ? `${token.totalNetworks} ${token.totalNetworks === 1 ? "network" : "networks"}` + : undefined + const logoElement = ( + <object data={token.logo} type="image/png" aria-label={`${token.id} token logo`}> + <img src={fallbackTokenIconUrl} alt={`${token.id} token logo`} loading="lazy" /> + </object> + ) + return ( + <Card key={token.id} - logo={token.logo} + logo={logoElement} + title={token.id} + subtitle={subtitle} link={`/ccip/directory/${environment}/token/${token.id}`} + ariaLabel={`View ${token.id} token details`} /> - ))} - </div> - {!seeMore && <SeeMore onClick={() => setSeeMore(!seeMore)} />} - </> + ) + }} + /> ) } -export default NetworkGrid +export default TokenGrid diff --git a/src/components/CCIP/VerifierGrid/LazyVerifierGrid.tsx b/src/components/CCIP/VerifierGrid/LazyVerifierGrid.tsx new file mode 100644 index 00000000000..7dd31d36e19 --- /dev/null +++ b/src/components/CCIP/VerifierGrid/LazyVerifierGrid.tsx @@ -0,0 +1,46 @@ +import { lazy, Suspense } from "react" +import type { Environment } from "~/config/data/ccip/types.ts" + +const VerifierGrid = lazy(() => import("./VerifierGrid.tsx")) + +interface LazyVerifierGridProps { + verifiers: Array<{ + id: string + name: string + logo: string + totalNetworks: number + }> + environment: Environment +} + +export default function LazyVerifierGrid({ verifiers, environment }: LazyVerifierGridProps) { + return ( + <Suspense + fallback={ + <div + className="grid" + style={{ + display: "grid", + gridTemplateColumns: "repeat(auto-fill, minmax(280px, 1fr))", + gap: "1rem", + padding: "1rem 0", + }} + > + {Array.from({ length: 8 }, (_, i) => ( + <div + key={i} + style={{ + height: "120px", + backgroundColor: "#f8f9fa", + borderRadius: "8px", + animation: "pulse 1.5s ease-in-out infinite alternate", + }} + /> + ))} + </div> + } + > + <VerifierGrid verifiers={verifiers} environment={environment} /> + </Suspense> + ) +} diff --git a/src/components/CCIP/VerifierGrid/VerifierGrid.tsx b/src/components/CCIP/VerifierGrid/VerifierGrid.tsx new file mode 100644 index 00000000000..5191cb5925d --- /dev/null +++ b/src/components/CCIP/VerifierGrid/VerifierGrid.tsx @@ -0,0 +1,46 @@ +import { fallbackVerifierIconUrl } from "~/features/utils/index.ts" +import Card from "../Cards/Card.tsx" +import Grid from "../Landing/Grid.tsx" + +interface VerifierGridProps { + verifiers: { + id: string + name: string + logo: string + totalNetworks: number + }[] + environment: string +} + +const BEFORE_SEE_MORE = 2 * 4 // Number of verifiers to show before the "See more" button, 2 rows x 4 items + +function VerifierGrid({ verifiers, environment }: VerifierGridProps) { + return ( + <Grid + items={verifiers} + initialDisplayCount={BEFORE_SEE_MORE} + seeMoreLabel="View all verifiers" + seeMoreLink="/verifiers" + renderItem={(verifier) => { + const subtitle = `${verifier.totalNetworks} ${verifier.totalNetworks === 1 ? "network" : "networks"}` + const logoElement = ( + <object data={verifier.logo} type="image/svg+xml" aria-label={`${verifier.name} verifier logo`}> + <img src={fallbackVerifierIconUrl} alt={`${verifier.name} verifier logo`} loading="lazy" /> + </object> + ) + return ( + <Card + key={verifier.id} + logo={logoElement} + title={verifier.name} + subtitle={subtitle} + link={`/ccip/directory/${environment}/verifier/${verifier.id}`} + ariaLabel={`View ${verifier.name} verifier details`} + /> + ) + }} + /> + ) +} + +export default VerifierGrid diff --git a/src/styles/theme.css b/src/styles/theme.css index 2f394ceb5d0..a922dafcf53 100644 --- a/src/styles/theme.css +++ b/src/styles/theme.css @@ -44,6 +44,10 @@ --color-gray-90: var(--color-base-gray), 90%; --color-gray-95: var(--color-base-gray), 95%; + /* Tertiary color aliases (matches design system) */ + --tertiary-border: #d1d6de; + --tertiary-foreground: #0e1119; + --color-blue: var(--color-base-blue), 61%; --color-blue-dark: var(--color-base-blue-dark), 39%; --color-green: var(--color-base-green), 42%; From f8f4b8b3c325baac1c99fc5e7671b8e5578445ef Mon Sep 17 00:00:00 2001 From: gfletcher-cll <grace.fletcher@smartcontract.com> Date: Wed, 3 Dec 2025 10:46:19 -0800 Subject: [PATCH 019/214] new arch image and offchain note (#3246) --- public/images/ccip/ccip-hl-v1.7.jpg | Bin 0 -> 810405 bytes reports/llms-report.json | 18 +++++++++--------- .../architecture/offchain/overview.mdx | 10 +++++++++- src/content/ccip/index.mdx | 2 +- src/content/ccip/llms-full.txt | 8 ++++++++ src/content/cre/llms-full-go.txt | 8 ++++---- 6 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 public/images/ccip/ccip-hl-v1.7.jpg 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 0000000000000000000000000000000000000000..b7c06d09c689853c02e94614283ffd0711fe7d86 GIT binary patch literal 810405 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­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 A0resloCYIpk8^ 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%0DN{8XIF% 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ΝywZB%vPC z=nn?N;?hmnrOzi4;onaMbf>C-ii&uezRZFF0Hq?<j#O#9@PcUjDP5YUUX;CMS};Z` zt`yURc{k9ulWzKVNq)gwCHsEmDhrV_<C}I1;bD$bdyj1#D?K2@4~4DZn;LqF#akOk zT*sN)e1-Ar?OQ(>ru+Cd2Xy#e$uFGt)I{zbs%3sSX@0Htu-q?sV=e%2z+Ln5?~i9- zU}DDlHMMoqvX&v?bvyUCY9t%j@4oGJHm$3-m%PTQH~%zFQF5TFb~`3^2HDe}aio-` z;@RhGMEam{{r>AzJhg7X6Mx%@ZpZ6euP;rOkmAn%_HFZwiJ`9eqSLqGw$jT7XLGW7 zc*w)k0xfWf@8D1U74+L*xPdR+Hk|eaj0nxv0obLd1fH4QPH39lZH#{?GA7aD8y+MQ z;(H@DqsYff^g1$7`C9Ldn<wG9hgz!kKsMCQ_o{UFffN{y5`CbM;W}Efc9QB<2m5T` z0=Hh;AjK;Th?kY5_bTW{tge)dpN$*u9ulnWwCXG(Cr1X4;{?-nxUkTK8F!E6_HJR> za-Zjknm4~w33tZ!+0n>d_u5!MbTg2R%#t&p+H}5yCSe4jz%>X-IR;B$UJyv^vY3vm ztM(gZ5v2?7(3_i;+-<F`8f`cu%7LK3+Mq_^wJR3<0Z0+l?!9+DASzPF7*m3{?cf=| zJV^X@Y?p6!wK|aTV~<_yz}k85-5h8|ZTdN(iHRz%9?~ngH}TfHA(a^iYyh$2f}CSN zys;%;>tmzLjRs^v>M*#rLFH^%oQg`w{1~B+T1`qw%%03n9t04Ed+-lS&Cax*R^{r- zm7ZB|c>LPKH%5v1-FWI8+pfl|CGLW%4z3gX_&IlvC~d_Os{t;!kEv3Uu>#pz>kGf_ zuY8~EPDt-W`=4QOqi>pxLL8774cR4%@`_vq(Dk-p+;VP@=X&IOS>gl%man2XwPIgq z+L2jo(f!B9kkOGgN&@j#yL(f@?DT2B(Co&I59NxT!-SY-j9WxCpcSK|JA!e;#*Qq% zD1G}`6V(_pez-+jm*}%`fYS`%UOo*$on~me9+~VXi}UdrTAy6P?unS+Oa{4RVsu)r z*SsJzvOcVKXcvG*m)c`T?bCkdJ9M6sX%r>0+Rw#O*)`h9p5e9A+g?+*>o{R6CydCp zZT?DhVe2-^>`~XhwD|w(>G`<oxUtI<`$s7V=QxFhTlvqQ9#ZG)1h}*<iBcC|dp+1l zkV|-?ZM8NIQgM{3aPxoCdENRJxV#XVR&c*hHK;fsC(o-a&tKVj0EJ4|n{>SJ_HyCj zlO}b#B@$nvtu>K@M?c{oJA=>ub!YI*m(#L_OSRtzAGZ2hUAjk$yFnqQBxZd+5Jn|g zh^`PHCIZh%P-Rn0q%v>{0&nXIKvLN+2zoI>A3u1CrMXVEBVD<9yqNoe1LpJj$$fRN zS7TgZ@u^#ls!JbwPfN$R)BH?zD#|PayRo1^HFi~O(mbfqp4#Om^JP6MyeQu;kmGLE zJ+oc&UngaxSuH|3M`o{B)jIb($T(fVSY=kpJ|K_ffUbXx3H0uTs=8^e!4hQGASI1D zD~`%kNypL2TS#}8PWu(EUCxpVl^#yV6zPsR@do+vK=#&xT>V*AH=4E#u<%K3iBNf| zCxwQ>ni62pQ5~vNi8F%Eg99ks&y0#&@O+=k_dvM~`GWx<x;4}pYKw+#CuHRX7Vq=C zw)+@@jo!I#@YP;9Om_`fm@0EBqg>slGde@}Sm=P%x}ah;`a5Mu@P(HmN-ww}b1{aM zYM*(w(`;PFv&pXUlZ^z^`!b9S@(M%ZWjNv5<YcEF0e5h;`TWsbzTh**3FqU{9yN0n z!wBh!z~#8`o!?z|#O)Lk_~yq{1L6vj%#Nivx~-dh@a#s#!_OZKRkTbrnE;$~Hz@SF z?G@puFx50M;u;pu!21WN=9P^B7vw;w$U|%$E?Lbn_3oL}4h0hCYFVlQP3p#Exi!v_ zJ73=x1aZES4a^QQzMN)spLp4bpoN`nvE3?7`a&$u*z7I*p3dzfOPyFknjdzG{!|J4 zODNDj&0GfzOQRTc!mwjL#uQkwlAun=XO!^|hCk>EdWDArdlQz$`?0q9w`vz%`4=Io zYMu8N(50UjE$UzW8yuM4C9W9U?edDlOz(Z5e?{Du>{`{Kt{L5HpU!AuA5th@5`e{$ z$AxglX+uXrO68S-4HgtvONZOBL+iUs(L)%A7db~>a<0SG4XGYYqIJ9I%o&>r6QE~V zrx3MA`FaWfH&qf$lWqy8mx+NP^vB@eJAVH&RB3(|D$5)uhT6uC(H(+D;oHSZ!(e+i zRN4@2lui-TMe2kC8mxDnFSJ^cm#D2)??-lPhzh!uX}tw-vCq+?oEDc1yB-&eJr5&Z z?jY()*eti#hjDk_9vPC=&z`4_6|xT&$lb)aSac0}aJcAomysMK-76;KBx4B1NBaLi zw9k8V?q>>??nYXC|G8J_AAc1S(@1x0!x*of?9j)+DYyuh1POMcO~6IaDXWz`f;yp3 znYVw&nc*X@VB;tRsm9wCN!KS$&Mpt3THWU6rmmyhq5qCHOTX5Ov3!rGa!y>g$I;or z=oH;9Sn43F%G)h0XxdZFBfXkHA<o#cRoXudRT2m{=Ya(dfrAs)^mRX`?q#l%H+`3o zm^>>;0tdh1Jw65RUuG3=#4TyGYTH{`P;U<IXXmNTT{J#oGgg_*^bg^W!&*^Y@ig|K zI=72k3uU^5iZTj?1|mR{Qazj17j)5dU*4;K><oV&n1pWkPX!!Zk8QNJhx&-h4VBr2 z1x_^hXFAtdYd3|*zIf*>GVdt%r<MK}Ni=EHg7D4|+c3F<v%`T<=JfB@xFuL)*zq{D zrzcDC!t-{Lz^!U{oR9^pmw;EwxLWly=l1=Pl#(K({R9=V!0Fs4wYN*L7i~1AiWWOL z!o2-Dl@o3wLP~tvUI%*u9U1~XRB$%h=9b6H{DYmbx#I8y7My~)aF+Ua%2{Qcr7iL~ zXJ9?)p<dQ;h~qtsfQxx8ED#ieeC1(%4TDnJ#!mL;?S=JrW}eu|0|_U$csX}?J`2dw zsbWi4046Ptp6~q5?yr0%bZP23<1>pK?i3Ox+DmQBz0|H!O>ix!;h(&-5B^rUC+_mM z$c&B-W3e$_N0MNP;eDPXzT1!Gh9%`)0{pr&uZT%`qWF~k=Hv`jpvseZOoBRl!tjYE z#S6R*;$r!9AX$!e|9IEebyoB9E#LLl%ziK^#kFSFdnAL4tM9xozPlAQYi8tF;Y#K* zxZbfjs7V5rgZF4|je}#5F?QOb(~xk)xXftq<HP8!1({x1Lq&zF8$SD*eBo5b-aF{1 z=!0}_=I8wEDMb@`XCkG#x3X`6&H6e^M5i-shy1jW_8t6xEE^X5U}%fq>*@*eI$I&Y zFQH|&a<4ZS{Y<*M_qsBa<Lx{}PUxX!#~K46<*kL`rGX4R<|;PGgl?aEdH7<V?)WFT z`j>%REyXGi#^N_(WqETsM1K~(x?;(ZxO*$y7Xz~pgf77%#?ekYV}~V-?STH3q{>J* zxiZ>fLg!~3AC||KM_w*!5V*pO2s7`Fwz_A#U)Uba6}Wz3*HN|}9PXbNj~;YK5RhcR zZlLUII6mg68|pb#W$>psV4xJGbs?Z=KAZc@^qaNz^me#|ID7hB^uqPs$5))=q`NR* z%PVb`X4+&MJiMq--DGSE-G1wvJG7tn{n}!?M4lL2VJ63NFb&pho^RrUk@&b%R9fXC z)Rm{EHp~r_2K!XHT&?LHQAFz;i5P!0mrX`4W;^r%Kgnl*9WKXR4Dh7#hIp|iZ*env z?r_Y`x2C1X{CRWzKvy`u*{U#Sde30jD?++?<BpFQrOS@TPRKft&YEtKF+ZP>h9xdv zpj!%5+@?*W5)R^rz{#8g?b>;!@?GEH(r=OlB!(8`R!;IA1}3@B@<s*1fzZg(l$k!G zr@b)RNCWoC&D3puVZ?i@JIwI`VVhL;Z~06LXGuY2pmYETdSJR=q>FLU885WeHE!pD zMUPHahBUTs`OAs|@ttmU*Ou>NV5qWj`zmKQNXfX*LN~>u;$uN3!cubEVV{t^EOx2K z)7Hs|g6iyPND^<9G><l^7sQQ7y7CdJ7<)0?A#2vGE+M0Xg0dGaUPYTMO<=J@kv4S_ zdF5~ku3H7Nj!JX3tgIQodP#KNbibh`)PpWvYMtJ<l2b^td*|Gb(NVl`BMvU{;6w*7 zg>ab}{a75RR^~Jda_qBhL93*{+4*IeC5Jdkxj*kFJf9=&zB`7Pdl95Te3-3M8}H#8 zK)DU-@@3rRFjAdkv*07Zg`EX`9s1e52Pp}IL28TF`0dEO!q(U4-TxYd|Ne2+2;Q}S zM`3RFa@w)XMZlYtEM*a2{9w_^rN)b{XHQ<=Zer?Toe30Mi0gDj0lvX=Qh$!oeDg=5 z#+33#iW~X}YQJl(1A*;M7<8iWW4rxS*Wy57ozr%{Mds*Q<UnW44Y3jBn9*bZVWH;- ziTAf64o*i>gWnq1t?}vIGUrH_jPOlrc=tB)m6w{rUEx3_jyfULBnzzX(<=OZ2SOAf zAj_#vp;aP9-pDoUo<r{Dk=>X1GpDX-%94&X4A)Or)DVQzU!K0kM`Fdo6oZ{~icWvi zAWG?vzh)bB6}<ES6TX@yt&Np1I%e1Q{ICX%Fny<Wt@I1#4EO!NBk_-u%Z{E>d;Jw5 zcl*@tu&I6AaN4#=r1`39fxk1`0%wd@>rOWM|M(C8^B;fxr9ef$kvkr|0ggR|x?Znf zJdt}4>NI}px*UJ^BzEHT$dFhp&`uYPu*y3<pF(FwvG?}ZPBu53ELX;gFQf(R@Ja`X zO&#+8U^o|{vGIwLe|txP%Bbz5?pL+mx$VP^I-)+jzU$7w5}~$ykbkUSy5%j)zJm-A zGDIT3kT`Q*(z$1qSlpU#8hzuh?08wr_FLkvZrJGw->;ZMz+&(ei%Q!Mh9OSFZ&6bx z)#}tStwlObjYd9pa#^29bZeoTxL8L2V;UBET?dzt`qH5x*0Ov%Iitk)E-c+F`^~d? z0kMW|H{;H7P1LPaY$`T=Vj5zvq=Z2Y&6TwJmQU2_5mAWSWxZL@g81BHYW#sqFD}K9 zt4^Q2Pj4X?ZqLhOfuPU;^qt8p*GKRF5x_G5X7$iTn+3x*g6y&NGlv14oiXJn`}Sh2 zWk@1enT+_4asJ=^E@XS+o4-f5EQ&rqu!p4epHh#=)$tbpyxp&t6hh7Q?61@}g{_1< zFV~8m-p_L*5~~hq665R1n<rC{eMk@GC`fECaDjkb5qo~XeND_UU)UAeDLQIdrwKVN zRNiwT}!oR|}{EET~B#RRE{$~e*!Tb+}eA<bw15yBQbKI)aJb@lYq(Q<HMW0cwH zi54;9hN12FhS2`qU&v~8lXs7Q&)-7iMuty~ib)-9AOAM=qUpnKz2;}dnP>EeyaJ}} z1c{&C8$Q5izMz^aoAMz`zief0H><MpaBo~23Qb(oPh0G%QdK_wZ6=zU^liJg^v{sA zoZjWf8Q{c?YLH4`w8Y!02uNKuvs~O#{q^OstQd+~*8L80Wig8eRD8!o=XU@{X)s$= zaYsLO6|sAp9Mv<sI=}j<&lRyCWc6}F@`PKA(;Ym>E$)u7?=;Z*gh}4sJPAvz!I^#o zTol!cMxtcATJOxPCM9~=Sh02Wqm5<DCx@@B#v@{GI#te8OfESsy`Z_#EedcpS+YH2 z`QnHFo*Ovg{%_pC{Qra-NRPsQe*B+D@YC;mxgfwi^s(XjMiqI}_8YS!i)$54EUNrv ziI*oLQvVuIL$gL<WHb&8BOB1OJ}5zpQMe19G+_^=QQ$6(HLImN!WN+>7gc+QG7RR2 z4(1C--F;@qXpS~qSI_0zrZ=U=7=*HrrgI<JJs`DzZj8&Yi^~C!jT$t2SS%=Rm7Yh? zQ47x!#7BfM-5^k*xur$VUa7dW_EifH%V!vK%tlj!e8EUUWsB9Uq{m9WHX%1FSUAN% zH9sRIH$SOPTd<Bjw{gAPymfCfTixi<Sl=B0cGA>!IHa!5(+gpBzkn{<Q|h%;&HeVm zR>Pf?I^jWmCE7zBMELM1Z1^_H7<l<(>aa0JU#9@G>svNzwYo>&HnK2Ld;haieklSs z?M*0y_oI7*VrHM?s<*`|`MxGJk`g)kG0zzv{JiGBe<0L~Vz&*qCH8k^j-PuBj(o$D zX{@tpj1v%Exeu<%IyFB(Qmxwsi!(l?!06WG<=DgiTq>*)3p#T0UFoMR)3d;8$cfS; zwzGzwj1Qd?jGc1B+E!=cAeqa-g%?(QWr!|Wd2J@Cv4upm;JuVd2?1u6>uBbY0#uBw zXX<vHqA><Ve=WGqfsnB&2EfPhCaosRWW3p$)J7Y?gIgUcCjVk3aD-SfxIf_H$PsT8 zDti(r0(3-s0o<0eOtojtZ*<~*|6L3Tqr1bA5WX<FG-GVKFu`)X5@rn0GtvVXEV?}o zdwb!4zNA~W2E$Oh6nNT{1)u?j8zRy9OD9?2V7hyD=}utH4+fi;q3?e_^Es`ZQX0Na zcjH={>SK?u<62+wL7{0zz4nG-Uork?|0UdNK1w2En$<2}s{+|yrlar9k;Zb%=(C0w z{uDPDnBAEAwNSeVg>o%U_e+~Hp!uZWY4SNLK28|VvUo6dXGUyL1Kx*g%4H>}WcqAH zS=8x!K_v3LfhqfNC!}M8N#LnJm+)Wr3;jX<d-41~11|eBQvY_G(`evGr0kgQ@7k#y zDd$Ys?pbX7HZo-$4h^$>|8E!l<NfTh&^z6t0>+Z8_VU~%kr=E+flg5|rb?aeqXp_5 zXe14#7CX_^yOimPCKc}{hQlnl@Dg{5sMi&XmAPJizwy{?n#P4%{OYvHW;bD}DD0qa zLMeF~iGl_?*~rZ#qG;CYr(V7&(r5|IO|-F*t%isKJQ`cL@PL7Bv!Cla&o6k2{h`-A zE4t8>BOo1xW(t*F66cRt*3Y1edE6|7c^B*wA8A0xn*=P*KU$u!kKgbgNvE-`RUb@p zcB-)0TICV6@|5fmbxN6r0O7i<b0~3w-&9+I?w{(@ISF6!)^9m$uCz*WDnosiSNNcR zJfgc{ejGDUZ(eW*^z{v}B?J*dC1ZR<zoCM2*H-t8KWu4Xl=?fVPU~k6xHpEk-On%d zTZ(?~y)H0^?vdY+i#rY_Iewrf8rb1=)tx5*YEoyshS0#Uw9L;EW?WpH0qs=}Tfrj5 zi~H@Pp}r0FnD@aCE=Z#r<AVjO<0G&GBz&-kj<t->fw=+)Vrg9aVsxee@7<mvfsJb} z+|yiV7Z6C#Sj0|PIETgZ$6{B&!pp__E5BY7zQhtY^IMhtyj&s?9r3E|n{8(Emq(9@ zIQ=4T6LpgS(GgAJrx)?jw_gj6ywj%W!m#wz>>mS!wpeA`S*j&G@vi*bhl9(V%pP}W zzdP2$uQpOdJ$wOz)tZnV#VM7x(!MtyLUCS!HzvoTEgL=x=u+V#xKFBnyQKl<!7x>Z zQ2r3b(*%Zz!^e>~9?yuB&(gSSQN&YK{n?GxX;1UqTZNc}kE!i8SqeyEQt~@aUU7ys z3l$`uY|`fu5Is`bYdi*_z1p^EFZzD>Ddf)ZLvNaf9f*$UHvfs~zJu`Xr?TnmiqYLV zYv|fnyC(mOz4s1la@qGsaaphdDgx3~M5GHy2_awuq)Q1c6zM`pkP>>aA-(smAT<Oe zKmq}RNbk~1AV>?4P^5RfS$m(g_gd$7pL@?e_c`Y|=Xv(~PbQgpXWp62J2T(*`Orh3 zxj8H;3x2^nXdQSv^S9Wzmdce!C6_R#Un;y<T{jae`sK3~<F~AKkrlOg@V7p)5Ndk` zPeC4@>c6qLxEH)5CMIM=H3*c$IN8}b#+bF&`<7$M%B6&iFlBdFSS#QOg`Z>H36@k# z7wmUHuQ!J@x%q~$7{D-NA?fwvP&O&Os*l6Bqp+&FCanR8TE3xXRcJ`K{SMgzc8lPG z)>=9ZYWPfI4j**f8|tvvmoFMX<ScLKFI+VM>$m;%4|scZ3TalNDXp}PcBaNqek&{X zp=+ACF}sK1rDY7CeJ=LWcvzf~`^^iY2-|HyWtPljxTC9HpHhd<FrN*-)+oQH9Rm&R zspC7D2BxiCDFg<ZR!%|Flukeu9$*m@E(o6IXs}^M@>ZCPv4tjryto$36>C4>=L-FV zyrlXGC|sxx0X-g0?yaO}>e1VsAHXO3KG%A0LOb(|hRxt*oO+x&<wic_;vif@?fSS; zYEOAY79vs?li)Tcw8rBf2VGsM>Bvi{FN5)GfDY49<H!~D{djFnlo&&8xX8o5E+ZV- zl$4*(TsxPUg!de-<X;$j;AyyqC{#IM^u01cdw53CpFN$gWyiFaHL=$?|0@L`_*XgP zw_IWZ?TW1Skq?!FamTQsvd?FAFGS3z@F(h_(qDYDsqOxjGVy2NHM#!>;I+R#<)6Rh z@9Hg!#-yD_X`-9=3XwWg&!ROJi{aM$XFv1gFebd{NwXP#Oe*EIbH=C)i_q~-=p+F( zv7UbMxkJmC`tFL}3+o&V(<l_^L-wQx$^so+3NgqJT}<D$<-?Z4cYe`a$|>l_-7RKn zFXAsEc?~4`NZMi3-Lr;v>2bRX*6X1eQlq13!zFC|eku6VQ|Q+7#E20i;v^H6x*6^a zP)Td;D{Gd62MkbPhhmX){6#4dBQ?%R?x~rlrtcLAge8@S^pX{LUvev-4v`C)4$w-e zdqia);xEKJDS5ga-hSEGOqV0cJx@Y1jFNZNr2-Mw)zi|)2cOO`f+ZM-_8017srb9& zBb%AB^DItKNcz%HRKirTF8G0setY+n&fORP9paXiNwZ8$dL!|cw^Z(F`3>-V(WD=? zVA4^I?;WOPunf3T=KxGmCHIrZoPuE6D{DH5lNxDTMvXJVLyRc*E?rjFW&(I+&F1N9 zFWj`4BsKysS{*ME?+7K?H58fxK?ga+&1DJWg1`Us|6zga)HBVG{;_KUyDUOBGH1V2 zw*(@Pjm^Q8F^vedOc-;RE8jclEN`2#Uj|FB{A^qC36@c=?6HcwN4_;*p{>UDv7?E* zh9P4UHMvx{E`5C;4@<s>>MSigCtufn|9qX(H_rH)d&6y?w|CJTkcjmwK$}hGXND-w z(x^JHRQug*EXvZY%s4Oz$GY7-Jo#c<-?&HjnpJ_9Vm@1=AZ8oFDmhoSlx*bSrNl06 zTpKWU7thWs5{gPMb9GsJF$uoIAu`iEj&tFh|6|6}_8is1YR%Sxam#znu3><CYmtYA zSgz8SYpgHG-7|Phd+gwdlwWEwfzEnnVrTDQv;r5>!slVrQ&M@6-<VbccjF<#xpi+F z3qia$vu|00xD?>aa87r=8%cyA48DYG1BF$lxOsWY@)i$8&}s+lgcU#HN~y=UB1D0M zX2_(M5h7vKB%yiQvyBq<lkGI;@PIlmuT(#T%Sycdg^KNEy~;T&4Ua%{i*RTj75tFE zsRDLl$JX0<)I9%119I`+lw9oN`?OwB)ifJDKv?4*b=4NRP6#0{hC@afm-Rua&vp?# zU%ez3z#YX@_uU-xjK>s*+)8Tv59d9yJ$ILv*`*D7g?w^UEQvAQg9H1lke#peRu%*R z_X_0)>Tmd%5;(p4$<r7W_hAjlHB=pDY`ju8_sK$JXmp+CO;4|Ttw{0y&W*^LG)Xi0 z{gh+DnA-gW{?i{IArKWhIv)P_#u0aQ6IS!R@!sP*LlAo#9n_POkJLYaww>dIz={w2 z5g;X<Ssv>|SGLu94R8x1c~nzHlAyCJ_e11M$TeP%b!EKwu3$`Q+3pho>0@`{-rJoq z$aM@w1SN1?U|LkSUQN0He>xFH&o2BLF2q9HCGr&=(ranLHbO*p3I&F>!9%xg2ND`c zTsu#?r68^FN!zJDpG-b~!b*kwoAQ2MO56aSh2<4fGtc|2JVQnjpLzU}#J<H0jXe#E zU&b$lzDUzOlhj_pZ1kWZR<*|Yf|5#=aiWpdgJ!{^+{df6Pv(1q7o@onyLUaOlXFrX zR>G(;3JV6gbGAQt#|rh!NBvFdTtZ7vC0SjwCk}0@t>OuK=ulp7)S#lxZzzya-JQwl zzzx){CVh;zQRyu&AbSkxt1B!#k6!})J#_SHccyvF4_uO|)hdK9w)X|XF?YZ<mMloe zjN}V0Xm*R%o_VxRdQ#>mO$UfHtr4%1S&0eznvGWh72f>Gb!I`gGDL+plb^+(wZM{f z#rMNpEGA@pfZKo7><|g7STiT0PFI4?AK&y9EShzUQiA(RF(_>sm^4;rrZs#rX@|Un zndnG1>PrCNn8$t|y3snx6YpxSCAD(ld{?ri^HyjzW01%jw0zz_wnNB$EhojIGRh5f zQ4z}DRP2jI#hYHS;DU@v<#ArJdm<VsTCL3;)>Xw_1N-((&XkxJy-ln4$Xos8)l(}U z5siJ7<jvG=^_fKP*60+W%OgT==iDkZ+s(Kxa$heO92vuv=2a%Td;pz^ld(<gkFb7` zZrq2HGX5+XCg>DQPAXs(RY@yQ=9hK+si5m5f5-OA-rd%YeWy2MuWGMi38o(7>Ti5* zq=T+IIl3X8Gr6;nDr29s5&Dsiszb|_?8O+eVeVEH5YR*y7{AiPyY2zC6V;CG#&~eL zWq#|r13}xf5ufmPOXf+$S~EP4d=Y!u@HW|4#YR|>T}VX`o{NE~*{eR65B+0xIjbH} zvUxJiy?%4tf7|cCd@{fr<BZh%x9m53SIJ}HpVpGs>!Q^qlYSnFGIV@e<TKRgl0 zw5lU(vDA;**@aE69<6z=1a>J4TQ=9C=V0CJy9+M!UaMn6^NEvVI~yT|mF*MN`d*YF zCQqu@TjxnwR{i|(2dX4Ny{PQQ3d5}RKSD&0%MG#0epkwl527M2%Vf4z&wzibo-GP+ ztySCORagK687|eMP3(4;_HGsT1w2{tjChM^`AV(g26l?PXMUtnx``0)8!quIQ83U7 zY!|U{Q=X|;0MxzSq>XoBRq{BEa&zY_xar1z)~WUW7<R9uWh`ZTOvyF21%$nm74Eb7 zGzVfat}iL*(19(P?pGVadBQALjVh&3^NbRi{#)Lx<Vp<$1zaQCQ~tw~o(}oy$j6ML zuE6^BzMLjNCf$mz@x`ojtrd5;DrK!KT#n<3ZA{-vL3WZk<eKKV{$UBO4r^*W>{aBD z;gAoo4h{~_aWQsg652v4ESoQdt@ly&aTvpW{Eywfiwbz{^-uH)#l2w)r;&W*-OWD< z%hVqK-&`e0pC`A@IhaQb)9$5B1wEN%SQIYB6rR9m5g!jlO4nT13w;p>G2VN}u;ewY z@1?DNql4K8Q^QpZylb5n$2Wf*Q-MK`88=L|w|qQr4KhSc?9X%Gu8wFa6lS5VtT>z8 zq&6fjBw~4ss51o^UcDA<ImO+D4zVu9vv3$SJDJ66VLA(^a-p!w6W&Iyt3%&11bsBj z!rW$@CPItyB4CCc!8x`V*YSu=plRdN#l5~Nhx_qR4IF=RNP2ntg8WFJb9p}I>tB1u z^mGe-@*$JX*ZWmzG@!k#Z_?ENwy&}-7gG(Lz>mL{y%+<hdj7htJI(NcHUwin5PQGl zY6Bk29ty~rs}8*v`gc|Tar3>hp`ehf$B#g~DAvaG0jHI2?NV1Fqq4P*E?d@ZB>_av z5&wsSPNSjJYu&srsAPmS?^Re>?hPN3BcPKgtWHAy#T?m<H9*t6rc*cWc6H@qw@YJ~ z56iYK?8L;adCtE}Ss!Mi5Y2kIVlFY?d!Gy^S+nOIJl5gj<F^SZn7tXA{0=QLmV3*r zEY3ES`DW3HRG)$+!i;HPpRRg66Yx@FsEwn4b(QZkLi6kRK2rrgQDBCLrrE|NshHs2 zUs*Rhc$*w51yL*2hOAKeG|2r4?LZ!BmJFwy(stsrrB$S{vc-nMtt{tKTor}up<J`g zU0V{-D%J}Ls!5l#ml_u)uL@fL{D%h6uN;^2!(b8O4@ywSLr932t^_K5XQF8Ghk0j4 zt<Z?+!>X~Q^#BJF!Q9Nk=re{#j3<6cJ@(SIQT23-Y9Y8TSGXQYIh5oqoLc9@VyTJJ z0YT!O{HUs;B>kiTp%&-3a81>lJ}Slx1j-JoUN2uNK=&67*=oPS=l*`#be5E;jeM)0 z(;O(;w*wUD{jTe1EpXYV%LBB=jhzy6*cz{Kap|>%4!yec7T1|?z{TS^QYg{gSoU+T zw)9?SUpqEaJBq|gF5SRB1NwG1^+*O=T=i&qpnXvr?PdX6A{h5m){axHgFD2XQ@Woj zs6eA9!imRPQk`(|xiKMk-hPirT#mx1j^PBQVCPk}zIJ70TuOLhMEHc+xQngm?a94x zpS-00B<$l08(5=>mos^?BwKg)^ukWjOW)N(*$=tq4OkyA+*vo4R%P%abDXxTv>u}} zlHc-eWQ$CRc@2i5FbB1*){{cbKJZ-ZXpPSbE*_VVE8eugT7`ej@W+(=cb@`LOSg|1 zk1zX!A_8uhAf#kODt(&vdEf3DC`T+pKKG;kUHO8OisM}ae*fE}3vF;&_TU2+t*DI- zz;fYFZ|2gQw*M@BnlZ$cV^-L+ZqY3M<XLz*PzQGyuY#7z6FZBDwD(paSZ;e<L=95U zVpH@KLE@S|hLFS>oV{HO!dW6vMyY)A6WxT$<uw}<r%t$Eah~TW7R+Q)<kErLj5?Ql zePwqk%cooH*7M(6<o-4M553#}7^jtg4#ocm#T(7pXLYwTpvmhDF}@rWaPBPw4^S)Y zO_YP?W96s0Pnp^)(>wQVoTnfFOlMlT1&9$CGs9qxvZ1*5D)HLv?D6YNCjM4CgJg2w zX*|2wVOeFAuLrx#=T71Dt3p)tvofD5|2g3**Jw-F(FO>)@`pktu94;r;nlcZ2@e}4 z)z#*!`hPPeQvGqM2(}rd;}U-=@`HV-+n3n~?z?Ft;y}AQT~cTC%f8-M(v5FUZns9i z@}gI&`0yxhk^w~alu359=}6jhoRE1{*Um%r1w0&9OSlg0(Ub%uS+o7PWsz2O1`nj{ z$_WnDbbvGp2eFG?u2HY8xa(%gs{?-40>FeF-)ANH`DNc?Z>+Zd>Wz;z()Wm2Ue-s_ z7m+zSF8oMicJ889&0?0qplhylS3z#p%*~;=<zA&_>F!dUBNjWwO0%|RQz2p}(SW%< zwdk`+hm>)tS6phTr3U~$PPq;))c4CSLges$Gd(SvM<QIku$tt%4qm;~8+mVkf?lL+ zlA@RA0Y4RpDPzXw+(se`;~gDEu3mzBqb1Fj7TMXmKbPYsZ{obW{8{3ViIu}en_4-? z^tL`M2%IXeV6%7&`o|%MdID)6R!^F+xvliCd&ep7O89%aXk7Yv0)hrBf!q1YoXmk( zwsL64EDVAN4;iY}R+dO|;G_?4W?_Q!!aj80xtCBSCp05Cj4W=Uf-L#;H+rw}u__w? zqkDo)?@zdG%%<n5Vf9LsyF{KTz{;xGlb?YwaD5TQA=76~(5H639&T~UOlIJL5b4As zly$yY4Wt=dhq{+Y!d2$qBU`yR*mp>+x!1PLWq-)n3O#sBnlyD@1!_Sjj3-$WH_${G z+1XBC&bLN8jOQ0D%&B@d14)hUfv|;9KcV7u6bEiw;CCy*wU<OpQ6Qs3hWeqGn4+sB zl`g0@BSBjT7m9eZ74);)zn_4nzwH+5SfY|BYQq@a;zBpi2;$gL0(c`KW7>20i4S4H zF5PO(8e94o4=S*@+@VT;yfPhV(g)<X7WgfBq?#Dm79sxepD)$lQvbaQrr7kpakk#) z-kJ>MpvtoQrlvuk8q>W&j-{6KUv6kV2;1F@Z7;JdURArr%AD3(WCYPsE$ZK<iml^% zCrQmzNXWo`H`8X5>`9bb3<^v|a0Klq2bm5GQ>rcPvFbzmZp*<vzCGzaFH9~UV5-87 zK39w^q#V}}x-V^$Sk^JWX!r+Z8CX^g6wZ}CT6yzIf;>JWx)D2Io@w>ZBKH>M%&Sd~ z*y?C8XTSC$p~3YXY8w7tQBDs;N0QB32uC>|*Zt>Re>!Y&jk27UN0r>BRx2#IPXg6` zuQ#&@V0YSxeAj%K(A$9g{+9<y-r0P7>=k$ftMB;NL;Pzb{x&)PH7EXfP5(6#|G!3p z-q?B9k=)(A1aeLi88{R*UvbnBxoa0qwmu+;w@RdY0o;u#o+29p`^9FeI#TV-!E#F5 z&x`N^?t(UOOgwIUWUv0lXt9(icgHkb+kJ%Rshy&>o*hcRYsOZ>eex819x03EPjwif zvZXNM03-eiNx+-b9fap{z|f|`UYZtZ(NU11f25aXU=SED2B2o0HitP)tO=i7(A^)5 zY;E9PPNF?NkiP)k%Kv_dzwHzCi>CN~R>Rf$L)(y%im1LzRPhkG*FQF0!!;G6)o{6* z@$W+Q$%6zZPC=S(ALeSKB|b6rRaJsWne_RFE=^OPRAO$DVTAD$L6{&+w5AEy;qC#2 zpgJ`|*NkdhQX(LFin>`3MikkB`y=cdV_8o3G9_G61+!CnWyu|KvXx*gG0%^Rq%-k% z&uyv&B#$fj7tQzPo~$T$*dG3CcU}Ue!ZYS)hY6pqK{&?iAG()QT_P1}l)JOiswD`x zx`^VSh}Ef&=yad!85Z6lZC3kSZAOvk_ia{SEzI1Vk9W$?WJ>FzF?nd_Nd)y-AIeBC zS~^2dHOMew0p@N`ed;RlyC0O_BIAf}9iBZUqqJG0D&IAwl%SGInx(62E4ru-XXg$X z{Zz}cF{Z9};2%xi)1P-%{%96Gov&;9X)xf~D(X$RdF2Gmdrl5v5n;KEh}DKTTicS# zT6Bbe(e$~G9_hpTDms}94O3x5FGHDi26b~kzM@UeP{Msgq?5zYI7_#}NpTL#KDOJs zQX!*+oa^nmKLOP(#@O4?U`OH7c*i42mXyQGBGqY4pVos-oRv<hkQFR`i1t#*Y@_Zb zOAyExcNx03>f+FoM>w5iY<{jyY*1RBGi?q66llE(nbYZdk=$l;;NvjwMUn)*>*|n! zULo6xJo@m63ppq9IM|5jJ^@tdIYF}8@qt*WJ`Mq4DUlYfD_CLLoEvz*H*=-8T#j|o z$s2204wK~(PprjCbmLToSCH+uyM0Pj?DmdA1q3oOLG9mVmIgZYwkec%4W<tJT-hmh zOfrWBpQZHA5$uskFut_eL?Dwo<zClk7vEXFW?r$0L^bmt%i_Z~T%QhRY`Z*oTT{(7 z{Y};Ug>PRgJa-Z%tLEzAxs^4_YTYXB;qN%hHBjpmGCnqU((wBA1i|u1g_J@_&TQxf zE8nZvmuucAl8b#C?cNVK3lw&BL#&t;oTJLo$^%;c=cez5w;#k=gG{A9%=Sp8#sD%G zzHMVhCvH5jWw>%+e||*s3x~7)c|WIwA3r1KqN|T2qpzqR#g+(KosB~uUZ=<X@Y9!W zy<c}D^6{q8<$j2nOT8X>`OwtXhsU%y@7CSKz7YVI%-H2!c4Mya;<vG#_uJdX`0UY@ z%-vaauflwU9(M|TbZ*QY(5#(w^7N&gYR0`KO+aT`GJ4U=J}+E!oWw^N4-cc+ANxrG zB&!%r(%9qPb`hW%_JQgxSZ9v(2}f^i$E3?i1!_ksjP7dS_8E%wcfkT?^M(jQ`9_Ji zQPxbMvID2r7b$s*GUwu6F~U{!Rov+p6!kEWc8gz7rJDV{G{6ypR>)Yz<IeL^N*1p` zv|m<FPXbqrX2o}Q?t)CjP`+%ZG*^DJ3+EJiOY<WkEy-kdREjlHNjTnCX#25ed9jnR z0)#0@v7_V@<ZELq@MRzLiqTBcov_zSrJC?!-!}^eIn})-kL;@5-b)MZeQNc${2|Wn zaa}XHc$s8STGf3Ez5QV>9C!6@_)XU{-?N}rVPl@4xT_ayHJF!5LfwPDQZfAGi;ndV z<Xw;)!^aQZ-MKqF;f^!v>va1Sn7nqp75nh_)Pd9KZC`?q(m3p+t-Eq;O{wrYi5jA! z-q<M!MUyxl=zDPLRed3gn9GTV($+EwOMZ~@b-nJzp?&)yV9Zmie6)REZs@XhR9MN) zypiY~c{2Y-#)z9{)6tXz0tK)CA|JL@;<?ntDcXIW<1kh(YQK`4v6<{bD>H*RwVWoN zzW;`D$E8a{Sw<R(Hf#}-*$ofxg5k}0mFb{!b%%$-<rP8%K<i2I@dMc>+lHeiRb-Y} z7nWCr$aVFcs5HSVV+4KZ-GL%2xV7ON`H9BD{n4%X)9pjHW0Pvh!w2R{Lu<q1)RXrE z<x2omXZS#$;e3{W3sGtHa#XBLf=7K>#*|pPru<m6S$3D0(krU5!~o%2uAndJUi8xA zdVY}2u1-dL0mspj2g^tfYKnfs!f@ny@j!%$*TCUvv6fALC5`z*0jFq=w_~gqwfA{n zCGJZBcrU~aKqzvms-U7}o%C=U?^x{KaEJacn%^FXPu!T#*TaW{UT#gPm$+?6OU;p@ z=RVk!-hb({aYPXq@6%#)^1^!RXAq22eO?G0N{{T6k9&aMAAy{dKn{GoGdFP<bnF*d z?j;U{D@o~U2Pb2{T3*EjhNlfS5y@y8^kx05QTgbF&Xqz+*|AO0&u}VwgR`(3dL^c~ zYi`5i_Ix=@cu`o3{oRA2_q690yO-!*Ik6psjdhWCT6v|3oLrgEly#uBjZclGLwBpA zj;M_|$eU<oH_s@x|9NhPrMO3|Gg;1gWz}@j$LmJrVI=JQNOr=YL^8(@5;w43&+LFe z;Gwf9wUlsVF>$1OqmW{S8){Lmunzd%WmEAj@pI2;Rc^6`L*ng-k(&_}s|2l#kH+ti zEDbh;<uj+cqIPl1F9hE$svXnRmh4Sc9jQC~5QcWri#mwdtxrLnlf0}PH~gG1WdIHb zi}J)Jq19V6?R#ImOfGil)^WyLN~ql8y|E-ao@0lK!;c>l_q>k1@0-+*n;6aVnb3Ln zE2_La5nnF_&G($?Px2~wX_{7aUpVV(JjjA$6}4<WmYa+LDf(*BC-Gg*z`A=NN4f31 zulu@x%X^ji($(s&6I>0)E2XX!6w;A**e~(Lu>aLnh&0fs7+KFWxr*U9QDgB9#ZI{( z^_jTF2kHWRMg3_rXbmqbap$e&UTPp}*y}sK3MM|bp7154@fU0GbFyt{y;xB%jXHY! zIDBk$hU8&4z8xAlRaI6uXr^k>8Jbr#q+81#mStXlXWIPOoWuW#?M+`wreRRdyCoiF zQa1|1{-gK4h%4_cOZ{rQNGszf-g9_*BhF*`Or=53scK8dSj9TL{iN6jI#?;fU=Vfs z3o-RA6<!X~I{zIk`Q1FrJJ(uY=}=F_I({}wz)3?d9*s53b}*uD@`EUQV*|`<Bij7Z z?-v@TLa5Fm3fK0YbHAXTjQ)20mZvb{Ma80s+KYxMc;k;nSL^E_GXHQ+ei)au9pCc2 zvvW_rmBiNMnJF4VI&y?^XKr%#UQiI7+@1=YSgFT;Tl2vC)WE-yxMRvJNnRTmQZ0Hi zp)=lQiY(D<dxRcK@75sd%y+nS>J;QR_7CU>Y&q7g@h#s6y#D<uE-O7c`O;1G?p6s{ zNo~df7Xzc#27O;zH0^+Tua&-iF06Z)F=O69g`JTt9Q8Ckj-6Gg*J_}%4Ljh5HaRku zNc~<(GyWHi!8dAbHY^~mFfp>ywb}Uq=gSW$)u+02$|uadJD>g}FTEH^a*lCMZ$Up+ zRejVUM2&*AVLdZHyU@!)jB^hkmsXu;0;{3QfWoK|{rFs{#u_a-FWrv`EOx!wO}%S1 zc=)~HUP`$b`$pEAZS%i~=2`jw6uq;04*n(J|4Ym8yW;1+MxvB=?K8EkVy#`+nPBM7 zx;ii=?ue_3D)A_38ZbUMZR-w7vs=#6d3H3Adz>;Oxh)!|T-P%7-4s((eawO$y>BA$ zy{coiuTvWui!=ZxK=K5qFd-uu4(?84c)(c6;)H2I9>Ny&vNtz0Uu0`}Of(1dMdX|x z#6<B##~8ZVRsT;#6@Spb6jA?D$^GY*lRxS|KkDF;SnXk=TsBbO;8R?w%~pu_)Tf3! zu@3{CXnO5Z9##w<q5*@1Dqn+}iP5kt<ByGsE&}R++GTe9Mvy|6M4i>7MifuZdg|@T zV%|e(xYFH}<ZPTndZmbx*VC@~^d`Hh4}>R%^-w0T!ON0VF91PIjF6wPDCO_%@#Xiu z<Ik5s$db)5ogCZV*0lLe*Ep*j9Pa4pUSyt}pgSA*>z_-~{AV%T^|YM*kJLiVuY`xq ziQeg996IbV*BQVkl>Gc!Z9VlqgRklrO-!TXs?G|RnFXK=FZiL}K1LLkifJmZ(~2zb z1(}eyoOj1guT;!D>8!#v8!J7oa;J1+>&`N-n=B-V)sZs&2UZ!>XyZgHrqo7^C9WCG z9CD|md7SS1dH?(I;X<ZmjMGw?gvVtF9}Mi?z3u#Rk(Qs22-dQeGE#%WMuw*(d-Uek zHMdQ?-`M(Y_aA|m%#&?EcQK`xuPkv&mwa#8=Z=Tnn`mLMur_Fe=J$xUuUDBm2gx>H z@5SVud5^U#p1TI0QR(!7A`FVK&gnBewhQ+<L5IYo)HGX5LOz%RYJCT+K4HWlPFTzD z?~e2noP5IUJm=uLQ8hS%2%Z3UW)z6n&J{uNL+Wkw498oFO1EbeCN7=a;ZVT%^qA|e zp#m~(t4Ng%o5B&v&-fUFe^BWfQs>2shC6j4TEz^5;>ukv4j&GnL(0Qn6ea!c5UDfe zUvV6l*4Ry(PaIg_+8PEyq|I*iyTUj9*^wOh-fwoh`jVBFh$H>{&*;NzkG7-)uih$_ zxZ@)2nWu<0lGEHuzYh=n?)Y6ZafofWOIreK>s74@0e13x-#Lm%8Lg8+<3$$`-i<at zqr4Vm(YmZDDo<U`3yDg_`F(M&u+?!jmwnq+uELSc`v9CPFm}&J8;fpQK@;^fyJ}vo z>u=}wz;FI_hW+vFzs$Z%yV`1#_G}oI$}DR6<=W2E+G>byrKAapjsXZ;L0T4>dSADH zkWh&lM6X>VEKRQVCz&oV29<P6m4L;N?!;P~@!%4i)b3`shh4b{(fN`Ae+e{Cq9+uc zMURqn+%1X<=;h)4n?0G~*T_GtyZ@`BDrnAy&-HR`PYKEVqQQDjSB{$AdJUK3a=Oqa ztTgCwAUh^?TvmNXk&;&=ys+-|KCN9@7=hKM?Y^dqt|K;P;7F6srob69f#4$X1S=5t z$rDF;VOR!LKSrC#Fkpe*YmK)t;^VqA<@F(A=UhpQ$8w&FARBTU*pqy(!};<zIyU`X z!N=;rQuo1}lH8i2ytH^lvTTZ)rd!YFwZOOgVU1jJuAQoFi}LCgT;1D;?a33F@-1le zeTmT)$i*<y_kCMY(6#CEy^yvYbYyhy7HY9%sDEWdL!Tm$aAaR(pFZo8PL0SC620ij z(*n;jPVtj&;h<jzGRI{i;^$(;U3xd<N=4cxKTc-!?~5o46!n@Hjf1i^2sw7|hl==j z?j$7O4v0mCMXs^8d93BX%G6e|4?{k`U%P*`Y2T}{x;J@On+r6>9SwCnIH!38Ui}`` zyb3<jr;~`zo<|y{=Sen0-Oe<on#6jT>N7Z1zTGlPl645r3!Rna^NG*~fkAq_lic2O z-!`Z&=a;JsFJ^JdMmUVnzgn*Ots_PETIj^4;XJdGgz&r8n#wa4uAhaWvmI8T3LM$o zwW^*oDLjo+Q}ir2DiuPo^(As^756!88T1dKD?@`>zy8|`CzCX^i86~@3JUxb_*K%X z29We6^&>%ReVC~+zn2jqfV-R{KAGmo7r_^0iFiety3^4!SMqdbO6VKGF(;{*@@-nM zX(*GTjrZfKk>@agH&-nnQ+i8ckNMq?4-@T*dUZ!uB~H9nb}!D$z!@Hd@++;cav2K_ zId6Mh9*>W(%93iijs}HW>hG)TNX0wBL;}DfP~6hXY+>WEr@X-_8QurE@jdhp*}zHc zGE3~3DW|=av$<BgwW${|v6GIKW*0|bZBnM$Ld@_(>sx0sEmzJaOKV&z)?OK&2z4Jb zrbch^F914)cI0f>58;SyG+B~+AStlg%qsHPEsvX2BW2c*3F5UTS&-M=NsKEu)@U+Z zs1iIJI;<@Mvhv&3B$1y@G{h!BTn8y;db%hBubHAsE2;<vI)g)imev}&{4$%Y{AwfT z1W7eWf4Kmgk?v;o?$&%0UDIbk<86~t|5LxsV1SszHB4NTbv&9piV}c2dsIVfWP``J z5+PKgU94}7gKFC!E8xF<{^vlK|6GY)P5;N^d{u=gYwnZI8&Wt?Y6S6JQG`5G!TGU= ze=bN(yHF7zGgxJzn;vjE;zZVLK)19*{oD5~8S@HKbi09jUy^48upey5AfE~<g@nT0 z&=K9H$_ykwf#5e{fUd|U3LF<9gohI3&u__qsqsV^+LfD5)kTY+wwZs?ytfmo*Cc61 zQZa~LZpmygSJ!U%q?UwoYdh^JxpZ!=$^w}ty>h<0{43*s-jM9Y6)HURk4>e0?b|S! z8W%!r+Ho(QC3W@OmrEn9wA)W<+uS&LaPauH?%<fzTuSTQQBDP{{;OwSBLWB%)ui~? zn_$F}Q`dAA!FK9h?m6G5UAn8XZF%6PI|Ylg-?6y?0yz71NHjYo%)eKP)YdG%Bs3tr zkJ%7q+3p<e&Pbc>(%+_M#fnYX0>1_Y!J`m4cZ6yh*Cwf8H6x~-Okqusdhm5{f*3K< z>2xzvpNwTvhwV;^?@F3pm(QO189tx1G||vET0-gO`k?uEL^@N;72NlPOf}P-?=kYv zXjQhXDShBg|F4|?`D0-IXx%3}N<H(&s=7}!2Xt1sYYJ{zY&ZMDWhzbdrUb*y&U=AA zQJOhqj$Ma&na)xW!)-KZK84@g^yC16K7b%(Oqwl41`1t@mom4!x$G<9DZ_bExJ>om z*WUAu+}pmrCwB+-aqJflhU%I4hK8nXE^9ud=8X^_yTHzXw|XZCp0c0HhrA8HX#Atz z8Xxm-$*%=x&i<mIT;}`v)ahg_8?nN(_4pUfF8SmE#uMI(ozeaIMC9q;G2_HaEYqL$ zSgc*CW7m0;<t4B&1jiEw;TYby27;A?Va5)zlCvupVUKXcHewETb_><udEEy>)9cLS zkl`9z{_yG<YLNdfntBAqiVVBnpkTosFfgl)qN~J@!IF&3W9>Ds9ahvI&Rm5-*$P`? zuKBZ*Y5t;LB<yp&SGex@iYHwd9GVr*bQq#`>~EJZ!w_G%t4YVwWS9H{%eK1|iE(dH ziHNU8!t=t9PFmjC!3|1g(}fN&7+a#U^qUuNBdM_*<IMu7%G}}S7g63EzDFa@Y;jIo z9R$XRpBgJcD_!OGWOV~!)c0#%nbN?kmm4j9{Op>mJ*(d>Nz@LLjrL(j2>JQ&1BW!& z2P`+X9<S|d>W2Rq?Rk`Hn{q~kFWB-G+Uu?^^$6xT?R@0Q9cWt--ZVGY6xuyIGh;bR zD5wd#RA~7u*Ji{NA)E_+Sd^uPubcQx_8ZFaTF=*p3ez9v_vG4DqCWsr@)#>-rH)F@ zMk**X43$TsSxqx%FFt-^HNQr{D~48eDuV;Fw|>SNp|Rr}o?DuCt=#erL~=~r$5-Q; zq}5x5zpS^_>id($<Kx;9%o}FiVG-iU@$B;2x4bOUa&;N;)!)LCan6%J$B~FP4!zHu z9HA(+zRq+fDWUgj*5#Ax6y0g(SgiqD%B|5F`bY81JlyAqn1UG{W8s-3wV^YPIEqnA zN#%Cgb+G=|f|kf{F6mm|Kauo^Pq?PzZQJHP@TXY_iYnSW<_QfX*XoQ=+N81*AzGs9 z^=A^EEC7dxsX_ZrFsSO;>^kN-9j#9Wv}+o72I{`0CmZ=JqX{CW#x95cpA_|R<2ptB zPp_amOwGo3g)muV)KF0qO>6&S?#F)7p7kfY_nr$M4`Y8sktNq361i{N&=fFeC=mU( zg%5A8)qhPrLtlTu9&qM^+WOattXo@q9B(LrhZJHWw>5pL`P$dy-_|l7<6mn!`)cir z?j?0U{LG!Rc}R$?F}FH-8Bh!O$Q^KSjf(3cDu|a}RbXVRVt5Ur)tb~TNE-b`6RB`- zXOBTsbXRYQu%j^N(E)mRw$%H`m#*%y|5xf=K`$N_Gn@+W!giY<;FXT58)+z0+1Eo= zww#)re(!ASE$O1pDVxMG7jnND>qUXe;r;||)tiBdI^>;^YMYAVP@Q=C$J<-STO*1A zM<aYEbGk043UGlo&(oi5HExyOtUh~-%&CxJ&GD-Jhl_eD2Gg=Wp?hbRA|jm=JG5D8 z`oJb)mR*<If1gq`J}Kq#aT-#S(NX%!`^qwB(ra>tSK>-WL}J7A!N{5Bc?px62dTbk zFK-CxGrdK}>N;@^)WeLhmJuDg)oQD{#N2osrBF2}YvEI4Leqlp5gC&Huo-feHs!@- z@hU?#Aw}S=Y!~4HF;Pw?SVaG$y2RFUFUtqn?nXBJc0B}Dcbzw`J;ml{lXQB6X~h+Y zl(N?)44*`|e%q*-^`BiAL%#kJq!*cg<h6uoNhi3#iW^z$tx@4UM%i2F{sIGu33mEn zwcN-jEmkY(5NX@n?<d>5H*5zN`}rfB@Dy@o+wB59k3NH?$@Dcm6GC+|4Mh9AY8NC4 zw{OyLj%m9~;;-FuYY{`=#@@9atMx1BYobdrbK+=V(YTshC?692NMN^Lr}N3i!EKJl z=DknVUQYd;ad61eN^jgs1sddZHbusY&J91+c*Wcp22*xTGNTjekrVP4_Ds|-DlHa% zxf9$U3b83U{T;MP(hkp5QIUgkb8-zeF04(-sN~!gO6B!l&6IPiTlzSLv}VL@U&m7% z(Vb8#t6#1IZMrfq#ve3tsXuCFj)C2r?~5D5b&@29TuEbKwGjvK*6@UFukCK;RCj6( zdb~`FyWQ0!q=%1*52gnb$XzeW@eZkWf<0N(^z%Q83k=xyb>62-enX{!S5?S2C(kU^ z#4p$KaBTPNPZz}!I!{%ng7!lq+}~XnA{y$Nk=07(0URPy?M=oxHYRd$twtZS@F@FN zdRnP<iqM{3C17aPT{~gu%6y~$M_Gl3%d$e1No^X_Vn=54rf!*T)3Q`Y%dy(KQhR|T z#*{=a;V5~t)eioLATFHuF-<z>Ue<cfx@h33oj;asn*TSP9GNKnE*l2l)`;b|7RB{J z)1Lmi4J~DR+@e$KdYhbUI-YeWoj^IWHID_K5l0bA0F+sHK8XkZa;hGfB-rcTQ!0d6 zrNaMcXq0Hqca-;<6(Ae>2Q<yMOpbrii2iq(v`)`z+H4)na6ebKyWCjqRd53JB-LdE z#LiqL_PV>DC5KeY94O*_NZXP2f%O5iUoati@B~x#02r*IW=ed#&b_N^JU!2+Z=-5R zQF2>5EsKkU%nllaoLo&u9|Kbk{w{h<w;7W*+gBZM_xu#=r&&8i2dWmA4G^TLNB_$B zUo<2gc+gdxqT9wiX_Jf!a^Z=}dLZN)QH#<wrh*uy;@6svKUnCK*i%KK@lLd3hMh-Y zWgqysvQiSkoAtxTYb<r%3HS-KyW2&=-Ap!;y6MZ2yIvoLa002>1(Slbf00=g|4pQT z|4VTApD#H4XGA{Jejb~DEVciZ_^lu_(fs>BLur&I(*`X-N*0JLZPNNDwep|KpVASY zI$X^ZK6<)<S9G~g7&~Awh+0%Ow^0sTGX4_yC%D`{-$l#d9ptUxdz}oeXWanCl(Vly zHrSM|PdbLOjl8h(Yyq11+=y-CwbH{&K~A-sn)14)$22n;bWtJQa^rIohsTH47}Yh$ zTtbqyy#2TMmf8pG?$_Hb(rJi+susKFpq$NEv<LfX;OmI!M~%weVhUG3>k9@I?1$w- zWDqRO-J5wu#J8OV5ku&LyyS^>3Gqqa&LyuFqQ@Hjy*1Ng-ikZ6GOnqREV3^TS4Xy` zWaDz`at=c$XHEAH4y$WAfQ#Z<uVgAXc&$hnv+g>be2*p_?A_!Hl9&8jk|-mB8&EY; zQI%f@(ZCJ)xQnw%-@~%SI9-j#)Npp(ESF)uXC&>sfihBQvaTXXKP$+wDb5Zaz;p}{ z<+|)xRjLzbve>_5-gKVQT~C5&kgDnH2V~HOw(PuLNQQH)2(cC?E}4*s_@v0-H`XgR zq~OJt166&Zba8HurQQ^%Ut4(2t&e`FOu0h~;utn_bgD?2q`S$vA>VF^x5YQr8IiMC zMqA5zA>Okczi0-D<*Odlt&ZU!C_G2*(AG!XkGtLPZ16_TLl{xU@j^JB_RM7Rot>)g zJFfulUjXK1>YsA^sxO@{wCjr#X7irmwMi)jv!P%sNjg1iz3u~DEzZ&Je<Fjtp|6kZ zhmUl>Yvg|)I%trK8&tE2h2?Feuz0~Cz|@|0Yer$7?B}u39>5qGlxQVRKQDq&wbS0x zy`LH-d+)C6%bvSiwX=4YyhJ-rbY3nTic3h4%v34&Cp>*yG%o+5G4{FRn%GN9?3hWO zRX3JWqO)}cSm$2B?5<u@xp3Aox4r_EdHXh>gxn;XT<xD{-=EU|AsnxNmj9m$4*mTf zmYDzLadtEpd%YiJ$h-R^E)*YRzWUbs#dqKbIRZT**)qPj3E_KgCCXtfG6vyDy=1_X zJ_2WQTW4k&s1`hT01izA;CEo1KMiI=s|5}w&Fn2|l$=Yo!1PgDO=Onhg9K*-x~V;o zVWUmk=m*j2%5S0q^Q6jgv1MZv@T@soh1)E5boNf&2QR;hO=o02<PbTEQz4j2sLxGn z826=p%BQ_a!{JCy=?jXQRHepQhCGw$OE3GDT3LdfgWu@DbmvvbR(R1~$||!Y3%3}Z z;#dbdSyz@oI-c@xE>9TQfZ=#mXsWwYZcCA+`_2UB`{YXirC(RNWiNl^w63kuYKhT| z%<7i~Tl~us8@ItHYT%b+M6G*6%qXc2x^d~Uff~xQqwP3jlZy9laR~#TIFGp%iCJ{< z;E4kOp5b%`3pqcxrY6I&1i0}oO0IGw+`W`-m!7uz3k#7m6W_1^QS~kx57Bngn{)On z)UYgX=S2t<`=+@^QE9*muVM1C=W#1wq|03au!i0c>j0q9mxJRqb?TosgK1PF-E8Tk z%RQu;zHOV;wtU}|s4fYJZL;(nv_$0k0!`I5WNkY}=tZzqp?dhD;#}%WJc+PZ-N;Kt zW*FbLE!k}9dTIwucsS4fnH9gE@r6$Y@jd?;mAcVF7PnW6Ox%|TlDjUMHCKae6WYt} znV`<aTv@(eqzcAAN;YY(ysk8trU=s31D8Xsl%LwTG6IxcmyX(z^;v4r03ca2$&~KC z8JEo}z^Y?;%*@DjSJZRucDvMx;i}f1R>`fS=7eH2j=cOyK%>j%QXeGRoIkD%zyuj+ zv?T&~IquFJAjb-y+B|hnw#>i{!3w9|u_x1<7wH{K=1Ly%Dj6MTePGL4DoK<SO(Geo zcM#9G-Bmc(ZO|`jfQzqIgqNLxKBY1c4x1W}r@Bw%4in79SbMZ<CkoBAG@LRKRO~#^ zkV1fE|IedaGiHi#?nXMRnEW4Qovw0bkH=&HLE2kI!EHV_;&5F_x1C|zDvp6K7i*Z@ zdH|hnRhA{qX}%GhE~w*0XRKzO@#f&SMcYr${<$LkJ@wxjaQE*Ur{N$_7=IdU|F&1K zY97<Cc*CqMrzPl89o(0WX>sR>?uhGz$F4pyBHp!S2kd`i@77GOagePF>;F*?^@slk z^`t@sFQirVtAtr|iN3c=mo6|C(^;(X?Y=8xk{JnGXfw>CAKgJvC8({gi=Z<y#)l~` z1C}+z@QFMt{h_OR3*C}^N<AltmLrTEp@T1cA}@3?&$S1Kj-p3_VY`J{RGZS@!=I_$ z`H$)*X^`gNUo?tSk#hUv19G2dF}<<VBlq&HW7=H`eSO$91N0q*8nW>)xgK+tu(;-h zSCfIax9<#k0IyIZ63qx1rCjqHq1Dd;M!buq2*gy#QwkSkJ1n8wO~|`@8S|T(r3=*e zb3@!&;p)IL*+yII8~!&Yt&3HA=`+jFExS4i*!s!*mk_}`12umUw}L)Fd$`PF6<|zz zmU!0qq1}D$wBsm@OQLXsLx=L+SnIwxsaIb#CW^zK0v~8cg{vS+(VdgB-b-yRPmp{$ z;J{6v=#b5TV2(GL({^I<eoT^a)<1=91%qtI)Y+|XJY7I>O>f>H*%V8G!_)Gus*`gw z?wp{O!Akmd+MPp<nd_NhEDBzBUw+ziA&>PpP4|nw&<?(8ywD_GSBOUQsmK2mj<Jd8 zU6oauH72TB2s)&tJa|FkxJQNkr-+ui&%JG~dvaj$bt52`t6?dkCEwGW+u2@7OL>~D z-Tr*Fk(}Cv)(5N8!$4Lk`1pOWO11PgZNrPGHJ9un+^hYO<X72A6S=$R+LpM#aUk<q zwBQP_I;DEVj$`7M>Qk}Bo9f20N&@HXNI^9i%^{mPLpA-SGays$^v`|f*XrfbER#+> z!>?V|Jl*aRfaWDFIPxTS-S&hg?i*S|O@^Xf*D4O)G$@2-ylDK*`<+*X=w~(u6`;Mr z1%0x+Va6b4E%S8c(faJ?5s^KM_7l<B6b`dnApBNl0P?nY2&QD}>BDEX_vxnzs_hb1 z#vqsO)JS_jDkJal@Blh<kK_3a_A#uywI^hvXvspNZkzZdYlGp=Xn8b2UxK6EczSQc zsGROqU(vN!J*CA1xi==?3xWj_?9~eDGP25^%a1N12BZN?j~XwSi7pGLg{*`u(T%0U z)WpN3Zd)?nk~u=3z7XWZ<O--M^)iUK-mHf|Tr!&<M#A{l`ak+=_Y&V9+9hXLRs{~W zvJnr~=o_jCvChUWPDYwmDS}7kylPQtWjli@j|EHvw}M{gJ>eopu!9}k?^FUujutt0 z<}k=;V!F%Jf$Cjw`t_2TejfvHOV6|H^5i{xy1=)+mg@87(y-BKcjq476(b1a{$Vk? z0y~AG`JtuJLv8w9o$x{6Pg((L(||5OR>Yd2oYf1fJ(3z{goVQj9+;Dxlav`AgI`i! zYEtDjK=#$yLkJ_)PQ7oo0v?&g5*R;obL=w5jvhK)nz&XYfhepP?Vi387wx<rv-_he zlJ{9YY{9ASTkpMDjym{p7GOeW+`n6Z_R@|*Hg8*oeGMkEd1-yH@z!i49omK8{#>%9 zcADs^c4tSUBV=LlGTRftP}(VM`Di-g+g4e2iPbD+ngD}q7D2$*>8H0l7JWV-624a8 zq~J^yQd8eu#zL#~5$;U3UZ*9)md}WhZ9F5jqjF*_#V;Cv{=maV25mT%79(~5n24dA zO2L=DK`lLjzM~@`Iq%?~rO|S`H8HGwqRt%b*9NQcFn$cW4J6;mjDe3mC=Kt<&&#T? zl2Go3>hXwZcI-oZj#pO_KEhT3ZjZ-P)jkdHEj{9|l{_MTBh){jI%30uk9>HXJ~a7& z+HU3<?T;F;48sC$#%m1oPme5=;1jUK+=qwe+4Y*~1G!k*7ge9K939Q==fv1~EbK1Y zB)`|Icp%>Gs&dYWt*k7*dqlpnQ4pd(B!cq6>f?WMUq`Sm22}zoho;_gJ}ZMwm;Mar z37#r^H^zm@YDEJsBSrV$Y&gkGT|4=l7>OVKAYUKcG4O)Wn(NEQZ%U1|0~nv$DE%yz zq)aqgn>_o~AHGbN+sb9xUfD=oABm}Iq3M5erDc7RkOcfT`e1ZmBi2!D45hOm*1}x; zR%;|mhqIH{<mP^=YEAW5-!&BIdeFgin7}3l$u&keV(EWINY!}xAg)`|tjsm|$4FJ1 zK@ERmhljsSIMhT+?A@jK0CF1{sDVa;E8a0NmNhqQBz-Dn?!8M2(p||ZE$h`IUz{C{ zHv`VI4u$LS$PGa40L*leQZN^dqxzt5D>yK?59oWH(4Pcxf>jilNhcpXHi$EMGOxw{ zF`s8W1pjEg-gD`^W1>+_lC$Af$;dE3o|YSMw=d)6%Al`W^&y8)DtKK~16b(PtN&Wt z=fW27AdpHhH-l)^O&2t8uJ@wQ_Eo8}*Ia+GeXOlgX%4hIE7eewlmHJ5*~1bL$DP7h zEIK~-^a{PKHyc|D=DU3bV4>SItMd~3Gb!KQb1lyK2SXes!<Tqmu8!ebvwC*!y7Hgf zz9gdZ?P@}xA1q0?!8gO6@Vr{HVmS2|jRxgNfr^5tz&&y>Yd*VPRl*WDQ-+!mJ96R< zcCs?utE$?;7>3e)SLz7R!I~qWe%m-IOwuQFt}p%(S*)_3NN}$U@9o6XP3MccMzN`5 zdt0>VE(u%0`R;NVhE$~sM#Tto>#MLEpZhAdbV*LSurX!(XXEem`sjt9c?+9b?NmJR z6T^GAwauBhl-aPEhO{}J=&S^PSikN?RNXm%if6REQX8&gFVQCvD>MZ4_s0bhg5Z11 zZ<mz&%0ni3wu?!UIjP;Y1YLP0`N=YTIl)jcgR~V<XK?vr4ng_mdo%X8Epo52BP@*| z2sjRNZ@Y2i!uZUabpsynTQCj62+LE1c^HxHgu#rgkP=Xgkoy3Nsp`r-em%Px-76PA z;Ini-sF*1Mvvs8EyMobA^4b2#ENgT<{Z7%P+d8H>fC!^YWacYX)<P0&0rwG1h= z8Ok009oyHe<IO|(BX8E49RBf|juUxTZZO3k;OK{0v$pV#yZvobailpXRi+c(@FN$b zT6g=733N1^tRn*IP9zwYJNrRlSV6yvOKt1<;I@}|z)Lz_VSyfZ1I;B6xM(h)C&sA4 zx9dY)!wYA=*kVZa%Byz(ma8m638B8n7%Gbbb&ZFA{o~Z8*Ltv~uzK|u%{99GHG`?# z<B?sY9b4tYzvrL7=5m5g?qKx_pdCGGG>l?wUYDDSh_KouT2)W;%^%`xe%54QclJzI zcY8fxqb7|TQbH!Z^7<1ai4b(POL)z(lGpN7B19sku%^SLTGPk@e0|T`*rE3%BB^ff zzZyr3Pm=tPe*V#4Dzx?UI(CI@yAtKr45y@{5GlhGEVOC=7AUf)o*@@H@CS1LKX3Ry zQeejZ&I2}2$@Qgg_=gL3Ta^)ry^wWIbx-}}2guidEiRx~^NYrBpt(LceYdSdiQPxx zF?s#?JY~6H-A_>eO8H+)|3|<5hv?M)T$z9ZO2Kca!<<SGxxpU!VMac1VD<<d=_BCF z6^LwOef^KJrw+@;Z2KkCYy-nai_cJ5NJR7pS2PR+pFHUy_&AIfC7A`XY4F0J2%(xL z%z=kbMec}K(=?@A1DT-iFo`W?b<Y+oiKshT%otnl#HK$U>VT#$g>PmT=QkoXARuzi z)Mi_|(eLe@{?+#nb;tj1$5R@b>$rt1PHE*wnzr)fxNnyMJ!%aZlhW+8T|JUk@!(=+ zHnM|}hpL)#YxY=^zi1df*)6Bo*0>4vgf+vx7(A#cqAdko`7$!IEf>+g{~4Yc(33hZ z0Y@y6eW2>jS+V2Lq*Sf5bM)`K3`yf7FBJKBm~M}6EeG7#7}sf6hu(>(1RK2VC>yCG zp)c#Bm>j2ps8SdZYZ_~5pPuj2rLJyA_tVqMcfKRjczrEUHdM=N!_KOOA`D}_^Nl`^ z!BAZtpV(&O=vJ%`i27>Pw=pm<5PLz)RE@pT5w-L2Es}pikyo!gURP36yKcso$Fa=h zDJg*6You^x(${QE-Ch4o`s}i?_PBQ3bH*Dx+H7NCBYUeVk=8MN5?{~-VsVZ$1eV7H z7RPDcnCho`=)(lv2R*vAAt4hJ1ZjN=Y~Wol1yu891}I@RFMO|)y8fm6OYpViv5)75 z@j@59+<V4^a_laQ776J0US%q-e7cG`gyAx8+e)?Urk4{@W|S@1IFv4UGn(@*09xtE zjz!fOs93nqjhPIiVprA$pWP8Z-_Gtj5y0h=Jp%5um$fO@)2vh)cIWl5sU;Ob^YvH6 zz#?qr>I+Zj?+u!3PdyvRKk&~d8JrTs`$2;h((9d_36&W8`wew)#je`W@kmBKdyWQn ze#>~=|Ha;SKsA-^d!vpzjtYYaNLT4ydWTUd(uWdSC`xY$QbI2?A|PE_=r95SDFFeK zKp-&EJ5rJWfkX&Jy7UfToO0*Rym{;1yVm#a{qFnjSy?B0pI!cE@3Z&W`~2Ha+xmeZ z#UpiEbIsbJmucZAy!1qwOTJLx(MnS2oRYEAb;?deggwtInQ`W5&tS78-n_yay0XbP zS!>lY_x@!<8mviPtG+`#s5Yq5jzBcQR(JGZ72t3vWleRc1r)4zOz>nCwl06FQRkUl zAK>t?vrd*#tH{k|lb)|o)PfdZHH5sZ6uNW*$N(#DfB>!uF}ga@WRAe$+QH7{&p}Oj zJ3EwRXGP+>_Ri4&^6*^mL>{T-Wb-tsS?#rYs{dY&SxXnz?Q2*PbNb8r3r#1xBnS%d zoVqYM#8ncOwrW_q?~AWVLsI}JY-qo09~{+(Dv2s$D#Ic+tcSKy=*Kg@#8v<~IFoe1 zlD*<~h2yy^@>ZLB_*@0Nt7vYwy~ooW*}ra*s)dq?4Q!5vD7>EX0FCzR#kJ`J%60rh zsOh3nEVb!_bZpjvJKizv(}!U`b*6Fq#%P&>5y)mB-n8o#`#h9~AlS~f`UQfz$u9_a zgeN|uWr~5Uz*DQWDPvvIdHE)&!4j)DR6C+_ft6IRr0T%7H}@`tZFRM0a-P=*lC_Y~ zH)s8AzeB#{@FD(gb`<W`;ebg&Z-@G9a?&U0J945BdYxT?zQfbP3=!0ghARYNN2FKP z;aRpBJ3AAdVgRFD@2u{us|gl@vGVhRh8twSG&<4x;Vu!+(rRm%sMg!Cip0)2+E@W# zUi_UtHF*jL7bh{E7QV0H*u4P>35lF_uNN;Sr!=C{FM6L*J!&qQM=j6|P|r$D?CRfN zX@A>cgTB%Jp<*N>;k}#aikJF%tK|w9(q*ZR6()6e)_yn=lWiJ36(VAgR;EzPWl`pW zdy0?S^n2Yge_TbXj<wy@(_Mb_acn+;qwA5%(^zStTea$Y)I^N$%r*hxj79rd7o<;t zpynVqi{Vtb%dC-pDxusXP%Y<OZ3#tiAZ|XXQhXZKJ+mod?DgPACqo-Z!$7owxsZBu zm)?PEU?G08FtSZFu-}p6mCsS?x@$YaVzY8i)>Ue0IR(uso}K2}X+*FDsxJ!LbgVwC z^3h9gBYz69DzDBs*1y)l$sf|y+5QH(G+A4sJz3bT8LbghwtBQ6Lpjaiyr$I{0NQKA zcmMz^g+-PEXla?$=drTCElj_xP+qZ>PVepvioP*MO}~DS!)re@ZHK|Zct7fXdia!M zg_eFF{4}3s+)vRFsN|Y|p<=e;hhIwm{Pz#xH2tpR=ZLpQh5kF6(W^6s^`RP?H=hLE zO=M;j*{S~|X<A75B=ad~KR)kNUfN)gWgM_?_aQ1)$(1dW%l^OAL%Hxj?;NG0KE{(% zE~@dtHc0DI$ZUBp0Da_PfF6VDUk1gO+WHX!NBzXpurO>5iJGuXAi{*v*)kt%quPLF zycVk&#o`OG$Z`U)CweMxvcbI1u5t=6g)nwVqwgCGH$?je?Py>Y#vBnp`3U?6+@t(i zXLxRvo2r5Ncl=w#Zk-G)@ZniJ%uBcus)_Pj*tDL<b`IrgMV>kdJWt9qDta#mo=8ps zVi4fP+HAof8BnmFv8CW4sz9Nq4=vnOFo6NdG`V!VKBMBcWo`$BR1@19AHRFFE_#!6 zrRzXO<~wqe6~o&CYChtFHZVBedE#xA?GqQh++5lH!I7(p?y{>LmZ9bqH<EiDn2;c7 zvxmeRU$E<Hw(MR2*zMj>oMm8DIR|^V@2a_^1A9MOdMrFh5Fpa1yzyTf_Wy;>%bzqm z;^X)UosyTb;&O2FtY%H;PJ=aX_mve0U_V6AI_od0od31tFIWEOCD;Eg>0c569K&jd zyoa}rgP2e6)h)R{wQ}8y-qgOhR+-519;FGh_<aTE3{G5*)+!B;)v5<yPWs5uZj0n| z%%ysd8-3Uow*Ka4h1#ErT;jbkFV|tQ5%eCzf1JeR=nI4F@uk>%>ezm@%sRZCf^1(} zqX(91yM;8d;Y=|^I0z*oL94dxALP@vY*8zz7gC>%avLZ1)RCZ*N9H;k)!;ILdgHk? z$O8LyEq=oKi1J>R?ayduDrdug*<t^?3lynt>0~o?dh7W5eck)v)n=R#UsO`(rls5M z1Q)T3Di`k!ncR3!(L)@5+My+)85=ufb+H1&ZP>I7reK@6*oaBc<#@=HIyKf!_cW`M zgY1K=r*rfGUDoN@c6Skbw`Dh1+rr0%85$_y4LH4SLE)E%!bNTXzF`_s082`lu^vw# z*0}KUfbXu@%^A*=`kHmOrmQla$z}BklZ5F#3E8cIe&LIleL|ji|Gj#**ByZPZC$8o z_-v`n{k}++JUfKBlRwUg$u3*O;G&?Hc0mD{MW6wYWTgk8Y=sTC=;)YQXO-Wah*>}k zW{#DU-D*Wf$1AT?+et$&rpZSFIXg{q629xIF8NkYM=;<^ylI<u+ibaELUyUCkfm7` zatx7bfF?Ru8G8Gd<vMpWerz8uCZ--<ki*jfHI-`LAS(mFo>_xx4+RrvJdqu0u#1WJ z$p(Xretd}d4Bo(j+<HSox>Y*}!L_0_L7GSJEQn`8o{WXFyrjAwlE0*Dgc#>#dW(Q! z#tlk=kZ6qs3Z!JFxE|psXt#LeZhX>%UXOKCWGXTjQ<5_;qv&ws;JhD<Q70#UibM0$ z)fdK)DKud{mV8?KeYIPa$xfAd&poqQSLz&MK^nZL6trZLw*y{*@#|UaY;~9GOR8|$ zXj*58(a;5te8;K|@PQi=+*99AEP-;JVQG3xrEF5?DLy_+K_ms>FdAt!4y0f~n#2bl z%wkKjILwzpR|>X=P4B#xY%0b+BIcG_CLr;$q1V#7%|W|nx!vTiH+-=Q!iGzRxw#Z% zkuxgC5~j@D`ELoAqh3-`36|ELFo)8EtRa2gCSh^}K8arG{-a)*q4*rT@@YBsu8^1I z>GlG`@~7N5)j`@`uk58wb#X$aVUxo1Y_xm)q8UlZs*E4|H0!RD)U%qE=9@o?1&7NF z)R?i#Tx*-*m}OEoPwjp4U8h(VA96_{IWs3K)vChX*fPkt(!c?4*p^a5kyVvy`DW~` zc^eHTH#ShDt#{Dk>=%5979J)~6_^8T6?5mWP3p{gU)!V=G;BH!VL<WTJP`t0wS#M9 zZXxVpHKD7O9N0KR@M>)uWGJ%4dVb>Q+fL-{(n!5))7PK!Rku&c0~{S|%H$;qIu5q% zk<NgYKz3i1a-aPT5Aglm`Q+%Lh#EQ8C3wZUze~}0xzDgGmdoOY7-^Tasj?k!tDw;l z9RsF^%ifd$^2b9?4KMNG<wE+H0Pxf39X+}l=TFtdWy6$hp8Y#@G`nBM9Lvb+$FDTx zNeJg5^uNb>nf$VY_@$zY+86<v37^9K-TM^u%Ia{pg1xDY8@78!(-z;wr~Z-JALDW; z9Pfv!rHdN|lg*q(G50V@8u8SOfs^~pf<vqOEc;5w>VsiyEPM;`D`m%GpB}d7A*lP3 z#s65%=lFk+FaNApe!KR!b~pdl$d@TuJCA>B>aU^mudU<rha~Wv<N;LgscN=R7!WZN z{4%c-U=uZrScLz6B>!6KumArEehmJa+@FLm8k}(16okD>?5wULUri|Pyojsv&*yq$ zz4UPdbJZsc@Wby5(R1MPo0jH8+kmVG*E=72ay(evI5pQ$N>iqJfStYe<8Qf7##U-w znEPuVw6B<)x9&<$7j*S4E>C;)Y5{~nxC6AS9>nt`BN1q*)eJC10W)E^+&J@eXS^8O zQ!E80;Nuz$=<({rQy;yRT?fLz9oIRjexHtjArqr%Y%x4<$6)<n*1qC1y>n+Hf7#gl zyR#0dRIU|S+Rxg@35|MRdEpXCJu_F}z%27JE;a5YxKLwbSct8-*0h2hVX+NW1B&RX zu2GN+KJRH1D25+~?3O+@bE5kFLo$Qli18a4ec5@PM~TmGhzJ~gIe44UP>8RV{X!_b zc<6v#8DVU0VW&4GnG}cK@#vhTwVtmq8aL}OGWPOM3=C0*eg)T+fO~Wur5ATvvx|Et z9f1T9ET!%2_NvWBjNLxeqmW>MfJ-*4H5CqaJ4MH2|LkI}<Ur!G@pqxILJ<XTF#^(F zSu*nIGI$>-{%xI+rCv92Eh)Z_>axmVCgj39d1p^ku34OCWWT%ig#EX-)LFj2{|FWC z37tPs$ukiUUQ=I9Eer<V;h`0oQV23h6xC$dGmu^`heTTq#6T8!nM+J0g5M35Qyh_E z%c%&PF0NOu3)V;)H{EQNZ+A&OlI<Y1tw`5DsEd4<XpgrWtIe7`8K4zPfnJqZuPM8N z@36p@LYmwP4TIXH+!U1Uyr|9@^rZ|Z#eBc?;3!&(Ea3Oi41B-5lL=IY1n*8onMaz> zWUU$5zioTjiI3jBhXePftKTiRx;>*L&u@A~)~JU!J9!aOOGx41A90uf#<g@&UHHHr z2$7oM(9@x=5935WG?C*<VHEk4s}_r`SeqErLZPFvicU8Qk@!Lu*FD2_2QGTM8^ony ztmOm@XYME9Tvj?pmQqu|cDHYr80KqU5PCi+$EcJ2?1XQu|6Z3Eo9VUkBJb5z=6>H{ zv1HJRYj>J=I`s&WK$yGXZqQ*Tf^NTSXH%!!lScNV^`N1s!{I||tes+<%jU<&9}pGY z$ULz#)cNgiRoJ9P8LDx&V(4q6&(m^ym~ZW*XmuW3QoFZdD#4^|AnL_H+|)c=V@Eel z0MtZa$l<K4<+3@8odJkemP?Es-z4es<^Q_)Q_V424nBLBXY;t!qxIVeS-tMUmd+r! zmj3(f50M{K#_kG!nw(aasaf;yLk41%FPnFpfAiZ5gc70`*?z6!GMq>rzkEhj({a5r zmgLu_89SvP;d);BZ@ymVNoM)anqM=vYj_<eB=fcGs<BJTS}l8jaIVroeen3Ox51)x z?BiaTCsR}Ysq-BTL*S@__@h4>v;TBM>bK6Q%ICv2r1SgVkD21&`=!d2Rag0Jy(p=d znkGo~MBwp_lC4s<#AhnwA~Z+a!8h=W`mgqaRrff~sLY<IJmU=8?We19;V57{qiQzY zfYrA8DmCB8f5zlR!Fi(`=i<F@&Zv9S_(y!4NWFH{Z3-=i>=Fwh)k1mH1Qx@#b>z<L zH3z|R?Q(}EHWVI((E>uGJ%*fUUZ5!4Yl4`L!yqHb6opBnK&RIG)@F2Cq01XwU-t?K zX69dl`K;_MB?b+?>399%Gck(XOGk+!=6e;JtHQoQ*a-PPTUQY8yumr0TBlcB#pJ$a z^7`j|fB(5OafcW-$$84fqED=9);_9QHyMy}{qE-qzUG=y0*a+7ZL!PLT#2kX<%pO* z(7(*w`60MDtlg;352HD=cO<m35riS-u3NpSe=%2KhJsqg*B6E!uUS?p5#$?d2o1_a z11afxg>->IrNDx!%i6kfVME?~$IWkkod1c87}Mp$R+(d3ZVLX68^g!-0tS_43j9tK z-PoR@R@0Sl5c+F=(P3Yd950nTnfBY&jypY3`9dm7^kYaB?Hj$iF-j#D7>-VCC=Q0B z5vSl{3wi7yedp5Rr=od`+0PC6-MNgh&}my|r)z%;zDe;0#M8@xTcs?XywzCK>1}x6 zUqKW6uGn8i{x;0>Z<#MXLWQlP{ZSiqc?a}etsYJvt*ljEv4y0ui^5!67#{zY^B)ME zGY->a{FwjIZezu5zlB^{{SH!2<n0z>M57fw9!&A1Isd-0zaI+tR*rVY0+U<&`h)F~ zO;v}?i8TCVfo@W}*bBi5Z*7WhC1ZIV01Oj`@9z7VTki!Tkdt+NYK-vd)e$<lYu}LE z?mT#^$|*>I918Sab&%+2N53wcGlBx}IsQ_7B_7Q>M?{zCufF?ye`lkA*#Z39vo<Kr zne{N#i#ZltvSC>AaGDWV&fT6+?#RI3-ANWIkY*7aFAS;HshQt{nT5nBNSfB`3-aX- zBt0Oc*lxt*Cts=M=n|B47W5_SOu<=u>rbbJ@KrXdX>QkR#V&`K$O^~qH)%g6@9Ar< zDRO@80x>SDF}zZeveI{7wpg+(mRA}t+-WAQg<CBmz&t?N0;1FFyE|ZS?Jq{W;*VS) zQ4t{_fgo?)x00%Qi-|))dV07n!P0|EjbL<^p+Qixhkd9_TH{Ng^}Il1Ak5t{{0e|8 zy|!j~ybv<g<6Smoyw7fnc4}EYuT_NBtcZ!Oi0K|H(}IPRag}KSwMPu3gy0~I!YT!V zb{GM3F=9zsNC0f;Yk2EFn#&2ARc6g|gHx>K8*mKDL9~KQ!e6h-eQ6oao)ZsfjFX&w zI9eJg2n*qdATZn@gNp#IGb%9&odp&m&s{rym%NKUgqcL$#;bfk?l(vDyc^Hc>gabG z2LqB+dTMoW4`^$VPXXEKejlXN;#f@Agq{0i9o=7IdX^^A<Ip|)^JQh_0XN$f^8Hz@ zzoGKJ`>-%wPg5B<-oKCo?i`)vmf-R=Ou@~{#h8`n{_s2sUNH_v414c>sFVQ07B%n< z^%2e$X^JPimWL?0Dy2XK#Cwcft{1R7B_k`Rd}WSgG;rmULpb4pqpR;SZTAFn>q|Gj z01ii>qefdbFv|dmY!`<15Tt_(0J<`XEK-RG{q0T$!!)=Y#Xki&D!Pm_=)06$>%$U= zL2^*#q09y&_h?o$Veeb7<33W-r&U4+PgeTvoi^=md2QD|M=dG&-8%b$W1JV%3iJ_q z-+I+;zP{E8G*PJRbSrClT-80K^~ZG$8MVc@Rb{=c5tWREGpc)zHg{5V=M(_ua#N;> z4(wMgCe~z_dn~)P-2<E*=;|4UGX-K$Wts)G&KWzyHOPlSELI`HP0&OIVFp`iEYd`^ zrq>8b5Tg8QCd?h6hERe7a-@a;LguC-2`+j)hWT$EQ0!NJ_&llqaQsId`tSGF@c*Pb z^dFw*e;1_}J8c*|dLGsm?sA0PTMUDoERA>k`YnC_i=5_)V)008n|He^_i&tT8^QWA zWIMCty^J+~&4bYO%43lQ&`A?x5N2zN;LCXLI6jt9VlWLQH3wa(v@8@kqcX?~l9_|{ z&AWm((?yJ+7HMkA?9i;*Gpa&|^#GM8-~Y^>w-u+^iS*dNt9?f0juRdtsS1UK7Lp%Q z^H#6<rv=~m-Zg)6{l@7P{R6CCYs>mdI@8Hv=$CGiHt&zDIUnbGzM-`4lJMSP6J@tY z=XN}$^A=K`CzyyGnbzzN{G9lQ<D9Xm`ryaR<)n=T;M^J2U0tXOd}2fSk-lA7RqLX~ zHtuh4$NmWrdw;m;KSs~LK1~)KQhDD=9>Z@$bQ;+`TQ+UfPc{>U`1lhe(7FQee_!IO z#ASUF#4CM9I3YNa{HiYTmCybel~7?`PyXdsuA7%0|CT*;#n=38yyN&Q+g-tPqW0Ro zX$S=)K+pU4TS(#rQUHd3rJkY*w3yNs*${5ZC9d*Ah@P^6D<iIRM$9PCa);IHnB_u` zFnM0zAo10OuMu8Z^JqK8kLCQImPSkl17GhQZ;G4zMDGmym#xG<kC~uL3>hCh71&uw zTBu?|hpvHbp2Y3<#<}t2wcqxd&xjqr(&*{Gm@sd1F4p17(D7H%1k!^SCJ6LtZzbxm zLBYUr_v*`fO9T1w;xadixszmHhwjnpJS6Y5b3HID%(vv@qt^GgZ2S^sU?~M6dvwd| z>_jK?^_9@QlD$3G(C1O#JP9Ex691F-zoK8bo8oq(XFKxV9gvbYoe~MWiA)TOvm+td z=VDfZU7gsxmXv+(8XTQb8BK|IC<U0%>K7>@Oc4q$5FCYd;AY+9-H8X676@bMRgIvX zEVRaMx&~0M+ILk>zs<+L4$bLH$_w~>Sa7WwX~<8!wawlG-M|99T%`odcOjc1B29DL z^W4>MlOqPWnhUJ7tdctW#<fiH<p>}IGS)vEhcr@<D{+?vfMZY{cxL|h3Z;oxCIz-& zrhuH53)k&o%MYBJH1F;VFuW6V3yk3niThz!uQDsy&nCB^>0N;f!MZmUnXja^*g0fs zRp_A@cwAxR_<D)^v~++*(>q2+kfSRvi+Lg4tk2cz#e9yxSHS^TZ5sC$FxM{?YLr)& zR%SSu^Po=EbsO$RF?*N-@#kgNS?rmn?h(ZsSjaLvB`~Hd6)wj0o+G^3tdPJVH-mJy zN0BM1@n{0UY^jG-d&fr$UlB3DuVq&D$Yg2CK@g~Ly88%451}^_kw5T=j%@pWyGGtp z2N2J7JHQ}jXbMptTY?a|J(C21p{BHLf^JO&uo=U#$kY;OVT|vTepoH??N%3_D5qtf znXiS1Sz7h4+LmyM%L}`v8SaA=+pk)f^o(n}d+J0<f8Vs62E)Re=x@Rl5bGwSAXF!( zO~67btc>;0^w_4)#G9ovk8#V!XP^*-<7Ls&I3HQ<WR>8dH?Yf*y~-pB6pFcNNLX`H z3&O08mQL=CxZ0IvL?sw17>M?vOa>Y(6W6O}7}a!AOklS$6ob0pSCEX_I1{DN)lw}U z<kS3HAA~T*l^gC&iPlo;OM7mn3<L{Oi)-r;)|7p3zJEa>1)aWWQ*2r!HE@+LT{19r zdh%ObO*5sNIw)>Bx`ARANbJf@bYM3W9-nDDEm&ET7bKoni$Y->a1^Zh$O=%5{FH?8 z-ekRC8pJ47d3}arjWog-TQ%-b4{pex1NVaGyXnQ(G<y(zw<}W6ha!t6Sxv&vMe6;r ze#QmRVMk?$2}nuf3<iZ;1lxH`j?<Ov2MsUiX7Q7dR_oC(V!n$_2!9rr7!mQpenOgu zojb*OtgdU`c`RI-c4%c-t&m6eTRj4url4?5uP{s)#;^5ldMHKY-o^gcli)Am%hK{K z%kC6!{XX6Ejy2ef(1&lN8JtSEUR5hf+>C`tCCwU^^{NWw1gjcxVSNs!7C9lK6elnc z7f{$3Ukg@OHpaEgtC+iGMTd|PzqIl+s?^Eslwm_bZNpmPmE#%J*fq%nYW!DjnaxH{ zc7x(KvoL|1$<%j%OLF#hsZCXa9#L*-rF!cgL8KL!>6;87-nF6Eh<PO6ZMa>H@Yd+& zl3piP`FC&sIID9Jd;VL2mWOxOJ(Zg_e!p<|Tw<Ie_b<x-C+**)U$(LpPl;^i=+_IZ zd>yr?i8<lq4uw|%Qc)}8*Gh}jTl;`=iQb~;Tl8_h-OG*UUqWehEQs?v$7=jjNDOi~ zb(Oz$qV<VweetT4uJPQ&cC}UI++=}sMvrN)l)!g?8Rvf<xR4!U8~WAh4>t5{y_@on z3a^ge^nX9?2Os>t0K-oDzB!!K=DxQvRFmLO?5S$y_(IWq`P-Fl&f9-d+qqkIr&XC} zRBaPsG7q2FSfFN#4$+N5ucALQXqk`PLKgx&K569-6!|KDc}8Vlr?NiuN!tdd95uB; zHyL*F<oW5B@n=*7Nj*$a=nI?E6Ppg`;PtWHW3A9H9lA2V`%LkYRG(2aQ=ifdW1;J} z66@U77H~WvFdo-d<FDWj(xz)7;0o(gE8!w==)Nz>nz+Lc8Xa#|%Tc~NWgw4tZx>5f zv_e=Dca14Bs=0{)J2u~?%GI($q1Tm;!OUqRwWKnob>&v6vY&`ixY_r%HBKW%e2#-^ zJ=%9Kfh4P}3fmGR4X5R^8Xao;{|;M&&o}+s@i%cnUhKGce7o1@Pwe7h?%fY%jG9wq zb>sMclj0eIUSEv3!y8LlsjY2a+Y9x>__oY*LaS|w=3dhC@kd+rUX2u#xXoVh%29yo z=)~-rWx3+cQcNS8uq5UCL~W3?dD?p6XGb7y_8iOCNS{>GPsb~Og-tKaPERyCB3bqA zCN~83xzA%&>WSRPH}bd2a-$+h<02AA+s9wyoSR?mHmbjqCqJgN=NfQ*Cs_292Y-Oh zbY3=9H03BSY5AX$xeCfqknfh0g2Txi3{0N28t$MisN1P&i_?f%C9=bzCP4aI1NkEv zt>hcRGt7-oJEY8czmzW9GY5hU++5aiZ($xknyS%bdvsKF<v@>{>2<}*nFc^1zkfTB zf7x#L{%5=Wzx`7~*?oqt=~Yhm^1=@Rgl>`ChVmD(B7&WbdxqL_-H&UpT$796I6R|r z#WCDpvr>tkDV6q963jFklHSp%ZL8@4hG3g(GRuqGbLdS#lQHwIgM;jmvRTU*daO>H zef_%%!`~+SKN1p{UgUBKHC#9d(}}O`pq6nbYH4qvUS@&`-JVw7@%;n)40g$Ze%#Lz z^8&80@x7(fNy7;>*iTx<q?LFb!D|l3fo^Yp#De+j)p`mt%5soLD~vN0i&=Jxu;|?_ z`N1%|J&a0ogV8qE(~s9g8#=Rx=Y|-AqIdQZJtQjjc2$B#j*bv24<7z-uW6m#L-Rjr z{~P)x%cfY>L$RI_?+x<aOF6zi8GOHOm+>ao8xG-&A01q0bV@vn4}+Ma6Ca9piRIYh zy^Q**9i}ECfa8$26eqSsSQ@&%N-f)ruNqueW?ON}_?6TWMhdIb@wCpR;;-bn|6IM; ze+8iZKQfgsHRq2`R0$$ZGS%PW54e+Kh5{6LKTUesj?=GNcS={Bj^D!H^oO&SxTe<Y z?Tj`}SRF~iTzUk`WOOng(q4V_7A!L#lCT)Be_<h*LvG0m@<Q#PS#;(gOk(!Q`;B87 z_S1zRR0FA@wibzj2Occ+Y@~WWbh-WP`nPK3#)j_WHJU$6p|6bnWZugY!&i_itjm?G zHvt48hoJ<J0{=QYyUpmQf22i!BQG^*CwgD-@cUq6KhdtmyK$oS2IPkkM3nNSnC+m@ zOQ$qpw6&y8^&UBLkU;ab;IB8F;16rL;=cQnYQK1rc-Z7bVZyo`PhF1)aV5p1EG>Pi ziR8Ua$?UcYKgykJekTwnpES15d6N8rBAeHECmfo3$l=$f?|DYG6G^v!SBAm^9+KZp zI=mBhv=hb*RFttJZ1C^jNx%COW(E~UM>3oYd(2d2ix*Vln&;2$20Gw)rf<nb_f~lW zM{Aa8%O5#_U?A9@f4aHez^WUh-lf`VSq5w*R_^+u%zHlTW1&-+JVnkau{uZB0X9<e zF_K%bGS`SQDMKEO4mQtczx<W|Yuq}-ad@kKWMi$rnQ@Hi?J&kS@rE*!_VXpz4d~!s z<n4db6Muf`tBf-$tA&#mm6`i*PnM3ho6)B`?&M#k|L4x@*-#XfABu{8IO51~qn+_@ z;?3Tut_Th4^HbzHZuY~6GI}FVNmnt%gSFL$s~Mr{?Xj5)J%p^yUSCrYgY>Z1gG$+( zy^h{eG6CA@{Jp|j1^G1Ey5<xhjhem2{C{7;{h#;d|Lv>)L>;<+0q)EH?cVwa>ihTd zZuI}C^Yy>CzyFp*PovyXJgUjAWB2|&oK5SeMiu@KWV2(M^!5F+fP}qLMe8#vhul0- zzlJT$GLlh@6%os@*_(ut^dRN-rY$r$nL>en6t_)0#duz?IrD`oW59<+mlDxKk<c@$ z^xa#mKYqT^OPseUidYl|+B2@^-G19Cw(SR<drQia_hy3F7otty@iCO13~Y#gNIj#< zHC|B^Iqmk$CzX7NtW`UqLCi>B!Lxj>#g-ISK21>rYwjQI)v&0asXMV!zL|qB|D5)R zgZ{y``)PDuJqJ6a$!3#l-0pCyif;D#u6)_Ca$1${ubNSRDD_W|Uen|5^NvHz?7a#! zI=Cy|x2m<gX28=mlhH<xlY=etf?~0g0w_Z$?kHHHqACbuK>%Ai-i^h5+FgvsAsn4^ zj=W{S_*zVwXR~nqZcQfHcFGvwRoW}CJfO&&YJ?&chpbDs{S2EPcJ{CEY4}g?(%%UF zd%b4<4YUTx90qylWBSFOMfa<sy*6t^HR}d-9sh+QaAJ>lho}wzv~;apQu*8J{vblg zBEIL5Y|-$dP*%L%B(Gl}^vNfg4K_)2cvHaCy7%!l8POpR`_=L+>YORazTl|Kuq?wJ zX!EdTOtqhTzUQEy6-TU7VqUdTi?`!-P7POb_Eie7dR1zo=W@{vH8nO3lpb-%EbjWT zimn*kBTpvim~;+&!YHlYQx6+&k$(K!F!<}x-+CGTN4?>%d+VPZ{$K9z<e%J|e?^X( zVbgB-&LY0eYPm*s4rA@1W8~u6O){|G;9p$SykvS1smuLp{w`OxCiV)SP|R0qwYwt1 zYy17IB@hsD2}f{8J!|%QQ5kP#zWxRq8slW*J;2(s#I|^MyL&eAlAPTSJ5Zy#Tz6p# zS6RBbl|{!@)A<E#Qz)A)fQ2FFdDh^lX1Mm0C`i;~*-cw`@8~O`#~uWXF2tdnZeZH# zP@upiZY#s}G}-zkUXPk>dxgx)yr-v&99uatk8?0Ece4xv^bEG%U9+*950H=-OTWMQ z2%}eR<ZQAGN9GciA<d(5wogshNM&<!u7hEX8{m_hLpKKk(0iSvN2HR=e10ZK@>+UG zlQ`xTVlz?}dglr_E6p)xlSWa^H0bV08w_4}=Lz|}IeEbq7cJ>H1*n1x)gX!xA3O*J zZsn#XoVm%_+W`6MJg@aTEcgDZUw;k8iBbHy^?e4`R>^+#rV0++FbuJ>X85*kmXhOo z2%_1$5w*{)zhJ1q@kLmTCCA>!eeSB^{D*7%(Q7KFZ(72>P(Pzu&EmBlR#6qD00dQ$ zwVfhYf<n1fz7U_)`SCNE3(WKUZE^GL8&`)Ad`x@ERl+9As~GiVTXRJ=q%<s=1X?zj z>@hV-H|Y&l@Tl?#OhqoalL`hnXu+>@-H^5!y?G)NRUSbC6dfF|RVT5828gLI)&Od3 zDxrK`YjJ!X%f6TYBn$h^XJS-TUu6Vxo>4tyln+%JN6j2vkj^r#9GcN+<$s#1Yb`!L z|EosW&$)j+Um&x)>|C6Y(T77qyXW*~Iw6G1{N*}s^vE5aT@jxRWddL8mp>LbFLQN? zZZsf;rX__R_hPiC>cHu)sr`=agdNw3xYIB9CI#!&>IO=?&E!NpAsNf<{G5?Kv-mA5 zrG4f_!i(T=DDXNVLpVKK&7h@!mafz5qpMt!mi{{r3q#R!2*@p^n%9qJOK;Ci0Bd4p zb*{PD@}@RVcC6dbBuQhIkA%11dLJGq^!bc`6nl4?gX(nuvJn#cjTacJWXIpl*3nKu zbMNqU1C-;@covg|_gU>yI4_LzG<?9xSko;T!m~86%FoWp7DPKdsO^!ZY#kQf*bi=J z*j+ErS<-!P7k;8%l{9uEW9c|-cB&_^Lo`|5GnOy-)%J`u%tYVUL^`eSiL{rq(D+x_ z*79t<;$-O}oGv_f2@ut3-MU>p0-VoJ$^Nj;C}iLbUaFsTieF$fPYAC`8gnwhgh`EZ zeh+6uMRguHRI%0Pj{EBXEbkJP6k|m)3(e{6DQmM<`vUTZ!adZ`mn&(;EK}MQ*|Iu5 zZci3cnkNU=Z7wH8S?|PCup;G7LIL@*=A(=+rtU+q*}O4?Shle^7M?V5OOxf%=VNt( z?FvHW*GT7~g_bEC%^mAzu@PU_hZ9#loTpo?VoZU7?F4$)sko*qd!s{Mu}QfS*(>C$ zKZ~S(9S*<z|9>bbo99(IL~V!`KR<1FHYeQRNGn`QBPINN)+_;;-0K+t5bK1S&wkxh z@3`@WL4E{MEqRT3$|DfB{*t0lED9Gc7+{{;&qP57j@bNMP*}%>5_I(<#gc`cWn_(4 z>fq7fsxR+Ka3ve9N7ILO^(Mq5^R)Eh5+r9`b2Yi;a++ekk?Rsb3?6VNNj~7kRNCrd zps@US!&~t4kl9*ksZXMCykBKgZnK;<LCg$@azWj6$d#N^2)<@gIiiY{$Q$>Ioif`_ zJfljyzPLx1bzG$J6TJ!yh2ERI`u?#MOxSaGv##J2j<`WF#W1nB=Y6lBonB*glTiMO z)=P3Cit{^cKMtUrH+!wbt=~Q!a<xoGPQcQEkILdLit}8Yq6Z{&25$dhocv3o=c3!{ z6Fi}f*4v_5VO;9wxusSiJzV3gMz@}!J0&q(tJQ%G5hhE96C{r)NZPtzIS|wv*Jcn% zWS<g~$5r&x<%1npCwBd6DrM$S$~YrMcVJmeB|y%>DxfpmFvj<2dk{09@iPOF=3n9i zg3_(jY>?N>Atiy|EFTNk9&-;Y&MHs2i7%VE@<^<1)Zt#f#1{=bR2~bUNr47kj+RRD zcD+su?)USi9szve8sl8=Lx=~s?pxbRJQc}x!|=K21PE`?47*)N>DbU}cD%PKO-~Y; zW1s24Eq>wjx^;ex^aNw|C}I^O6JMC}xIlUW!;Bl)0h8f25>Vr<2EQShDrMLbo(bxv z6MO04`R0h(yQySHi>#Uf-s;IJYS8VL>!%@=^HbFcFDruGXR{qQJw=lXyI|HRBsQ-k zq?gc>g=iF|V^TQw^87q#uB&yi7WjSnz5ylKP718$Zj)l@?hzXo73yCvUwC|Pywog; zsCU1iZZFjEeu1mMc2SvtUl3{>f`AL;4hjq&3Y};jRF8UJm^a2t$msVcYf}_2EJV+F zZ^?~LY>f(eje!!@Z$Es8HRHKPG{RBewy+`w*~JcjYPbPUMITzVL}wDWj8(xF+w(Jj zGKTp(u^Pj-7Mf|~Gv_fX`?+maR$b$_#)O}qQC*JEpq@M+PW8^#tUjTAQ#{sbdq@xj zH?|MCpdlehiNrFfga>5FcbKp)3ove*`+9+v$w@Rt+(vVuqKeJkBgbo@FtxH7%Vz~j z7H1MEnbY79GC7*OoeM>cv50fr>lm{N3oRXv(GayL4MCii_^vbWsP9YJArwrk7Xi4i z7Z~$T-6a;f+r+E&_so!9*$Usdvsm28nW-Mg8Ru}+y>zMsnD(xqbpd{iNOl)3=&u4? zwP$`~-s@w$ple_n(P8@pPuKh7rPSHTqj&p=A9l~EIFYszl~TLO_ydvdzLy=hq|>_6 zI;$UH=j=x!;(ZT=%NGT+Wzf-Fh0leWPJ2v_T-Jvaq#K)T7h$7OIy>6rNfft_I!EoB zimzmx>?i8^Fes*&*10tYF=tDQC&$T2W4=~752X{WCt;F9Fs_@12(6_l5a#Wx8D81G zjPCd0y+2aaQ(|}SJL_jP_i@Zmy$%JdXy#{`Fm0KhQB`}4r?2@fS2>(f?ec{cG%u;_ zpmqiiH3p-gQ#3RY=(P1UjSau&M<sz9oNCRpC3o(5WDZjHby{lEnZ%ZmtRNnOEDuN8 z{;kMbj3UuyY@YU|rnc2=xxT2~SCyz`AFQHIpSmYzUS`#p&N)!?B+w`Fy4+hC4UIBa zHkY`-+HsM#30Av#>vQ3DM07@C=c|(d=$v=;Jz8aCKGd}xmGLw`VWa2KIMF~`xFHf_ zFyVzw@LRwtC*!S7)+03B;T*%)k#l$nYAy@ag~O6~#f~w5<HFZby&c-p2|d-U&up(O zzv$-ak@2+Ep7Ihb@$wrcz~OxOvLN*eZ+P$UR?_6FIlt>Wrz`WK9QOXrO*L|phbp`y z$#o*FcpA_BNk56q=N&es(W~4y`^E?=RNW1|9-cPWgG@GVoJK)PWHU1c{OSfy62kMW zS%tS_<Py87uWXNX@9ok1%JkKOIzdwgv9-NQFCGUphhI$YX#z=ijw-O+>fK0FT>6sW z5$ml0)vrY;tX6^CI_fjxrhBA&mz$D~NN!$!#e+0{yBj^2>{U$3YrC4bEukHDnfSn6 zNPxLxPty*=9h!6T>V88YhbB5{&`^mV5^9KmyUk|~NTf#-Ki1EE_>-yk`O=p-7iltc zYfWE#!J|4zBH5@G^wN{GxhxwK>vM23{nJ{t{zWyG;dDPRa&6UZ+`^P}{yTYv;o@bn z?m-8R(%NG7b6qx1*kQXaThzljr3B?RrQ}1x*g{R>WAorMs@F<kOP5cz`}eKgx<#k` z8tE14X3!-*a!aiNt%s(p+hpl?ZH0kZ+ZBD1(8k^=>*O0^8G0Xw>Sql4k4064W9<|+ z3Nu0?-$HJ}Je=&Gt07?9tKLoy{6W@s!OYbPFi0+a!%i5t<Qj?;2o$u-Uc%HytIpS{ z>$PB$^|Wq0!7ymybta2rKbAUP^&=?T&PnE02gbnhx>Ctay<VydNLHYwBE`P74AnH# zR<~ZbM}a$?h2h>wT9=Lm#Y$<gJ3fy)tb^9HIZ9Z@^U3asauSr&4cTd3rPVaPG%Ld* z38^({@KL?~D$%GwYl!jt6LTr>;G|_xi|+t^<g#$~mWWTnbadMtak&6DF;)*D3*90| zmMkZOelj0a%~jezG1zS>4UFzpn40h}hC2^jiOZGwZ?R*3{|wLRi)!r^L;QHszFVR# z-B`|XPf%%p6|=7HsRPFl^$Vv|0A`Kvu<^t7ttfO^z{!pk#cB<CL#?HZ<SMpnn61PX zW>TqMS?uQ@ChxA+NVb;g*vq?vRy`L+Qtd5<)JZpX2PUn)xSG<740j0$=)f83F1o(S z8c$gsb0XZiX<9RPBPdt@UWJa=Xn|G<BkS6cYhi$bpssRKbFO8CLZSP90Q3obj<x8h z7nTM4=Jz-MId=YD=ZTF3#hmr+DLAsF3E|PMxdZVxe@OR|k|?!{I~mv{eMnQueY6rx zd)oapj8ymm+N>2q(=fwZcSd#CdgYjwg<?$WoE!A$<m={>!{&J5JeKO!{nX>Hdy^!7 zqDMp4G}#z_a}8hZmX??7eRE(IUb9U1G>)}x4qp#nGKajt7KtN=k;6xg+7%^Ez6kW> z+p)@>Y!rV67NH7|+tT$hsBO-ru#Yo$H>1fi`~_(KoUO`=!q##CFl5Pzw58kiD=e(Q zlaGlf*DM$J_Z&&FE7vAmtQ$0<Ij+H4AX5IlPFcS?D*oxdemPyRS!JuLcpG`;<?8kJ zH}_U;Dm~RxLy{d2=GEw9?Y{1>G;E`-Kkn--jx#XmO>@`0xg7Qaji-QqOoiYG*2Y5s zi0crYl)fuFk8Q?)?}O5Yh2aacC^>0k5?vt8#vt#M94I}oR&Z|qU3*##Uj85!Pi<ZZ z{l;!w%l*#dyOq@f6$3WX2KjL{rYNl|GwHlQB=i%*%195n>_x)7%wSbe543#8R36GH zx3F^ntcnPYpTB{(1NO3)H-Le!WrTQ49q#S2NTy_G58o=>-J3+y_IAv&UxSXg(1+~k z*1AZqh`j|)8M{Zog>|)_Vv1a`vu~=qC$>&KqMGK^*(LA|^4I{Ve@sm5v)K6O&*Pua zT%~@OW2~xbB)zfWY2dj!;@l!F6|Oqu+#b&GVl0^t<`7*(vBsM)Ooj1RWM<|p1g5W3 zUH*_36Pp{G{5(7UiP+V9?`Dk~Rm-I}X}zkwu8%sON^6F{#W^2@&&OIPca=LVmgVjs zmrT;&0?`>cWd8~kDJ7OZZd^wLREZBciPFzAdnmH|BvqP`SLRBQIBHE40U^JP?>u%9 zHXAlM;>(5(#gpvZWRNdNSG6n)(#FS!rCc}7Ue5^!oKdN?l60*p%|gf{0<w%A27VI^ z{Xpz_KI36cEjN1z6mD8KvCV13kJZ#<Ej+HapRSdv={^o(&^;D91|S91^0cP~6hE1m zbS%A-FvJRaC}dpqE1i2PrP}GOK*l%Ec^01->%sPW0!~8JDiFSS9I*L|PGn^6*e&1p zcsZa}Q^!^?&E1$D&uA#FH1MirizCwrQjl-F$F!)%r@8IEn~1J9sEGhCt}GKMfLqMi zzFyUOolzzc|7Pqm<L62DhvS?P$8zHtRh`E1Bk6pMO=$X_4H2I67l7m2n!SfTc6<(V z#~gNB*KHN`8QZo(rKJ)F0}>XV=clh7uD7iDk_gj&4J4&0)Dv%-uCZ!w#RH(XwK=$F zu19=*hiRcU)ZBf*v3Q-|YfjFg)Yxcx(WPAFP}+Jg<zFNlyDWUzvc2~Gl6i}6Y@smt zUDJ5yNVDC>5m$iMb&Li|te6I)&AfKs)z6$f-pZ(Vdv?76V=HWf?H8(d?7~evMa{R5 zRW14Hf1j|*3S;s;(!Udz$d=c-$+V&^5SiTR6=&^e#MUi#0Cnrsxv&2~*;?F|*+dB& zU2n(DbbDNtQB50U!0nDElxhvXEwPV|jw5?p)ko4?y&fo=E8)I?k}_KfNlz#d>=+QJ zx?H_0=%Vf?8!=GZFeQSdILsd_S$68@D(1WiO#{PXr7d{)O=1aJ%33ImgyyaZY)K`c zM%mn{+QYhHp){)06QBOwA0GLiMCA^!57Prs7yK`DodVr*+!*>Kti<BU65q-a-P{rT zjfK(u5ie}1Z=@r?(z<K$x}fte0I0~wZ#6Sc0Z{e;3C=k2_0Mz4bsK<;7KI@s;=ZwO z&(O(j0@%v?-i%t2URas`NFOLFLQDQdaHD;#^GZ2w7tigyy0~QbLO%vB4E`?Kk2gdZ zJu#dkwUjpkt?+KDo<5_3d8bOv`p__-%b(6WMbw9CO3+<iIgOK;lvla%vP-1ko)$<+ z8&NRSzhP;<6+41Fcw59)jKlJk^}B;?E9tiAS9@OjX9c7y$kkCg;lhW6!YQ?FQ*ELm zcX#N6cPo8~7d`XH6VpZN#ou*$3Dx5?Q`850Iwn$BOGH}k7}=@U5%OsP_H=7jlQ7|` zAY>koEvH<-i~hPgNcXWymZI$lYYG07oQP;7ctx(sEy3;}#?!@q!?Q9^(J{rP=#@Qe zCM85W6Sw?295w<I)azXepnUdoXhr=UPvlP?(l3|JnN>YfsN}tkelV~2xKk1e8wnDw z-0VQ65+5{;XiFQkJ&e0y^yL%QRGDg_Di*yLjrzP6<@>wkegO&!2xRV(DdkJH-iWC_ zZh82t?dSp)VL`d~TT*t{*>eZE+2v<0%W<+uKPKjJBA`jWOS=_Dx-4Kgz>rX(zl()Y zETlK^<(Uft0aMREwk}><3@yu4oPXAjC@0En4l+JV>K3fD(Kq61^%eT!#-dc0&2nGT zWbn<J0BV&$WEE#(vx8kn-&)yfj*4c(9J5z(UAYrz#!mEny9V#qpPP5CPw!1oL#Czw zhtU3soXhwC_R-ls9u2tp^q4h&886CmGENm2bb&rY7F6X~EH1uT+DWF)6)Gr&LE!E+ z<yPaMG`J!lN4<Yttl3p#*v`{yFm(I)y@FfL80%@xoV59t@xkj42kO<?Bi?WF3Z{ZM zm|KE(QC*pxedN3v{I^3iH#U-L2ky>vn)r@kPyjt|7Qd8cyTZ%=brPxgDhN%e*Sf#2 z4x;}qy@q?PXCk+>Y|hy^fZzcF(i<+nFVrl8!@;n0e<(?B-8U7zE}Ns|>w@qqjRzuk z$ReX^kReoaF2!9+rtj7Zi+WveE3rHuK<YlkrQ8W)9CRAMB={4nJ?vlMUyAZDXp~4= z%`_9i;3e3P;6fwjX(Eoi%XqmkQzjN#-Cn0Xx%bUFYb!|4r6R@zmt64!a776Ggqwi% zaq}J>O{(WIDdav9Gp%`@H<GJh#~tNAvM9eDG7G#V$#rmxoM@iY;3Eo&@M59vdgJzF zveY(Io@Q6@lK0`Ww)Yl?1U12zKoT-{ZIz!eJ|I|ZE#*M}-iq<<^%E25vOzo1>YKhN z3Icv&eW{~p6l0tBb=@q%YJ~Pw$eTQIf^6lxr#%*v`O?XLP(HNKO=PzNzk^GdZ<%F` z9nj+1uKhl5sRnQ@7@QEQyZ!28)$?z(!EtvDO<4&nGq!?sT{-XO>R`DiQA`QkZxjb= zS~spghGP?RGV&Y`S~JT<ZQIeVW5m5<*D^<l3sF_wymwYaZJng$R+z(jS%AW~htS;f zAK{RQ7n^whW}{BsAch>>rzw^YpV$lIl;SCxkQE=HnG<B5u;tk^V9?}?PiPDz4soYQ zjUfFLw<$`HE2ahmmE(;I_pi$5J>^vNEcLb=vXU%fja>;kKR5?D?&~0h;~VtPWkd~l z#^ryVoYD!SOO7^ZNx~N7v9Y4o47b-y_{(9qs2B0|+Ak+9=530)v9-~MB<^V<u+nE< z41P<O+@O%Ez|3j%B*25uw^itwp1PLGwJ48@l8xY?o2^f5I@-s5B)@nF$d~Y*pT(NY zWyz4~tPHB>Z8M-dA5(DIuchRpXHU2f-%LDjngxyri(JprBG-YXa>zizs~uMEET3{- z?KZhEK6BW2bg8-}A97hd2JjTUD_Jc?;=UW-#b4%)eVq|k8{eOc=ctqs-9d?cYD%3F z^qfx)uIL(VC3{arfaNY{%svf>Y>9JAvYjBE3-7Z)zvHy3Y2`p<=H{p0UuL*wP0$L^ z&XV_Z$|}p*aUpKd5^@K#eU-HrANZV6y>9^ed259kdjn&J<(ow!Na!;vrZjv4(z>u^ zvqJB|SEhDtns&@&Ypwk{ftp>}5I3pKTWA^gn%IJH3mYy{+j1L-K%*qI62Bt)N?VF9 zei2-hdGk0{)}QZM`F&ko?MI?^j<lX)W_hzA+;<Op5D4j&vDybafTpEkijN6I73RK& zPnrsOt&+_djrWRjU($=k%}jdD?B)cwGwG6YAK1Ed_o&sq3?4Wi_QcV=nD>oaJbGYK zU1(E+rQ^wHhFUnldCrvIY<@|qtSr!~!+>Qhv$BlM3(e+bWMpe)ZU2;L>Z#(@i;a*@ zxK0xzZ!IpZL@=%y*R{&BH8ZKo0*bb?X#Q~E9whQ&CB@0(dCxB9h<F!Qmbr*xQe7h+ zi4KP?b@nBEX&0jCO?`foJ`dR;cjro1P6|(UB3?es;ojhF&q!9!RNQ8T$pi(<U2ext zl5>|UrrWY5UJ;w<0yx&c&Oy@;(Q!!9QC$yhI`1VhtU9kDCEMN=(ok}9NJ(TXJwd$G zUHGDGC++Pmpb{=q?Ve>KzlRF16OV(<>_}n(Nq9C>qf?{|DKZuA3nggNO7*QSS@W8T z9Fm-5ep(ZLS@u5v-DD=&Gy_Id_D$-~r~<gE6OZijN2?Hb*jvoQKbD#Z&Cbk@*C!^& zzjTkq-MGeH7~~XZBjIfepQ`np0;T}Ch0*OoXynvq&n{lFiZgOYMUT<957iaFAsp*I zMxHB{yZUnZ+M2#O842fzQ?(1yu<dan-gkAD_9He3kPVZ%Y^0cnmqlE@S_2^B4b-Hs z^E>j#TabkZJdwGTxSiHz^WGEDzU!L9&Bd4aFY@-niwR#>YF9fw{ve(%`+T6Q-tAMI z!u9Wamnx}y92#$!=;`#?3v;O6i}r~R77b|WKL8jnl<V!iNSIvn4oW*J8P5K=_58_k z{cIwSPa?06c5wQw$g#Rqdv&HPyQkDnM8K__Fxzp*%#qBM3+5=CL3~X{Th?oyRUbnP zRs<mEu_0ll;4m-cWVaStV_CXDqkJg3m|)|x;WhX*nfe3ybhGDR^+g}N#DU9Bs`g91 zJ`aI+7FzCn+?!4V8`sd61>(vZjj)>{uEZD|)MVDZw%<rX&$E6;Ji5oSeA{Y9ey}nj zGnqVZ@WmkP8Eak-e3o5#u9>weJxI<`Fdi?BsTp^aUk(7eR;-7^no5I{jn_=y!4Mk_ zlg_wRh^UmqI+|@%w4%yzz-ULb`%u>h<QDU|-Vu@7wIQ6}=*8D3Z(-G;7ExQ!pu3YC zux+jJV!1!4iq*PEYd|<QNcq%?c_?DHqFj9`AgkEPB>ArRfQ_)nX=tFT(iP-D@&Gyt z1lR046$j-+JmOccD`W+1OTcW06JB=z@K}PuqFl$_lG9$IGl#Fy$_4>RY&75om+5_s zX<~Ln`>lybPho;FA-Q(Ihv!?Q9dDgc;W9$o+QcfB=~6zeYv5#YR@Zt$uTa$aN^GM8 zy6V43U7K1b5LZf*+P4^vmU!PO3p-tLQ`YdpKUh?H)<}0PmsQ4oCD`vKg&FK%sqDfc zWp7!ITdPb6UJ`C`5u92hdC3f?9Zc*>ydXLV@PxuexR2f>Vj~U<5R6Oahhaz35eKQq zjLqU_R7b3h_|h{fADeB)6PXjQ)9;VM{M&Q9GIyILD6_%om3;Ik{nYvv^k9M_;(bHy z<5yptQSkz=;|LsVJ)2zBV<p!tG<9tlZ|<~~+hw3r!C7T{K}btPDm*kW(sIU6)<LxP zLhJX$l)WFF258n?D1bqy-^t=fd(#x&)2OL@0FY4|XH+lq6Z%FCM&Ft2@yVIv@TKbp z3H}QqD)Oukf3&;RR1x;F&9O1|Wn}BTJuh&2li0bX^lX`LjP`)xN+see2`!5rHdW5t z!9J2P)D=PRANxgJKR{<ryH8csNm#7@U}2GG`#}#PZ*u9fQsqH(doW4ZCBfdWt>#@m zd3Dx9eNSWqn$2<@FTW*=XX;B8biltb1Z01d5kMLuWguR9bOk>>!(u-VAJbv=S@qhv zs>0P+FC)DkVNtlBavM1T5>w}!tUH_a7Mhw;UT2PcT`|WaM=i&bwXrF@YM><(j5Th+ z`vp;a5)I@K`H3!-6%#>43xy3oPUWXs(WS3nBPB+YkAsGn9`WQP_+`L26^OYx&f&=6 zxShOP<<Bkknzb7!7JCdYNE%?mFdSsTnbRxh4vu6QEC<gF%PknJl^(wVvd_rNuZs^r zd@~`1KFZD3PM5<I{a)&>E4FykkA7`_tc-ltS!l_hfYj3NA1Ki`6AtMU1}*;|_TDq9 ztz=slwcBmePS7@(V3KXXWH4ZIYTE>pn+y`c1c5<_ATlDfu`wA;&d??a5CW4V5D1J3 zA_^0P5JF&bM&t~A)%)&q$JyuHG2Xa;&b#l8qd!_p(pYO%Y1XV+v%dL#(o!ay2rqf} zNGUI_a?U`7MfZy$_7VF5mMA5C0^{m8(K;!VoN2XH@rk)uO%6%}oHnPZ0dd1amD6m> z??$|wN__<qQD4K0V)^x3oK1~KwgUTjLXW83K~26{E4}>`#X=0BrPCkI=I?!$(@9lw z<++3HWO~3mUsNkXyf!F(DEL94=Q~l-I7%)bw`<{HJ+5rBHd6KkA)F4T{f%bx0(s;a zK#;z*MN{=?j*F)?J&%WY7V0ia;-VyJW99h5tJIIXPJ^{ny|OZ<DK34WU5an+?D2BG zMcVMzLyPLn65{w888m)URUTIxQ2NBbp5@VAfsSg@<f%t4;DN4Y97cWPT6{dBF))%` z_EZ+ZX}54cFD4}~cF4E$ycCq9?eMmAweuC}<F2qg747^B2~<X7b>dX&_G(%#nOa>g z`aBMkU5my+Iv9I(B%-F(ydcw}dJ&nw)w;ybpRw31RZ8;9b$>JFe)TOeyugWiHx(@R z{<cWG_5xW>yL-H)p+cz)0g#~vR7h^iHI-qqe5coOJr`#zBUJDjJ?l>03+#K_Zamq3 zMYWbi3Mk@?G@l668MJMxTWujqLLzjUno@rTz7?R}{^kv&>NPhUcbS?hi!J9C%2M5@ zg?xS1+DD7ZKNhXlj2i)OOikb(Eqbo#`8U@zw%FwsOP{Io`bL0*M>%@GR65Wl_BXU7 zgtm8@G`k#|r6e^V@h#t8KQGdJT~US*ijK;}v%Hg(`**YGKMt>6q0Q$_?tPb!oK*Q8 zfBTdA*`cAquja5X)J2j1DzUZsLQ|#W&?|Gku>g4iJgrc6SZlL={pBDMaem6B8Zooo z;&VpHJA-)vH=D-R_)9bgLvJ~9ild&stMgiohxb4ta$V&)c_L>m_4&W-ZYThmNvwGF z^yRH#TrnT#n_+F&L+>w#J&n8jfj&q8pQ)0mi-*vXG>po$ob!6ype&xkcEQ#v?jhO` z`Fi0@(cTdV5Rb!TLtl*Emdt>0yKHRC+{sKgN;6z|iq?Ff9-QRMPS(b}UBtYd%HF*x zsHTs+hu3vBGsxMG!<EdBF<NNuahp*?Ts}*qIvsT3My@2ec=>A4o-b#WP5Zq0Y%xP? zl=re$t|2;AmEJAgPB^G&wO-hR*9Yw4{!xohr2<zS915{_F{@CXWR9evASd5v?X2sq z?%;lCs#jbZN@eJ_t$ok>lB)`SI~PYEZ#;JI>?fgnMbX_Jf2L^A+dpWIxc>snURd<k zmFI-qMaAi-ie60>#}tA=e$!F$5Gp7b)I2jj^|Bj!vC49@>=Jb95}9oGaWzm0&HjqC z@6_yEmwVd$$ipFFcU0R3?cZUBh66|@rV1y1aYg1T<a(_C$%~d_=aHN=j+A*PuRU1` zU}lMXL;U%nbmS6O>7iZE#fx{2Vf!3IUgvPeq=N(+B*^7-GyIYvajs+v&^cC@W-Oua zg`Jb>YXNp7bK1+-t&FeWb=Ht2Y*~($(+$gY`9*AQ9|dt7dRA?*a!!Ul9QW;2RJoGB z**iSRs~>Mf4s15lJ9En+4GU2S@0@dBqqE6yPI^yyzqp1IPvu!}+>0Z++9-kitIwBO z;nh-~7ua`twFF;3&jXvH2yv#Q#*OrG{bdCpCM_SwDQgx3+XRF0<RK=oAKGcp%o@8z z@fBDP8Hyhs>TOL`ey|;N6EgfkTYEmoAy`-4K9Dg}3C&d3_GMn86GfLbZV~#p@&Tr1 zFNJYnM$TIrv|)kP1F}#5b%i$5;E{?`_B<ksyDU$Rs3p?Fc=~H;R)tdvk(o*^iCNv5 zn{O=wrg#LpygHY7GjSTY#gU}!6e9=+n@i+wT0BI85mpw<o2r4cQTBM7+?%~hR?H8w zB$54u%a+aEroI1+$TN_;moGQgRQ0wh+lXHMQ2CwnF6Pq7!J~bh0{>&+)v{c-L6nx( z{77`KTG{ODwP6GL1mKZikpE~ZVPySPr^ZxCr;3#C&HWOE<W<fG**iRRMw^<^s&x!g z!O_M1zcyUHYLoP9N{y{-wU=%sAF}^E#L;DEuJJ(8^R3w>V;SLmw9C4z@RyzFDu4ID zzRc-;rvK~%{-aO0^0%zTL)@N{$D@wjo`8*5=Dt}zugVPW4A+#Etf^4n_fbumfigPe zAaS1J`8<K}Ra@=JLURhlg#^gAcjA|u`MKLGbt~|eZ`kU*@~A;h4$sSDBl-pt!q~*= zwWnbrR^^{uIX<sb4IBIpu^9>l9lUIqcPXuBMp*wObW?-k@1F7Q8;#)M&@uA^ApG0- zR8dN`dBfzZQ}b<Z(KYo!Wz+5+h1btI@|Bw<De^ucg6hxWrDNrtP%bjbN3wpgfzgUq zpBe6%-Zx|~EuI7*1=37fXXIjs?Z>9_E~;<3M^}}>>ksd=dj{)R+F5*T{Q8Ec#)|!F z_nR+MvaC_sW$N=2tx~Mx4{tEbKcs~8*2cv;CJT-<VCrl8{KgwLkwF6k1SwPCVr^7Z zToKeH;6HcZmH&!*KUSiIKCkn$qbQsB^52G9(gI!4wvaVh;Qihon>7t0`ez=1ge4<P zJq87wC5OOZV<l)~rweA!<5*v{b?Z8&ZY!GP1Pn$pRIDRsfaT+S$ra70in!XsrmSsO zbN!*vvZI!>JL47qY~KHQ$=|h<5NCxnT_5Bu_B^S(K?>55X0XxXZD{{pvaa7@VvOU^ zGQr7sV0Wsa<EaPlg2ZvG*X>bktTx*7!2c$nrYI7#IEtW)j5FQRcNXZE5hltDNf%1x z63kage_Eev!jz{^)_`Lgvhps~yZp&=e_hcJQIvjMwcr(%9%GZ1tUaF`rTHB9Y<ZKh z$X_y(9C*^iEJOkiMCYsvgPL{Khrp|29l(B7L|$v%Y@cE;WOSGj39Swc3b~Do=j@_@ z>EOqEh-cUrNUyPVHz&UL-x?wl5wV-K2_RmA_GD{beiEk7W=nmyio3<UL4Dj%dwgwG zxXF65VM}+=`e1BSPa;hsRaUV5Z}97t=i{gI-3g1#4Y{M|9|@T@GviJ7eNYDX@s9xm zn!{b`Ga59~Zv=$<g@LAZh=<FQE;A|#p)C;JTdr-b@3&>{iiCMfm<P^PxKv11NJTI! zM6a-fCOjQ-X$^Amy%*n}?RF<RH{r!-ftTKEH!Y5QzR7gH;AD#hz<p6kCHeR2LX`T_ z*V8|_%g2~c4m}AtJ+<_sGI*13`AW#_^{>r4R~}0x?6RlsE3E?&(}1EPZlm&q3M<*V zWO=bt2)wrJZbs6YNa+osK)1+;x%r(t12Tb2z-YOk!Q9+XRdIJ)dp`+(b9y#0ib=)d zAZikm-QvXc4BaG`J1;`8Z0Z|EN~A8WKNc4F&x7UvN$u5(3z^x+b&|+V`nkh0jN#k% zIsARR!?ucT+g$mQ;&ky2>>}MS06R^^A5~3QbwbBQfc;_`Q^Rec{$l3&n|U^t5K4iE zKz5E5txn51A8Tm-zN9p_ZKdh#(stsF_dgzpHSYa|UC!k%$uz1K=~y5C;oICZWyjw; zqBmgqe6~OT34k9dcD98ZU-}w<*=|1L>kbPo2!A-pvadpnn&7u`qg~``Y{+GG#NR|Q ze_fF^7UgtZj+sC3IX3dPsr=7vR-$5sTeBKQ*}pNAslai;cR@Xtyb|$CBZ7JR&M_Wl zy5bmFF@INEB<Ty;V(-=zavTn6$c^*CtXZ`r`!xF(Rj(WN5D3Q2?I%h0qKjrN?rE=| z#R-d$<n#HfpUK@6sg}j>zE)CY=zg3twFZ3ByQ}r|`}Xfi@yLw|>LTwnZ@AgvC^lpt z-s0wDpP3E!;g7;Y<Ed}NQgg3#VIZD$<~w*{!ifA}eAOV@2FR7+H_+j+u$hHO>*2*h zYRsQ)r=wnSiLGzeo_676k%z-N)tl=Uv7@0I#L3M7c3~f=kLw|Y>zVu?|GDk|@e{d> zRrcUpxjUDS!Bkx67bVlb*O)U*r{cgp^*4DOv~eBp%nmoUYhqWTh6-(66P}m|Rg@v{ z!!jhG!{!o3dv|6Y<&^eK7W!M|35H}C(O_cr$Y4W>3R7$cgU(TEi_YQ=+-ySTybUOv zTJ>^$875!qD-O5mUhaSSYFW(F;+)+=sb@z)Te_fkNzwv`XaDwSv7@nh)wl0a+KAwB zi<qu{&-9)_7AX{obwM3zQLc8_Ft5hxvv?dlB%SgYKg-gGis?L!`g-=M216w&OIXO> z6wP&Jzit0YtNxETEkX~Vj?YS=#^=1*Iky5~_Jjx4sR4r-`~jVMH7YcA+ORDA6pdm_ zE5CYcUb!z|_1=T-jRKX#cW(&;9|m4dp7Q*T>R6;ai-GvMC*qc^`)z^9nmne!J=F0@ z=}~^#bn6Fe(4VKxUV9>`eKi5dz+MRR5!d@^R>$jG?wuvS_Whn_es7|YvsP?I3)Nkl z_<O6m8NHeH0C35*B&ebY1|lx%0fuJ+GJEmW>R?(*K_2tzvWiOh+@j*vCQ&`sz9;k7 zmBP{A!EFv<&kYC+8@MCEug^TJg61clo1eA~28Ib=T<h3j-cd3%!3U<PX)K^eGS|!p z6LJH%?>aR)V?rIEK%f{!B5<!D3tu`B+UgMf3LF`5%0*9TmrCCWt@cvd+S(IlpRSIb zDDfyk84<iC8fnYDCeGE@x(AYj$Ftp=v8f=5<UD!kg>{$Kc|^gdk;;-{`AF3dZd%cS z)Ef%dODS)Mr&Ts}T9`Qa65zg+^v95WxO2>2f6Jb}&DmC%M*ES42s^+P645ts#FDVe z7{4Pd+jH=f4hhGMmq0vrdb0S4Z*kf_U>!2=z?!LHyoU6tBP5sPpN?VbHJg{>-DixG z%&d`{x5x-?;53>emYhxFYRwKXV3Vtcmy&VVDN?=7lhn#won<4lxfFIru^}&!Q*9v! z>EeggK!@Yh>qGN^uouB~ADY(%=K&S)k}1%=HrO_1t(kbOQ2c2F{q1qVY3|-CA$J#Z zuT8&Fc9sZv7&qg?HBqHzp7AU{y2v+-)Md{wTUkFUcmLzyz^A_3nN!ml6RR=}CPR9S zef)k$lcA~3rtU62mr<){s_n{`MDv%sH)N9~Pg09Gz2PXJ$hbH?1Sg9*Ia5E(znW+H zkdUMIj<?VsM?i8~?4|*`wuiURi6-5aOr84s9dP)gkSBO+->cuPq87N4jT1SA>SnUt z0j0ItmvWswnr~7bIy(Z3GX{8;;MULzBgmHL9;ap3m}_q#-o2>$2_Z6wOiSc0E9-Qw zEzSU+{clmB|Ir)#@6WFd`H%WujA4SpewBZ)8*7-k<(Io+12E6DdL14QlaTMTk?&B` zKpRfQRaR|{dkt4UEYaVsvT5~CDI_3#HjlPi&yc9e&_Ug-j+j5rH3y{&M6u%VX55FH z{Gy*nCt!5SY5g@f#Aa*IU%qn~`&S>)e`{Up<%c#d4NMJj5m@}mYNZ?opF=3=%@P{q z99enyl92?bgD-1_c=r(JJn0}#2a8VQc&*3D9S|`syoNnv!npa(439WBk@C2zuVAU_ zXL>qu3kIvKv1{FZgZfH^x6~=1Eq0Xc0Ko)LL$Ro7Ku>U=l)mj}2l4j&VBgEJyewPF zVCIKr>iWxQ-^^zdjKyhb7groQc+~xJ*AyX>-`MMDQSX`RQy5n)QEg!fim}+#8F8<5 z!ua8rbIbF{<Df-NOT3I1v7}pi?DR2z)-)~ga!0v4hIkM(!WE`KBAvq)XMIx<Wbl*m zTgEKD41!h(`zve5OW%`OcyrPWYxv{`4e#Y70HJ2E7n=q;JQewE#u*CiP}c;Bw^L1H z&GE*O;&+k03u1b|66Q-0jqL!(?0MIX=uF-j353~*rASG+0%mfW1RO@Laq!q6Yic<# z79r$e^D6#lb(bzqSOLrzd(Vkw(VG5RCsvJb&Nt)dB(u2eBEAs?@`)$)%(wC|(=Rs0 zncqkEuua@%?NYTTcj!s4tyU0EO3R1LkW@x?srUg|Q+;&q++g5ZqLzDnfSVfeiCyu7 z@JU#y5jSHmHKH%)H~1$<i%YH<Sp?QQ-r;oQF%X-Ccf6Z-sP(jnd2<-sz!X$LyIkIa z8Yp)w*rE6C@T##-c*pFCNAKPF(k2Kl(^3giI^JD4_iST`t?OR?Com@~S;<V?XqA!_ zjSdsJ>{;jgk>41v{lbUQvm(_L8*`jhl~+egG8NoL=ANx{<~d=nP}joRIR?iwCr&uh zi{tfA?u1>NxSvfH@@@RHVVc;^`^0;|fv*cxl}O7r#^+bFfwnTI-;Wu;MDSA<rF}5p zckZDDy){D)Uao!bAO8Mh$k^Jvk3T5~uL<1@)=W8pD##{`3`$Pj*9mdIu&Y|mpRb(^ zGNA9g_}KI2%dh2>``@JS6j2(_@%oW_HCqKz_sm0H1Er(CU%oh+;ODb57b&oqkN(tu zs8JE~3Z&ph$oZL>EcXgci)O%b9<1#*2A_~xCM@ccH*=omMHiDyRzZq+lf*o!T&H=7 zR772-ui@JDo*6AMez*sd?8SuUuf8(gR~axn$AbnXward;`%BE}upW~|DWwkU1yZ*H z>P2et{4aWDP)Kl2#h*nmL$45z=7jpeK#gUQB6IoaKfLLX=0>f5D(&JGe0(IM!~aMe ztAa*Zf9?&;)YWi0xxRg(J%55SAwC+i-&JC<T?=UH$C^L9>^U0suG-QHSahq{9IlS8 zaDo>1J&{U}o(>+}PYvQ)2-@@a?w6%$+suWUXLQUp#UGQc3=dV>_ZD1FESQ@rnXAUm zc&wJ75~9{*ri1g~k8(xh2PG>C&6w=y?A4jZzAOrMOr`n4N>=61RnAWLV4sDl1nKPD zPczx?;zG@iej2xI$<7{C90tzFrgb>g45q{`A5W>B+n9cQrtz|jXK7M7!4w;N>@Vt? z?^<D>J3E(2PHj5q3iUYE%Trr8*1^;#Aicu3V~D}t-Tnz34P1N<Y&R}E-s{;vo64MW zA0dI~PwE8X$UGl<IHc{u)zqIsI78w96SF{fL)&}Oc;m^y%u*%cVK$C`=S%-<%RBzx z(7~WJmj2FOTP5AC13EcrwAL1IhsZxPu?uM}O)S;PcK{#+<||WGX8H>3GuPur_+@%r zX9qZ(Y;P4ZFqugJ*()MU&{!SCv3Y5YpxV9kfytqy%NUv@_T9sAJG^MAH<!#}a(Y!o zpvuPy5{H9EqDhmwp&<vOB2bYCv6w*amkefgNukP(n?Sw9+B0Ky$vvddrjL+!%c*tH zZ#m}0&7$>3u5SlMblm3TB?Zt>B6Em%xJy>Zauw>E#Yi&4?;YNK4qtA5)1ILC3yhy! z2b9AqWSwTkn3f-`wcu$;9r9?3_JQPNp4G`;SE^27yAGCK=BY{E=P9-h23yNjzlNmP zeV>YtamlgU*%BQ+L+&;0d#m$sD;e~nF=uQxCH=$>Bsu^NaLq-x;4L9jTMU9h)~C8T zJc(zD*B7hJ@^4t<bPI3(l2`83JH+=T_sKEeVo?P_exuyx{`~kio?rs<ZSq(UEp;Yg zvWdDpaM9k)ta5PcHeeeWZHbwC3i@WN&j0DuKw?J8XTfwF+E3Rnv9TAMBXK!F(0k;3 zc$r_j0YRBQj<vsK<fr=R&4quw8#p9tYHjj3!#ZSqBC{_pZm-<2T4Pr^)nA?dW?_4g zpNsg%jn(TL?rG5g1c`I6fve50M5IJ<i?iA0fC<xjL8Ji27B!6-9(b4=!(`nPOKZwZ z)PFWIB*(kYjzsg>`!{)c&~Z03__F{ZVwPY4N=w1oA2Oz=2)T%L(e}EW*gFv5zmX0} z406cLbZ%gBPcWAFaso(b#8@j>%vFIJyica&<@%{w4|!)p<TaUj{GIpB(AE&KR`dv( zr;2f`ntjl`alxNn-jUWV0KPkV@Q40|Cz7M}5FfrzH`mS!S6%x7yBX50vOUAvqOPgP z41O{V?^g|i>Myet;ELKfGj;ZZ_CL%&V^2kk!n&75=iFY#5azRIaF-f}d#poO`O=G9 zK6u2vS0L-S7nLv~#SQA(+=Udfyb;0A&3{voIVhe!52Xy90{0M!N-phQlx|W!fe7TA zUplG$Xz|yTn|}Zpq+7d#ou|gCM8)Z+4@JN}MPWoQ57<Kz$<%yD&GdkGF`qb{_fp}7 z@9fNEHT^eCqAzH*cHRWHaf77)Yr^If6qEm?`Iah2kG-K8%Og00XNE^{O82tu$f2Kt zq2fqug-sekOL1fIIZ<&*G9Wr(bh%pV$YK#=9Bz|%nUD9T?XZF#*2Tk`ZF-g`$6eeq zY!+ATju~$M;E}u|%<Ii?W&KGvZ=uDbBL20y7v{*V1{x(6alB#2W+f0FjAd&OO@~)B z<fQ{?Lh;pK`bBE{Xxgi&DX0vM_p5%R1Vz^NGfKU9FU<bt-+8=$9A3YHCQ=DLLzfS# z!lt!E94;r84}^EKIJlr#Gqe(&x%g}Jhbf=A;yy+GU%s>HmyOHQdqpc?oH=ZC?vnP{ zVV_P~?!=gtvr@T;$6$}AMX5+EoyVi}CcX@HGeW5l98ebJ9iQ5KkFZ|h8YEm+g_;f1 zue$BE_laUG1@_V@_D}C0KQ1cA`ke`PRJGm5*-I*lch#0FrM1?ylK5*AcW?aqiS@#; zL0d^rQ?O>y)KcGs8W2Uw-GXKy85l9^k4M{lp|a(Pzhhq?nSbqDD+X-ST+&NIx?)EE zLJs(5#E0-6u6f!@1o)!a_hVyl>2G;dmfqH&CzBRfCS(j>cNs!t$;RG6IU#yG<tQtw zpo^u9<!r8r7n*>k>U19HoviqsGs^RK?|B7BjXjw$GR5vvpJEE!vC#x!PfzjB1vlhM z^v!1X6mM}SaSRL|jMK3t@ryrDX4jh)_vtsO3966iM6uUT4E7F*t1JaU`;#Ed6-Uyh zL(vt!weZ07fo1Qw&`;G5f-tTsva5Hoglh#B+&pFjN4^vI$A!Kos^woe#4ME<1k-@h zZ)5M!8MZeiC&WQ42;v6ZSm4`BY}HoD%y6*z15j>%n!IyOn0^||6kG?NlQH8<oC*6$ z4i<7W1EBaGS>y8jfmN8b!}0YhBn%9=>`l%uRibCa?j9)z(feGiskc0YvZMrT4W~|Q ze6hIe^FCM6No&sVd3R0IO_E$^Rm|JoZ{|uh<7!K2#PnwCBw2qb5ANy`P3G18me@KL zMt?Cn)L_15b#}lPHdR0xr8=w94Xx3*eQSt)Co>fBQ}I*t)5KG{&5%9jO7PlY?p~hN z8Mxh3_|Ij7>73^Fna2UW37f3ggrn;PM4hGqKgWC^qZOF<Q+P^>_5|E5rv%(jaX=#M zv0G%(lCg~wDon)q9*X0slXa$2iyY^wYVeKVAD2r7M>8we;zM+sjIkwH*3_q*KHOuQ zHS2jml{sK)*^8;JE`T!14ubr`7}r#U5sCm{ipZ7QV^q>qTP=3Y&u>`M_&RXPZ2t+x zA?XBX<mPAj`Ve;Af?gE!F**bi<(N;~Wjy&ACufKNAsZ&WcIu$pE~;>lp#8c`$v)L= z8qa*@AzgWU^*60IUKfl_J|Decs!}3*8X7;MguR6wDb5A56qm;=jx4!`d_p_*Ca`6( zm5AV=&PRK-8J07sE#CuiCaUSW<Ff+075ldp`n(r6hU9;{xRgs-WJ0$7>D{~8Y(jVw zo<T9I*(!nfA=5|5qDBW|fK((?$&u&f_}+oOggxsNj!Sk~$L7U>@mFv6SKHjr#~PWo zN<T)W*lcJ)c;akMMGxs17}b7_v+gb%S`f|X-O=%Qi&A&U7FqP5cPHN3p-3Q`mV<RQ zj*2tPEBol&eO@h<ex1L3!Jhr52~J-d+;O}23tbc@Ja?S_P1ZnfU#GmCZ<KAK?K_LL z10=e3QmQcB8lor+kun|ISn`Zt1Nd;x(^*|CcWjKnO8HgfR&mOY8Csz|xj2grIy~7) zX7l!!!Qd?ep-*o8v1dVRIQ(3{+MfjQqRSkh`%EA{{{h%f!M+k>Ik7D7+^}D5C>DR= z5qL9hT~4Kh(^A2yvHJ}_^d`hCeS4bmVSHP)d19h-a(RL({GKOhi5aDGSnm^GQEl%x zl}5CLfI+U=u6cV5_ar7YLj<O7XfkPj4z0#JKawH^gA-$a$S3F|YGVqz>a<wFa_fnX zQlGpNCUMHyfAmbDEjyfD{|v7JB3&~qK}563!0LKqa*!kmR8EFOlW86pf}%+#jnEwM zq#uoYakQ4^gat|3#?vKt5^ntz#Fg;lP2f#J*8Y5El$*^%c1y*~K#@9u71lD=jhO)C zqb045{-i{QU%Qprw*UuVdqE!1->mb(q=e}cZ$y0@&gbPqem&*PKlw6&#U$_U7wP$E z--indRLk9$KWXxO1N4_&`Z1U;8e16UFdDl>y~Z3>N0(aq0Auf$WK3oE6&E$1yW&rI zhcIrfVh4Y$v2|Y-O<sGi>~oAQld>W^IV#NG`|9sAUNhzb$$da$$QQBY8qZo%%>e&g zEbR`e${0dch>OL%NGT&S%iH4i?wUHmGb`+&h`>}(u6UKB=YO1He!AN5*A*xw?fkca zQ2m~Fi|<xwpd5=~?3)^T|IhV)?!<BV!*{s)LIA-0YFHF7$~qm=v$+EqLVdXLD#FoQ zUPbwyDAJx<WRWGnFN-!L<U6z$3O)W9V_!)U%FVe}h`ZS+_5MI>NbVY8T~CMjDWKbD z=E2ClEPB^VaSg|2RZc%d`h=PFt=^WGO)a6{?Ysr=D1W0WYklGgsZ4*nw#pnmUCN_W zF|8lyOpgwNe6RHi(9|8@zSpO*zM`dK{IUte9PU=r)2pE7g&z=87{6PVqS5#GCcCHu zyGU(%aX1+0>^D7Wo`xq%b=_{*>AmC=#vvI5|7eW#57%<Zqp_mh@=r9q^;MxW-|km; z3EZ!~5N(-Ch3{)T-X8R+b?r#(4D3tKTwx+V;$Cu)vw}40vq5LCgX9IDUUrMPmrkC} zSFh|7H;U#hO%?3}rH{q#6q*VW^SZnCc;7^YIT_^E#&LiXFAo*tv-EK;^=}6B0)1c^ zBr0#UBk4eB*gqXR&otJdm|fWRu_)HM)2J#LnOYr1J{85Hg0~YIL$o_WQ{Bc)Y+r5J z*L(`56tyH9#BYDm8*jrD7gunUjGWvb02tS{@_d+mWFwDMrmpBws}GbfO%Eh@^p85M zW!eHMHKC6vW}#NzcXl{Erjvt;uYIqi>DZg^U~G4!E3dc0XN0DawCyK7;jw;KU+?A1 z=2dEMJgCdYNPTEmFC<>IIluA6p<d)GsElAKBofz%HrPVrmxl+L;(~WnpH8oDfPyl_ zZRt^zZ+R{i&}mwM4BER<sbtlERgzZfx3R&Jjs*m;`EyD}@jme@$>CQ@|K=I{BO^Tl zVX|CX5}=a^{3U+Rtf5fHa2<BuWsD-95lV#n?3?22*p!@g^mm1$vNCRlFy+5mRl)`D zj3${|_KR?f;Og*VZn!fC)93FB$frU5H7JtFN6{!jt%>t@?+>P>YmkRL-U#rVweJzo z-a$xG3SW|{%<*)S>|^*N9P&vW<8Q~#*VX%HTC}BiB#i8W@xjuzDNqDwv2?7u*ap?6 z<jC4)a=f8hNFg%-0Ym>2-T$ux=y=A@m;MKiy)Nw_{d_SYa*X|ErJGNGuGAYhH~)t{ zpJFof4;*-zVv~d3BOa=1DOPEpk}0jJ)pqHzEL9o}OamkH(!;uoQujnPH#_&MPk&e$ zp4HCIq$Y&ij@lC1Rf3{UejLsPnO}H{30#moseP|LdvSKzyh=k4(V-bf+ScEBX>RpL zh8l7H<M$lM)&S+k{ItKWSly0M^|Mmk{j_4G>1F<D5wh3*FE@yMIj0!Y5-IGF&*08q z5=Q)KE|HQ!e_pJ>a&O9XK^_>q4f9eKzHDS+3f*Y*Uwr(%F=4LyaUXg4Jvn;S_TXz{ z(GjSlO^`mK)Biyrz1fTs*OY-aZDn`8i@RBj^W?RU7*8Xj=l{QtPk%S)MYC)P+^~v8 zB@7wZ(Zv>O;DtX4i7meG+~}DISh~Z3a&hV$D;KKF7&?=Sh<nlT^D5BY$WJuf7yCRF zfHn_@-?OLcsaxd%`JIz3JoGTDBnjj%&P7FE6yEIb&hg}~dwPRoz9<zh)DCC)^~a@= z0|4IH%Qs_d2$&<&Myl3yk>D?fLm6qA+NpXvjti~?SKEbqnB1DNIdN-3X-t!XzuU}A zK#j}_Tt0I=?c=}NMH0(D3?T0Ozb)qfQiJbsaj7b@y1Sqf#!|6wD^|};A~8aWr`7CO zxq5MuO6gjaBCu!|=R0!_`IVbKMMV#VFa*@(NM{OW?QE>PyP2g74!}4GZYy>9n98el z_HXjs{zP+LJa@tfd#cAd21_e$!s}+|CI#l^5vdaLw6Ct&LOiCZqL(*~PsS2(?c5s~ zbQh;8H^KYx?`N$~U^FI~%4Y@b_u9^!qKWm1!!&{48N~4jX||bbCfcC=P7~ulDt)e8 zK2P)D6uvSDV{Wos<(JUi(k6@5$o|qkpl=P!o-WC-hzGn9h6qE%n>#Ume*Rz}vR^NT zYS|3UiU*pg8y7q$s<SJe5ZQN0w0-Y<DQLEEVb+ksTAz|agDHBtG=v5|oBE$rn6%RD zQm!akjYJo|AkhzU-1>E}G;O^;AZfeLir?5g4i$*_x1#5N=e8fX?YFev3ih6NDGOEK zEOIVv7N+tq=)|tuoSp0vhim51kN))i>k40^bXK1ycjl+#ZoZ7Ki<lZ0IZkuc%*XL) zYc?$oXJ#82XG=$ef&deYH<M*UnLp99#VR%p?AcK44$MLaNpJceU517A?b$rc#<(f~ zW`x(OP*`=0!E)o#L(G!bx^VviIU{2}`z%MHiZd14^y>BLM9h70+fEW&_-6V_w<(K( zsE38_h<wR7f{%4)?V@iHaXqrjxbICx6auY#y37@@<QYp8)khwa@F-P|CRH5XYF!T5 z)s1Y5*wXWon9}2jy_;6Ej3}@o(Yd~KOu9WW3A@*8iT26E+b;s@lE5>l*vBBS_CrK^ z6#!whplec*U0x+s>izLpj%E*6KcBGoUaEMpTlQ^<X>SgQ>#awHo`M}MQ;~5O_NU|h z&H9Y&Q7>^)BtPw)W>YZ;3lm`>wrX)q{r0-{_holNe}gM9Iy=|3BAZ76E?~q`CSD@i z*2H}Fcmyl5Z3!_Ax1H}8+<kAahNIMQ%K|&yX7P6u6e~-mkQR-Q8Ei9-kka!&<IL23 zQex6%<8r<8sAf5?O2Mb)E&kdHxe+5!mF;0KgrB~B7fJ54ca7I}HdiPlC=jcR^{mnm zDQpUww*$i3r|D)D_;u$58>ASY0~4|j2Aa(_yGe0}V0{x~sfPq(cGLd2QH1_t3i~U+ z#ikqUWH#O8(IySsynZdmsuCy4k-IP7)5F02RjUN;14S6V_<`B_s*Zc13q_l2<v8N- z>W*_)n#^-5!yNHufP<R4p&mK#?S`_YM!yB1Ffgb*?`>>jo~!FBxQM|X;~lCzi{onH zndK#he+Nt|s^JG#5zDbj1q7=EG$Wf2YB!V22*rQ`Rn=sFz<Vxba$pNKB`P8N)u51t z;Oc2P{RS%XDfq#^Gv|LEUe^t)+Pj?P-gz_`dJuAIO9=}?dHpZ*f5$JrE*SSYBV#)x zaX>n1N6D6P@OWZeRe4D<|9+@#^LpFuCUTfZ#56Vd$d3{+pvq(4HL$k`84Lt93ug%Q zw~aaH51xSP<g;^HO8Qe5(@P8uB1=ju|GKh5f=wIz7XeXj{4sN0Iq&@7@y_}CWEjqJ z<yfgoYfMI3xK6UCQZH@+@w7f@OGTm+@o}};k5cls<j@j8f#hF=%=0mCS>+--2XInd zrp5-Q@+yFTiK;a8{}IP<1pas2^M7a97KvBFEE{OJJA0u$yb|5^$T4D`c}-EO-P1}2 z9(H2f^R<-n)^6`#z$__+X873?9*tTzgs+Q778oS9S&KGm*|h8eG_eR4R?Y?Hx>gZ< z2BjoYD`Z#BT<Pg{in4Mtl9dLR_?Ze#=EY1ufo)`^lgSo<@69}t-r$}S<+J#SB_p&# zhrJiw%~3ATLUU8|-8E5dbRZ)|#$vMCs(}emT9xCrL76@{F}93(f^=PyakuXOmq__x z)jv$^!R~)Y^#9*lkobJc`=4sY|LSwS#7AU~AIQ(2za-8iT)YWDlxGO}muq$wXc}-W zbE_SmZ_h8;qCkO2OFcLbduf5T9sWS219uSG-n)YiaN_&*BU6V|)P(WGhH|W?*izuU ztYq{FFsCpFVGd3Zz~|1xQVFSxlRo0Z9HYwOe#KQUl0extpwn!xB{Thy62FAsm!Qmz zQs~3yF(izKt%8OmGdo{LKElxolK|A}`-VmM$LGt|YK(85lL-a4yDZOoh=!&>hs#WU zMv%;4Z_T%v<#RdUPyU~bGP-6o<@yCgv;ro{>Pk$jm`~QvO<L0@Q{yvieId1Zr~Fkf zICZ|4o^9%rt6SIIXiAHJr>$xG8DxF(-$`pDGNeQi3^*J6oYcOITR|G;5-s)1<jsl^ zwqyIK+fA!iUpKQ<DqAjaz`GWF4lHeTQa!)`yL-u(HW?J(1MP+_v-*+)2}6QDFn5i@ zv6}Jc;U+QxlT(B3hjBG|beKa(Q?-5=YXqOXQ7ldXjT|#I+k6lj5i<i3cJ&v@6GIAz zU|S)FeWSK|(`E_-3~)!jA@&i=ZtGr46NhtcQ^L;R<N7*H1|=as3fN}~tBpT^2?DD& z;2t0ti|h-Xl^Ly!qt+>{vqzrPo!j|b;59D6=~I}dR4=dceg91fMXqugxDI3ys--DB zs|-*U;kOf&i{Xsn4<d@*$jNbyPpgO}1K=REt*>Z>LSn#ab%;gPJ0<Ws1l!n!cEs3t z*ChtK5*ja$KY?l*TKoJCTAj{RVbx#wh6mTdDw10ON}QfUS;Lz?wD#xIExu(3wTpvX zuR@{zlDq`t49H=|@Aw3Yul)6DPhD_1i<wyVmhYIDQ_E6oo!?e;o(_vU__gK$2Zc`B z<JV^q#l^~MJ0ACt9HJ28%V=l_3h3MFlnoE==+yQ5T#gk|4pb~_H2!|u1jObfSm221 zh=m#0I9iU=$t*u@-_x2BHui+EXY@ZCNSglzo^?YosYgR#SAG`>6xz)0ML@MEzHaC) z*yp9Z-Tgn_4kK<LGi%%^DNpr=-wx)e8M_gR%z7td{RVT2AW?r(es(KKw*(2&WNv6w zINEF$GgJRMj{Z;1l#W7VZ7Di%_|CN?TY(0)gk=|eWQTH42&bEO37);ONxJJ~umdB9 z_Q?(9X~~8N=4zX(5(B+gO~rAgrahiY3^!w5*(~c;7aO@VMPiPlQ<EFaZ=ViU2zXV* zTh}x#2@OKqG|zPRTi(q&iML_g*89E2fzc@f7lWUi0&nM%12s2v?S6L8A7@v6`U#nq z;2VMcRMMl_)e!gIhw@D_9x#p@mjm)i=v#KgE$0({#r(SBUI~nZ?V@k5_V-<Abt%ur zJA4sGXDgP^ZSHdP@ufS+GtK@IBRfoPnnT++d1sFRS~)_}t1ha84yur;2Am2MxL`kO z%U0^tBuEn$mXL)<FEf}W6jba~KlP0!<?*0obX%LhrNbC9+85*^s`qX;TE>*$Uz_^& zIDT^_XJ6d20aavk5o48iUMiePmPqN;Q-*)NunoZ0%f+so@3#-1i2WEnqq4OJg4>YB z&R)%LR7sepTKG3-9-x3+ch$^R+zxngp|GV}jRXi3GAtV7ehfJ%N!#2p0ja$j@YUJf z?+J_U-Jkyf9AN8wm20%c<%MO9cvKOIFxD&m+-ce5n*7#?3~aPNxo+qgKh|Jk#UJDf zbWNvdJH~&XRh*GqR9r8zSJs+;erb5StDL^9A*<W6yH^}1<9!|jmYKJx$?aB@HHO$d zx|APP)~;ZAirnix5r_e#5qa~leNu3h6SUZFxRuaoh_+v(75!(xS$Ip<7>zODZr0H= z4yUZp8UIJ!suJBKsJ;aLYo`|gS$3pDOrb(=TlAAb4#PIbjmttO`HL|Vr2<0$==5@( zz>s%iOUi2Os=_jc+r`eRaE;J@yYVD#&ftekR}PDGYNsb+M^L+XaL)Tg;r#LY+M5+I z6?rK6qV7K42Db`VV3=S1qJ*ux1Ap9V@KCdyOWwA_u=V0r4ql$FJO4GAe=sjF-`*0< zbQpWlRQb3jx}`2b;?|tb;(gWx)<QNNk!sG=pv}DaaXntgU)#EoeOB3SwS~HS<;46X z4q)sOy0E4?ppN&wY5ElAeWt~@B!Y~rsdV}Z=@+HpUn`f#F{fmZX!jw9u2tlaS^78< zdpeSTp)|@ioYJ{bj;Bdas+K8<{qZBw=&n45q7Ya29<^vy=W_iyCLXleo<EyB=qJN- zzpD$jvDLi?c@ysenVm%LW|^W$>P$u`(p+>Of6JZ;B#c|l;pIjMF2k2)%`3AaoBZmn zjw1kkt>5NR-lmOP@UH&gJZ5pMINV6s@cAywM8x=v?L#sx5{n5)D|ssrw^xS9>cGF7 zWJf$*oK&jm#JEAphF-7S96XQNH|IH<(~?|Lmv$h#93v9d<?DJkoAXB}oL*yA2PTpB zTYLB86{nrnLecXY=&=^OHQN28d?aH;YDy_!Kzd02w9e<qHvWX^qwoe+w7F(cdWqAg zQp4bZVsrp0JXfSEJ@Qkj4(nuDfcSUAuCa;-)Y6jGnSbV-)kY_Sj|jy0CgQyiR{DaL z;32>1q-ldMDt`*i+^mzM=4!dc8>q%DS`5i~%N5tOjGJ?HO%0yrZ$y~sjK^(g)edfX zfQW!JvFey2p(lz9ka8$}tPIduD>N^)mh4s%kXYh@{96Ut-S}>N>ls4Z&lnqWWY$o9 z0Ja(BQ`QaOaE8J8|AnpPzfi-7(DwCjpZt?>O2_G-6@;3(t(<5eEHN9P!k@ddGZlWV z|LEN0Z`G=N@vvH&YE?7kWa|KBC&3ZVf?O;Rbrl#=CRw4qmB~SIwWKzsLy(*}U{MHd z7U*h@oLzOLNy^BC9;F;}aQ*i8ZT{^=f8(HU1rmPX`*k}mhh?y6e@5u}y!<Z|kJ?2Z z8?Ct$G5#lWC;WhUJDJ$lUZ2mRIn}udDPVBMvn^(C-}qdMRmZA%Q-x_3f!r2)7KiiS z_InSUl!(9Coqy@v74__s9%Ix?d|Y#UmaX;pVYWUS4-}^8y3Wt>sgQ_v$^$h1b;T52 zxH_J}7xG~Hc+uO>Lw;n<_7zog4F>lk-~;peDZT7H`mP%m8!-yWjb~HI-uJ&k28-R3 zhn&~5oFGL|Y+{X+uV^hUd22#*xIzf?vY#U`XUcr=`69}{MR)m!YktKvErIsvkWS*^ z0Zlv=TNp6gzgPfN{vr|B>wny;m<iJA`uy{{WTzzSita}lA!p(6+NGvDBK1MvEw2-& zX_c3T{yu)$GV8`I(VP0q?J#f&uK0v-OOh@z<hK)9_<{LDwgoQ+Zx7QpLNreX58b1| z5w?eonp`^qICd^Q#0R$!c1BemhWjZ?<D%M9fUz+pJ!wLlH{Pdv+4Y1toVHI@GdVTc zc5S4oZGs@?p^8!s&Q@QgdL3&vYZz<&#O%`bUbgF%JH5*23u-?Ye}XRq%yyOWt9`2N zv+Q$O^|hN<ZtADzCj}dm&L6D~b#n=CIkVOwbIK%wE4YPiZ>0yy$Chn@9hb5k6gvCb zVk7)^9;y$0*4e^VNH+kiA%Xy-4D&&WRL32u+$PR?1x4uSv;8>fWz%1>IMqGayn^PW zlkKSz*_v;y*HmQN2;#vgVW%hc+Sn$=9QQhu(e$1TL73!^H}9@oU-!%RUWKY-W__+t zS#>VxGmfdkQRDANmA-$wh(aWP$;ry-U|)u2uQJon%D0&&evfyYvTs&=5EtvrqDDa- z_@vwzgl%P6jjSo}n9Ae5TB7?Mw}MFt`_uc0m`I1WD`Mrr_3Z}+_kdHed1(<~?bQXD z^ov@$e$@|MyiU*anfsJWrDdP?_1lVFnm%VY`|FC7k6L&+k39qcub6Vyb)P<i4R@{H z?A=PYpcAX%G8Zr77sl@1H9BH<LGDKDj!3_)e97`g!%-B<yX++bdJgg3_<Y+<J6*2E z@m$-QvQZ+or!J+xTRu3%iC8&35ML$riAMH`eV9t>mf(<bsD3hMo^Y~JX##9~>ntfW z&@jIG`OBMKtY!U|31_fKsuZbzZs{`_;p*3D8OHTOUm=AtPh7t9;B|-ChYQdt!Xpp( z<#Y;a{^0#E;4_8U1>Vp({b-#pjBB;u7yjp$bC|Ki4xsvOU<My+^8G-?j9MwP$3IB+ z!jmz6Xjg*CJ~?hqR^?<r1|zr&EKiXAdanA>W!24qb*}U2LHFWknWsSMkI&-X4Nklj zXt^QGq``f^?|f9Q@xp570mP^*fZ6aCaE59<wP!75W~pQ>FM9R;D@EM1Tt)6r6|$<~ zT{XwfXxY|9cEXgSj)uN#c!ot@ACKv$=4P7CMFYAPn|cxB?WO(OzxkGbzW<b(XBNcn zYq7v>7S~*scwHtTm7r5XS4m!X`{wWD$lCf1=OlqtXRLy1%HSHtPt?4D)<(D}xPL-* z6v=&ZWRh5$D^yyJkn@g?t4)75c*=ij(DFIT)|3Wu%D+!G#LHTiI&k_w@jDon+O8td z%1xu)46cklb8%WNi&xTN)e*@JndYQaz<tN40fZ|5-aMs#I-h`*SKSFo+oM@dstSKy z@!xfp`*5h3<I$3R7p3g2<a(rMTOG0PrhM~e@phcy`l0BQGPO1AG4CwKUu>zYn1bOb zFBRNw(Op_xwrGtE-WyVgnai`l05{@f#6Lldzi}_J+Sp3mjUUo<R-oQ?shWjWDqmVY z;Hj2$^X4Uf*?a<;g^PhfN{Z{#0hGD&=R2lS`3;Ianf-z;(?&jV>pKLUIJS9}P^gsp zT$3O7hNMS4hcU5wb_eNs<a8#D%Ul97!WNIscvJ|uGU;pQ5tWQGL;PSLM85~>cmWAW zY|)c8Ww)`nmsM14Pe>=TTlolsM$k!FD$<D?B8mFY6cZ3B0UbnrhN~g?ClIHa{G^gz z3Jc(vy_J3L=m)od+f36csc2MJQ@p@;f%^pe@+<?g$T^95JQ&%7k=2r(yO8(5K0TJO zpUCb+#cMubD{kqe%qri9hj)LGzbO~sHl*E<8<~>sa+h75j7qVCxI?tZ&(`%XE(J@= zwv`4tj|~%y_qEn2oe5>lh;shd%I}f2w|1`y5AC@X{4xmD^<&|&-}72{?F0n>)Nkh} z<@ii@$VS)M<e<g1r&lJlulzG8s(3brp1AXz@W5FsR~IDeJmemZg<`V7x!mr%^C=iQ zsReiWbQ0Z%x39C%7BbPJ3K3Ik^SLO?x^wUqzwt1ar9g0it5_i<qe-sYY@$A=8RA9? zcd78FKCzb-(`p}7Oy8M_P*R=03@(02nvR>B;ojeJMXBt#us(oNK;=6k!aPRzU-Z8| zVki{P`~X0v8~!YA`jG6~O9G5fI!5(LdgW2eIy!!MfUmt*MdXnAPa^-iGD0}@J|Cfx zeUH3fx_y=hQ$0z!T%aX%%}={%#6-4hLqxiGiy;*<-aFkIK0}K~=&cTlW~V2YXY{zV zc7!$LJ0C)nYxXz~#pac=V2N|lXFtzi>Oh01<2DLUeCPEq6+bpN(9f#}Yf9_)9YHW? z@?05SGBCQ&TRn)&GZwnPy*gALP~FC9XCULwn7SF5m3DAGe;&)yRO(W*t5m@iSK|2D z>j;c=v#Kxwkh4iT52!$Ginh^Od0f#GXL--Py!=ED>3UkhV(oO1GGo*AM3=h-HBL~D z6s1uTQ=wel+mnsK$@_uW%vY;!Fk#|}`}OPvnV{im(d4?9GRhR}QiVW#{KMz-&-DXG z_88ef;<?b)7|sxd1~+ABKcbDMk^;hs+zJs~+!lEVwAI2t!9X}Q<wD-CV^!lC#>MvJ znQt|^=N_s*T^!H}eBc@*cE2J{YzJX#ZMK{{C#zUTm?;r6?yX9dBN}kgzg%y*+uGdY zQ)dmkp63YNwrDY9sARI1&S@@y+)dR{$+B)3FDqOxtQfMIE<^~Miet{2O!a*h=_Ta# zJ%$*D{aL3knCd-rt89%QLTVeF5O&;&8&eM(`a}rqg*O8iy=V;Qzk~>MUtOqUF7KZj zQAdu~R8|_p-PQ_Kq?v0Fc?z}8Xt`kY_X0S#DOdil><m#>IDZ@`rJZ9-QM8g*iEE%| zH*3>bUWu?~$>jD_Dh15y`1Bxu^aX4*HNtZ8rc^L?$gnn}@l(xEj7x=#{&H4kUJZ8p zhURxwM3~OyOSetj_tBKbZwlVdjWwE+;-I0g@T9sp*CP0iT&enl`klB$V>hROZ`B;A z$Q~<9Tn|9TA8K9Sq^VD&^_jA6%Q7SORQj(gzu^(q+Vbj^@{B~)qyV?pnz8i;FUHSb zqAl10<)g@s_9eXAtSh1}SL4<o9&w<wM0K{_bg^Q%V~VrAIoWsY#oAr%QtvW6k2f{! zHA|7dutKK0%AKVaM_>38i3GXFIWmK68%ikKdp4c?&^(Cf{g0B}><m5RX7yjrwFc3^ zkWHjMm7eSZFl#`knG7tZbn5G9bL5(WR;~}{q*7#1Gm6kwLu4u3i(Xf<!=XlCGb~*f z)K}HV^OOWNhDfF}%7w~Niu?@&VLq#njK;#WigaRaYKi;2o)p_M8Cv1(eV`w4;fOJU zszM<8(an3-3)%ecSaoxZhm-ak66$DYp&I!3TC|gA&MR*3>RO=Z<bc=*8!b)=b{PaX zqed-fvKA#jk1&;@k>23>Ll4L1hF)I6b5U!Ir9m+VrPB|WY&2i={*Y(B3UAoUWQ+E% zZpdA0YNh-5TJqaYnV#jx^$8`?q9d=U)11q~+88uuA4QZ7G%+^8`zkrJfo>PGas0>0 z^GdAqGyJX+zXWc6Exvl$%PpKO4KLm#v+vJ;e>26ksstqneLD==q+08^BSkl>L1Axh z4W3G0aGtn~cptnCt&rzb`|HZm*=e5g`{2Gkwo3H3lk{K;HYMnc$eJL$MiUoaO5|P) zR^{&6LQZe_i&D1>v*55a;~eGHt3HqN*Bq>YJ$QcI+3b$&pz?DQ#+F3hthA2Lei}{g zyUW97I*yGCyi@f~zLiVsnw~~7JUSJF{(3YLyUB0J7J@!%Vp?tSM~L8;Q?UD1$%XJE zIe&s__cew-4)qR}Utv^Ty(YXRxxh|@L&Hw7S76mb<Vn=fLcn={&s083vx8=<A^}h_ zP86+lBxJ#b&{>P}9pOPlxOvIDb`hZ#gE?n@Ukxvu1sU}C8Ao=OOhF3zXPmV-jlbYV zGx;hIWXD{Q(jZbRBXh!R7#oo00tBn&+Tw)f9o+-*S<`E1HI;X4;szIp{5|I^a;R*Q z(h_MCs<Aet*5fEIBUKF<Trf$(!#4+|WV}ckUrAX6Sb2|bqa&^lZ8>W4b`B>jZ=Uwg zl}4?sirKo}ch$`1$lNd1zXw@w^xTn6N;?!3&#|K|;W0FA2Tj$l5-7O@#r$=*&wH8{ z@7o;ZKImAGGNWOc&&|qgkZa8~XQ@Uzri@a#9#8y0iUl&%))?h5g{++n8S}Cs3F&kE zz_)vywma|R4M!}PA6Kcom0gl+zB6j?-mCW*G55vSrejUBN%*a;$h6nRh!GQtXt=Rb zNPn&;tqTdn^FY5^%VS)fF$RUf47w_M1M>sB8<G0Z4qdl$ik;Z{laF@Sdj=Dm7e+pH zm+;xwEHl_X>+plJP}G5sA&G8S6*3Z)LHS>iKzN=shWlW4^>a@!0~<l9?z?D!)m{n) zZbv-_-tTub^=goIq_>PO%D0(e8LThr<p>k)@r7M4%5dv5L<-II-*4DW=Z!6je@@`U zCQ3=DuuNQ-V!1D0Y|z_FuX&8XU}`%Z8T~3K*c<!3Wa>_^|Fgc7*q1lQK~atp-?Q$x znc&T@g9f3jmTwRKti4^0^}oeixV1tZ7)Ar~sP~l1r;f!TK8^bY3jc$>_YP}nTh~W% zxzuGrM35p)MM1hqCzPcKNDERz3q_<82sM<@)>7$BdJQNgl#n1L2@s0(63U{476{UN z@70^N_dfe~&OY~?-@VUs&v|~&J$wF>Su*FCW6U|e@y+-9#`}Iz`E`4<kc(&UqIgzG zF6QBe^9uf??6LdY+d0-6C2qrCW+_itX01B0uF<i%@9gF*XLS9?TZ>d6Ch4K!$QnGg zucuC|TgaX~uSYCJWUFV<8Zucvj6xT0w%dA@tfpS|6-<`LJ@Nv!c0cbdG~&YwcDNsF z8!6PZ7?W<AN@IUsif1y`kkOJCE|Igt%LMEWh(!1)e&mojYHkhao@Ihnz^;lUDa}Ks zb^CZlVH`b9nS+9MMrnrIt{4jU>*_tefDx<;4yA$47oZNp$H?bVSv(#os<9&f;Am4f zFKOL=wQU%C*14CTxeU};^_fJWvR!ckkG#W(YICBuhSS@(udplCS1*W)UK4PPO8!#> zE^>fK2!xZP6V0maR3YTd;t}m4EuS<b)obuNoY>s6ISJm<#;=o3G#)IS*?B9x-g~;_ zC*RlPhq#DpcvFA<;Jl_m%_?^rF>%cOho^kj;<P*!>r$~OwD|cnaMB{LtpBKY!#{3G zmb1@eD{C<*S7b=!eLw@Wbin9u*W;kGt3J~9Xy{K_VQy5I!W%9NdIpLSvLC~5hgM9S z@m5bQ5%+I?&vqfB_L5~4SttAA<*zA?Z3Hs>o7>~yirQH0<oxhu?NIUhhWE+y^Or}w z<b##-Co!>Y-X3$YFa9|2%l>!>IA;y~;?J;t3JZ*HSDgh^@2GzMXN~^(jQ;1ob<DJ` zS&!U^!3v3+ER~zgSby`pVT=zfZ2>Y<cDMR*v+{F?x}bWaE)5U`Bq7hMY*rZpv2n`T zQy+h#PIeXmqrl4q_k);XLIuL)*mqj4UyCI*!s;n;pnCc*T8F<hbM5>0UGNMZ*Rb6< zAvN6NC6T6WZUO&vcSgwILjW=8z5WG^yKGDK^hqOC!!h=~$vNMi!e&_3><^mNTfAGZ zTrS3PVC&p_FMrS+u3U)Ye4y?48NDqf;a7hR6aOEtGkyguFCy|joBe3qkt@#6eryTT zb=rA+cjjcIzP!HVyc^cOO?T&5o*h!WQqY8yQcNBkI%)QKn|8HyBK`2zIDD4hDMK^% zYTtHMW(8B)i+cl}<h~{?tWP7%xb}s_AG$c7FkwVQ0j${Ac}UMpAB29@4dSTcc~sct z)r35Y+VeSPYpP3nLWF)`4<}Xz`lP(yeJ~T_k`7w9m;T&FO=7KGG_yg{K$WxW5r0l0 za)fi#p+g+oL?rC*nv8z%^Ge=6*wpK^DvBuD$dQ8Yw#Nw>!Kvby42iq&Gc>BnLJe}? zxs0!+9wQrK@m?;k-AwBD)b5>M_&PYmWFF*K?&z}K<XfH8UP-h~sBZ<=n>lDYbTRwZ zsNr1TUV72%9I~|-CfNF4R5B>OxeR!NHOHaKGxjwe?VAj7vwHN#x8>#8d(CgdZ@<W^ z6ztZF^qg$(de!yJxS5q@u?K|JH&i(t00D|%c!Q*TNJ(mHW&s>MH@C(kdQ&KFu7cj^ zK>jlOj=4MB{Y9Rpptz<7jH5$cLtW9Bz_PR;q+1P2F*&`f27tgubQ96`VQHDUzSX+G zy!s@Aq#<_(xKaU+aC1^dX>BdYi`-((_=gc;)z8VSSJB#ijTbkw263M1H%4<@9-B0i zx#pm|huQGI^PTy6l{2!$HRywnpaDSZonse;iw=rPaa=^0yn{I)WgS;h{Pswm;)V2g zw&LSp;L;@Rhf=OQ5tFhHcvh18ypEP=56-*0w<C-!RxXwnrnl+d=MKpri)u~xaZuH` z*!xYYOMt>FCc{T<j~eHD5)J6sgFj+JM1q^l;Ecs_TeQZXb8sfuRemZf<|efE*NYGe z!*%7XJ8qkB{!$yA9M=?gq%0zJ!nu05*h+Q=Wh9&P=v~Be8%UGne5?^_-r<M0t-bcs z(=I6>|2n`gz_v#xQDr#-)6zQ@Ucr#0=5MWU&CRs^X?tyEHk}M+D}Ou5gVw>}4OVN# zb#N`~=)*}crqs@Pgc@dXhL~gx9Vs?WUTV~$xBJ!A>Pm3`2?HI_V9jz}$CgAdCMH{{ z!#KzQ(vtwmP^m>FKw@HIim7EMN*wv3u-VF_)s$^KuPmxse*|P!*jtRWvv!KH4+|Tk zqd;{qs!JhfjK^GUgD(D&Lj~;{No%FGu}SMG*N5x&^LpNWrdpbRSc+ozDM1t57mwMr zDWwe>r=^<)y%PT-ZGY$Sj67I0QGS<Gs{DFL`2|<-^s)A}`|aQT8-iN(y1nbvW)4pU z*S7uYrVyKEU#r9BON{WzrqR{8foB`0rSfFi+Hx{MfubWJSq(_x?~{k;lwQ-&k_qbf zI6Q0k`fcGaHzUe=?W9@ijQ$B#rwGEdw3)-C*r2ohC6r<GP)@!6`mb2+4e#)vp9{`b z3M{9+4>Y1K&J}-_NEcZOD5d`jtQw_W<TBIgxdk;RI2?NcMViQx`tG%_EN|s4)EUv- zNIn7itO;9O8f0eZ7%kw7wP7Eyi|JG0&sl!LeN&Ri6`lAl2c7hyOO5buVQ<yldn}-m zfFl=~cMaO)E?6a|PBHSfsCZ}s*CyZo8>gw`Z$8+Kf4X%4bW%0`>30AB<wGLabW^Q8 z-$MI>c1uLpIg4+baDR|Y_i&za1+(C8@04w+B^wZ;;ebAk?`V8FB1qi%W$q6TnQ&F< z;$&{ey=ru2{vK|1onV>kX1HmQE=)qmCdgxaw8OE`NH_5|z3hCrn9=8du)=?CdW511 z7!QJ^PCRz}B2H}D1V?Pw&n)hRwleqFWWAVKCIpX3n;Y$v50pGwKvbxdx!xQgmN;Ue z1~{^bE>&M|Ti=dVu4P^b{KxJ`a7sZaFhHX<;Ar)RZ-r}S0i?UTv~-bc&Zw?OOe;2S z{>`3^z>}M?1T)CHdEK1hiQz7zQusJkq&5YlX~W7OLyW9@QFCc$<#JKm^`X8z9+v_v zr{_h0Rw(wFd~CcmOQ5`Me{ShD{<ttDuGSr%iYlIs_kq)b$*hhN8-Tj;qQd;xb*&WE z9FN|VR79G_hIx729mbVYWMyw}jUD4`r~-_Km9tCavC9+Qq*cRV#jQm<n1W7XYm@4{ zi>RiznCmh{@smXCuG?Xid%jiTZUj$udeQJ!oQw~<bNcs@{C%860)}I80y!K9*EL}t zRd|7Wi~|<BNGJvqpix#G)pdvvi1%51(mTS9B1r3yi<%lEBZyZ(7_kqmb+1m=mKi8( zS5f$sPRP^du-TtrQiT#HGj!E?d8gRC%2JfR#A`H*d5&<jl-VaSyVu%Y`;gDGGt7j^ z-<XtvFOQS7yN$;1vJRw})2LoYk`wf|b4yuI4?kOXshs+$CX-dIQeOGj6TSzkzt0Y) z8n7j3^TtUJryX3!zs=i6Iz+s4ISp6pz|~E}rnop(Li^k63ux7IJo1UsspF9zLH%W` z4}0Y-3^t)E?x%)3Txq(o?kwm~x>TFuX<5HFj>B4y3>!sh-x6<=ZhbKYcJu<0d;vyB zK0cKrb^P2``TP|l*K>-<VwDj&ayR*5;>+N~{p-tmVO!xCx9GQkSo7I&S?}vzNa2)# z-}1}%6`oJA2R1)2coLuB_-=4(bKclwohedq;P4khE@&k-r6F+;AtT)~FY*!2y|=Qe z*c7!OpzYxjwA_>Q&0p!Y-ThPA0T#^b5eXHkM`?%;uxmDYnS)2QtKAMP`L^_R*K{Lt z9ieCq;&AV};I<}+jn|{Q8@Rq1dLZ>HXW^ujj6~Tn^B*bkM{P1_T)<&<#_UE*YOs|6 zOXrih$3}03a}R_i5?8eHBN~N|$KSY@ceV5>JvwbHKPBacOVm1&7^q0}a5yFQr6<ek zH4<Cg{R-%Q-5ip0MANaLo+`sty0DEu7Ff!kXsyd=6_xV?&3=Ms`~*oGyC3P`6xr7S zG|%u{&k^vx1G<U^0bx+Fu!$wEJn#O<M0uT@Bfzy5{$(dewrJ7Q3jyxP(KJoW?Z!mg zW|uD}mO4kdM(m2b%C>Inu#7n>(u>2^CB977Jux$1OkYmN{~11(_4tdx@c&JR|9`OS zry|aH5#<ewebb(*>`!ii8o+0k`DM;n+Ej4mu3EQNQ_QY|6YZLWWkOhUd4_qeqcl18 z{_2Jb&J4__Zbm^nPgA4Vi~M#^G7lDzBj70`yL3C~J2&Iu^0BJQHr9+8J$sV<ayJ~7 zUXsU(0t;(-5q%sF`(2}#tDNeR1)~oHY*NTQt@^$32)3G3&)~)6KM0^TT6tWJ%X&9@ zPC+|j9&jJd?WlJfiprN5?o(n>qM=5Ja9<fY`!f+?0JX&38`Z!>mD5xTF<87ujN+aa z9&@@4yR{eS>lW_e?oni?!ue~X+it+Z&S08K&#;Ufdh|>VX^~WAOmUM5>#S*iKB3@s z^KGYv)v^<qH@2R?JWwES!W;S`H;CcYA_CBXNCPf*fO+#2^L$AmhCdH;X#2{euw3^= zZy_?z=59+Kg5|v*Pp5<pSKkt@?Pr+_RLqz^sDNXmggb4Gu`#%P7nSg-fKFi&#tT%v zC~M`l|5?gTP53D^Fn#-6WTL5K7B0m&a@5O*;hn`eu8KFhPY9n{yVd3O>~!QsuC;2W zv;_#khVwG(xay$zcfurG?fyF}UiO0p6sCANX!*70@Q3(W)t`M;izT)1--}N=VBGJ< zAVD#=L)0D<4hQ>Fvmb0N`-g(%cY8Ax{O-~0m<TV%47)kUOiY0snhmPP*fJ}S-Zf_Z z+Mg8$rWYUXDtwuI;mvM-w#WooE3y~(%!72V61=j}=(wKjmIkyPd;Chg-mJWwMdnHl z0W3+K8P(WadADvKa~Fh9x9{>mY%<8KMRyz;OsP(JLVJysVS>xPwKG+u?zY>xJnly_ z#xhRYY&|=LNKh!oFJ^wrt%B6HGgb>Jmvj_egM<l2-}gqCQuedW_o?3|e|rLoUWZzA z>Uu?43dCstwYlUplBtu4?UOd2<;0LY$38KaOHbRBGYM<ju|AP%CC5a&wfIk#bizCL zdHbZ)z-PrpdHGp90x0Xh;LK~;60*Ei7GF;4_>P2e(ox;7kQGVMow&8rRPhSdqv$fa za!Ccdl%A$Wt->gZ<~DC+-g_bbu{vSp9C5W8zJXpnZ4DG1J-{Pn;+$F98&`FGP&GPJ zodR{c=BKT9Hd>b`{cXW~jwL6n_i$ry%r&bxB`)l}&t`SZf|ig)eZL584`VrE)j9vr z_pdl}CdqnHB-d;x-6Nf<*E=@B*eksmx;>RqL{!yowjo^RY1s)b6N*fSXw8>@U3}(d zvf(9pS2&~eMtxhQ<2v}>M_|jUqrTZIhG}u2N3yX-B8b)5gpj*<g==qSdG)hTX@WqE z;^<MHty02zQ7y<OOR2}H_K-K3_?&HAtvV(gCOmM3Pjah=y?Bg`WW^FnrSAFCn@WwW zr}cWc8fMqWT0FyUO1a<8LoglRyz~XH0#gJet#N24s{64<Y4Z?CyT;9Dk93A*QY?)X z_z>MitE_^0Ph)XH*RuFKMBss-NT}GKor&Txmbl?xT?YU4M0wI=0d`ThlGKT?Ebt+H zv=MT55VT<SMq68RDkwi0<5Rp`x@UdU)JmjVCn|8df>}m<{Fhc_&4?5p3yOD}aloKY zvpm8kR)dVQBGaax!cE+)3JNZzL2A{-qQRx0xlhrONL{L=M6900TUm(bcabRt#K%@U z!?a#rccI_<Pv=YRQ?lF%c&RDJq>ZVrVvmBSKGg7iiY463UUN3mlwrn@-Rs>~jWrJ5 zFR(UTcXAt7RZ=^sqf8T)XqvxO4jgT*3E=QR9{Q*kPO_Ea%dzECqXkdLSml6+W50j@ zSH_nmQzLbe71Fx-a<5?Ll}*}s(#S-PR$QxSm_Uh##sHAajH&`b^M%j{N8ZNfhj1)z zqN-b&89lu|$bfe2?w2`OfKHa$`SH&Nf<4x4#M)YG3XA9Ul0hSxJ`zt0TpBb_DGuQ` ze*3e?AH#poaO{ScnL4MWY@dJX6QG+pqHrZ_iB7x^>h_j<BG>LW6v*s>>+NH%qa0J# zhb^C-VVN;@Dcp_%M4{seyo=DOZ0#<YAc$LJ5iy%v!2^v~M^N9F9jUsY!c<;~lz&Wd z{8!ceuU!49*lntQ89&1t)RD8A{qo`m&Aer9dEGo->*crqUAaX}o9BnxOc#$lrXE$Z zIIo@GM78g6mzL+Y?xBrd{)un?Hvp)L(NDnb>fgl7TQLT3wQfB?JdRkR)%47RA;o+F zUt}}PZSbj!tWMV0*cL8FAjXGR-3Q+hhM^NkD+3a}{$h_rze?`~tnCbENABW{nm|S@ zAw7C)%42V%LC%Lo*+D&058wQ)C5l3G6!%0u3T7uW0!6-xIpo9FIUoB!Pq{usnib0W zyMpY$YPbKF=qYa~^C!B9<I=&tFteA~dDsYl<%0ZIaJl2TpoW+_@%w>!t<SOW`hX8- zz`gk$mU}`TjvB>-tp-9TVZ4w9Ogz3B1Cfrbf@9G@vyGu6%O--SX;g8rrW73mycjOI zEn~qgt<!PUzhs#ZrCyOXCd)uYg!pLvSmWnP%7)D9Tb+X#DI>&=p7t+ZTJNP}eb(3a zOmuI=^|)+0+Y^EZ#F#eqP+^Ecjs|mw!vb-vjyK()jtqGr+v4{o1*`qLE0;-KDr3-> zYny4_Y)nB;Sx?#n^a&lNH;EN)U>1d>$m(5ub>50N@U%!Mt_q$D+tgj41xp%)k=NKp z``4~dYqOb1U2l$InsNAJ!hFVI1Z&2iJmK|x!Vo29JEi493#ID&3eSjPc=(DlCCD&k zm+!S!Zu7a)LSck2o@Ujp%c~wJeW2$k*1))}4$NPzZ^uxi(z7k~wD`G$lNe3Q)-OM3 z3}?1!N5KI&9dg$Is`Isljp87eqG9bce0XJe#hCmm0ZrNfJIl{ba^1_+baQFx4L(SS zTxYerqO3p2T&mq8YLs3SgQ5>B1*GuGtwe}L8Y~p&kO-c=CDiG<Qn#d)n$GN09M-hF zkvy=cE6(KbbugYo2=F{S6Iomy?O2RJf%ZsC^wB$dzlu_7ONlsK6|$|wzb&_EpB!a= z!#wrg`Y?#S{h3?pJJtXY(!ub$$X!wmtv}10GYpP-dMrK;KRtMJ5f+j#(+~yDq?rl5 zmLs0I)Z+(NWr&JAblx-7d^P=bXu6EWzlM#!u*DQZNFOQA(C>HovQoTxm?b3rd$ViG zhrQ(uCiB+m8eaad2Wvfyq)wai`Oa$SqG>PBq$uP3D`h<i_c+D?KxF`{*3)K|4jzfa zr(TH+9bwG6_TV&2mMr@*Rnbc0U4nr+{Q(X7jZY)j6@Yy{{sGqCWCC5e1vx{#56VF_ zXR0JMzpYYjlxGO5@T1pa_+zw0<$fWuwy=PYpdu`WtR7BFO)bufe-yqvTj`)}#q%+j z*8L!MAQc7chdRdSk_d5`&RIxjr_?bvFW_X^K+%9-aiFwmY(MQ0-;QE5l5)&kq#Zjc zFlOP)B|sKtK>Mw#rMLe2uX^EMSN|vIK3~!gQs+82=c|`bJ-p~+k(8z#@qcxA*gp-< z8^HX#7Ws!AH`3tNidPjPjt*D34jbJ4$L(V}Q7zdaiB-LLPN_}-;N9o{aK?YrCKrJt z*_qoIXKz#&@l9jw?#{e3aERnyDK58;$Dt#NU`slA0|vu*U1F_<OMy2*-OM`^$Vm_% zuhwrvli}Mbj*n`V$Wy)HlUdya-xeWLWHlzWPnN&SU$&A|K`EC1K_eHHl=^3F6n~8T zeZ2qgoYC;#)RO<%aQ_Qu_qfTR#@pRfF;^#c5rfqd5MqE;81|Klp()<|-A;XAN>u2R zcC95-D`2Q5nLH!l5_mE|_JgAN-e43T1PF7+jstbhc(_ub8|n>~?qU3kuU7nuE*Tb0 zI>M9%LtU*+;uVz9_(>De;Eh_BfaKvhjNzh#tN#ohDby;t%wKbMb8+C82Z&X{@=;)w z)?;1ZI3=gJD6kRNG6*C>z!<cHx-J5Hd1XWP#AuS^aIX33tq->AP>HTiA(d{v4zzj6 zV_A#<n1GWf!lDj_o8Qu-lMOaG)s+(<0V^PNGZXNeGTVEZmVUg9zxPQDTSP97D(G=0 z;zZM?^|oaU_~KecC^>gsWf&Ro+jqBD4aN_dpylC{W9G!-pFjV{Pw1ySaKquG9QY`_ z&p%?$5?`?=T*~!FOnp}@^8nWJ=AS$#|Mfg7ZPgKO+%loHFZZ0)uLjJah@hHN7oD2X zWbJFt(M9jP$?zfX=Sie|Qu)+v@+z5<FI1BuwNw$>0xsq?Sx-eiUyQ_|$doQ>ADJK+ zcUxg5L6ca0o1}Z)eIImdy!`f6>lR0Cv43-g{=a2XIq5p7I20Y>YLQc#+jGO9inDK| zPGqs0|4QTLF~D`i>f3+z>RS+p$sZM$#u9z(z9+Mt+m>GLwNSm78x`5QZ_y_lpm=(> z0pfl6Voqm!LmuK*wAVZ^<*ePBZ?h2=AjsEsHho)TGt*h(h=jHiu)ZoKJAi*SX}qR& zAh42eEUo=5VMIDN0_@+~<(=L^pr-$=EDxx(C`$Xu$tPE|-u@jGu_02Xr+xpv9vxzJ zxOjQb_U@dfdmPo%uySKuWU-IJ7~{nvdMC|jr4+wxKWw#FuHazj863{>kq9Zx%PAZS zCuk4N1NbYT@C7RN;7>%x=<-dTzd2diFl1YHhBP{Vv86-pYou%?0Pf#rX70d{S>Xc6 zsEiI$xsUPa51O|=J7~vY$%7)WHDcdv5@c46ewwXx@br|Xiryu1+()PVAUreZ#$Fwx z8U8)N>pUB>HOL^jj1e@$S}0Q@a^{b!^?SnR)>@f12H}nrx7>DII!e1Y`nxc{pndJ* z9tm?~y1@K~U6P*Wh?ZNYPBNN7)AL-ym!#RB0;$p7(SW&^7I>-Qq&6UdL0_3Vq?i;i zzvf*Pik|d;B@TwGh?PLOuE#bH5_Nih(DXl@YHg_79WfgN_BCA)F9fA&Te-@$Z#Lc* zc_x}$1pu<CP$EU)=bPzf)dqDYN0E4p=XhC#g~9VNdc5L#rk-nx)>dgGp$4oywG{nO zN|X_@qNA#zC5mDNBO|=*0PcN=#qt2oI=JvZ!>9i~e42am<_8UaS!;W(z2U&8vFsa^ zFvHtWAA4hxC&~5NuCaASUh!&i`d<z0$awneJOs8*8Kiqce&<kNgGG-}r`PiV$A53c zn84M~A67*IghG0E6xPXEjWwV|99LVn^TK#_WS&S4&;*@{b)zpTJkB|v8*$bQ!F&P% zN^}5FT;=7=&J$~Y@l;&7bm%YD`|(y#MuRvHhwteaqD9_&Jl^1Bj1_A;%98`stpluU zjql-31=J_0bkV<8NEjly2Jj-8+V{yuu>wbvJPDB*8XZn`N_25n{Zb^Vu(<)UxL0g~ zaxv>@495*$r79eske!Ql$1PlqDx%J+W<{R6-jobwI*h5N7|BzU*~k2^J+c$5W!M+0 z-<xqS1n!6(eIzaOf}VEiprl~xl?}}sX6i!<5&yA?rzuK7Ds5RUmBt2^{h;wX<n2L* zt)<th9XV)3t-8(n$5&2sKlo2h|1Uh$GGp2<O*9vQGv_PDa|`wkVe04aI>qosy)d&% zH;?xktut#v!T6kA@Xa+{hXfKDH{bT|X`KrlG!+3cunq6Si+Qd40mcm3cF5TfzAQ;0 zlCmLxW;v#Iwy{VV5O88g+0}gg7iO$$KmPc;bM!wA47tGqy8||bDeNUVEr02~c%k9g z%e0NZ`Yn5<M~Ne4<i-aI86`R-i+3Dk2#^ox$!NA6>+6vpWX$s3_+-HUQ(T-n_ES98 zB)IK}^lgJ>YlSxR8jDYR{vN^BVH{!etotrK68r=fHcp8tzqLGQ=!?;Qs4tkGA`|z? zb7qxK-Qa}Eh;VuJR|VdAE+FT158z!Ob3!d>;MB}mf5Hd}5(!ahU9)Ab!PiW8GyT!7 z7do1{+Dc`uNV4LY)L3-}kV<U;KNSYtGQ&;VnQqv5Hcn@qcT@`u4gmCfoME5*<hfFt z9oE0x%__^CPoLKj%9!or`C_+|w9N;aaaQJ&5P?8eMf_O3-!muvC-3q<5uyJIM2Lpn zbT9Pcs<~$n{WGq1gG#|~UN)SpM^8e2&={k>?WXioWo;#Io?T7ZC1z`1w3LodexvST z^!JN3nQ#nvwudL{Z9Bjj95mRUEbVj@-9MfHAZr;Z&tKO@njAnAjI$KKTI=UWK6H2F zRmDGnMGPn9L$Ml!Alth7tSXq~>iJ!O{tUVwPV!gm_tcVT0co}xe)UvwlWAF5WY89G z@lZ5bdR?4t)v5<A$|?NAs3;uio;edaSTA!L$f~oe=`b1I!BOyGIa)hLuIqrQIrHUZ zwqQHwpd3t&W3|uuZcJA`$Mx$hW8MRF_t5Ckuh5EM4EAwpP1doGTeCT>n@6Ky5bcp= zc<!~vI=0XZ{03<}EESplG<tuMV5UD_0nJ<`c-08?GnnZx9QnOma^`NL6|j1_l;Pq1 zdPZ28QIGv}!PZZIP*V#;0`MXEi)|nAyjvw?zgqzY2S~ah7%mHkbW+Azfciwns1*0Q zumyk!-wQy+WaLAZNtKO<`!NiDdwNbi_wxve@z%YE_dKV&gX<%!=o>LCr-}gyqnKyn z!ReJ2%ttpz;br&8NU`R(C7OFYw<8vKgssYSl=aNIu!T9rr4-~8H+1-Zkdp(NJ4ZTv zW_<X4^9Tz<J}_ctQbKdyecx>tJg8|SK8DRyrY0VUGU`Y`NT80KFPrN}TJHar<W14@ zuOx3yRsW+&-md7JKMf-9A&(BMrcUMFj((Ri+h&-WQVoVCs8{`zWu79!SF!F}>ciap zda~s(wnih9?SpLS-0)<Cy7J&C?TeCp&&pTLGSWvebG2<O>EK}FBKw1gyvn3cYT`Bc z&o!Oq9G{l=`-%B>bo<Ebifvl7g<cuea$ffxxf6_QSdiPJe%Ess&|Ko(UvQ9xcpdt( zYTD#S8!g+`GhY~wTkp6y^Ev;zI+<*QNJb)XV>ZcT8!D@~P&rYkzy?Ql2K-5NgGkJm zUwK2TS|xq{<@kE6K)4G+sMs6$tepR$|5eh+D3TgDP0Amt4=?M=u>t3L_YGIp5S?qt zD5|?uf5d3ALf;l}x!<sa3ut<nui_!}`v#}lhN+dsrttN5$DVC^*Q823<j8m1H&Cf~ zcLoOO3+@Vt^mfJ5YR4L<ah-_gZ-((DF#AvNOTYccrd^*n`0z+{&#=9LDzi~{ny@hV z%1g`q@tJsj8?0)(Ud_Zc?$dvK_J8G(|3<Ql{=a)a|HGgmI=TASuH2Cv>UI3Ud^w$Y zPFOsI_?+_GG4q4c9E+_ETa2xwOO!@TEq_XsHoM*PHeGIESF#ar62SZJba|zTC@Mdp z`btLLJk64|h+3?g;z#H8wkk2w<|WEW`lE5N_szaKbPpDMGbIGom|Xu@lQg*2(Q(8h zdOZhm7pTY`@scQ5`Vo;l1(*6c%{t(@Hy=Nx-T#Uue3=p*8;7@`paha|IFoe&X2<=T zL(X8r!N8tDITk-vzT!oG6Fhg$F8?44DjLKw6k7u2E%eMCnnb5SC?f40m9{@<m>q03 zm_xg`MQ<ra8$mkuh16Fj@=%?7cc^hh1JY1MQ>83<aOCx#_40Mhf;i>lT)};}Oaixw z`~hi{Y!MH4rYw!!)d?@5h?+L3`7S-SntA68auf}Zw&b`wux|j8q}Vhk4d2GCLVvXn zAUeAYo>u6rLxh0ym<F&@l#~o^2o36D766y|rm5=y46U(Agabaf;oyODO(Ja-wd*`R zuRMR8_4NqYJ34AB)eix5ZcnJn5x2u`#R*w;JsIe*eEa<RFNM`DDV87kTdn6)E45nj zxv)+%Wq=dfc@3?!AjdYazoJ&LbCzNOF;6-=Xzp`uP+V*Or7^=L6ED(o4&t?boLz3} zc$xE4+WUQ{uH;IKo<}L~S5}?`y-Ujf?9G+yZ3O*{c;PF9aL6+BT<kmw#cU(!64sWS z6C{E+y4^}B4zyokfdU*Kkf+vGZ~kzsivQ5_*rNY&QuX9;n;8s80)Wt8Y~Ir7hxXg9 zH1tqu<WU9tR!;swZ~dEp(CBe>FAkY(Ui}uJv#W9bCW}}*^0h<S1x!t=e@h?GCpP25 zNlW4KZfU4xqWsmC<fib~@%1{dK;iC?VEE;N1+ET0dFCof^V;9F89Z=1C5KOb8ySqr zA$3q@s`NEc9|>$<95GO3{+w99DKy{cRYJhB6YNU==A-9X#(Vx<`x^zY2bAY89rno; zI&xUU+iYZ5KkL=5VRxU2j~~27EZm)3u=lHVap2ip_2DflbJ90qKeyc?k^5x|I&L_q zy3#Kl7HU?5uB;3y{b^bCy$=e9tFK<qXc6~&G%ochLT%TMF$c&DU5>={l8aH^*ZEun z@~BmL1o+8#@9MP-U>l#~^EXv7YC@dY<xy<7LQDvJJ16B48vhtwgo(zY@w&K4buR<N zZ=l0|kCmiuN`W-5Xn{=d*Y6(3LNAh+!!qgZ<%5FXdbNpmTOJ5>?oH%}G&MhY;*r0- zfW<8`>dq08@{{s~36(-`spax36MoPH47N6eWgd25RM`9!U#@JQ|FXJPxE&y1aHoR$ zm!F=spIeAgQ?x5Dpdn55SeI6{eVC8262qT{UgBW*ymx2ndy*pJ^_oBZMW<`fRPOiW z2K4|sD%wD0$T?}gen!tmO%S(7_`N>A({O&$5G|C&R<?eWcy@;vCq}&n4b3e`YQbHx zRKFGxm7&je6!lsxxD>a~h7Pyh@){ja<_*B3RXzC3Ow7PSTkG|8bt}5$qKd#sX@BLK z92jOS!b;eO;8<6;R)`o|Ct@?(WY<Y%WRQxnj%oLigg}8^gT5anAOr&XOJUSXTQ0?( z-!ff3I<%dNT)Q>yU`|jC=em{O1e5R~+NEQE{oDWk*U#AoLgF2XxY!G>u<ohp&64vh zcOJ(&P6Co$=ZV3Xvd3(nlagvqH_$@3aRV%x@7Jek%OWt)OoMo3CN&|Iy=yKrYkYKg zDwv$sW>xTD!d8~R_WN*EmjA~yPcJ=&h0>lmwub<#*2$*N2ei454eE?<f`D@lg#J-5 z4l=)KqeWFm2%M<RzQL|F4v7IqSEP5!3(MAQ#TJHCHgBUJR%A492wL3^wM<%)4>yp; zjYaBSWkvZKKMiA>l6A<Ked=>hxBN}aW3~r~1051r2&RKK3vV)SCW)DPCIDu=OM|sg zm8LPtUc0h$>RmLKBeOnH-)v%U><rK4qm|*{)Z5*;&5A#Nom!Rf;dDPyJmhH%`fcEX zN|N`3W;E#(T*Y<xC^pt@6&$UN<V-$w3=|T11x?6In=!B%{1AI$XXRY4NS4d0>~Tc| z=SwoR4#)5s{$`Ugf7FuT-(U{xHr+Y%;18{qVtlbHo3o(sLU>=e%*4A+{PdYLdN%T< zAJ36$bKtEdD1C1%f-kuB?Oqn$wU|g9c!@CQIYUUB2_8kX+<@p%DO9n{B_oNg`ap|P zALO*u&u*FErSqG4W$B73OAy?~bg6lTgciNmJOi^J$pD_h*X3TEiHw+)oAEkVEuVw? zcy0{KP{lbXwb~~gG4j!bHgJbS3AdS*OrYn9vu(K!ypO|>$%@OERWL_a2)n1UTKN7K zJgR`1hg4o%aF+dk)WtfbTszoAF?{j~Qd%|tY0FGegSdmB!Sf5Q>&k`2k*TZwfi?S2 z%b@daXnHgV)SBT2B3J4dIt+MA6J}PGXQaWQP4;KvWUTnB>2>3r`7soKQH4sLiies0 zpbRuD8eX20mik#r#Mh$oIKQrZau=69o;Pvcsru{e+OV7dZQ4+k!kMou=FdMwZlLVL zGT00ANo%-67em)|^PP=*^_w~7JU(B(r_fJWd_SuH4y*mj;*-8XDSjk8Qzp^kKAN%1 z0V1YXwzx!k72<89(BvHMt!p=rjPrdU1*Hz_A_m?YPROvdAuLpE2>%MW;?QfiR-BH? zN-s(~GPHDF697Mi@jkYnF_}AE|IA&Sk!Eu`d{E#XcDP;^>9@SuPgS-j7pWimkq%Kq zK5GY>+j=d)+lA9mSrONmVhObUnk0I{rh8V_wpb!3gK1@o*@Xm+$l*;GDVDH<e4_|U z>ooh7t%DF+TntG@k!gdrSw0cvX_&$d`v{~Y#IbF(+%Q*(WEgQKG~kX<JdPHKcMFAB z69OU7x5qKFAKXG6*W$0)yz{wnhkigt6Q9)Z%P04b_crf%i+^}3<&><lmnRI;&?)Vf zjBA>#vk<Z4FCq$M9N5htnRmL5IONF49snU@SWnWfL0@V$bUUGKsm6A@xU<S}8TE19 zn2_8{U$d72tuY)}6~SR~s}S`8Y`)f`#ijpcO#Wq!-|E~u`;eN65Po&=5VbjQv3g3X zh&K8B*W*85myR{)wxRQHk6wFkS<(<X?Gvci*j9GLB{H?Gzss?y>r;0@1jw0hdN2Bo zI0?U#fiMZpr*K2<ry2k$0)1Y+rGmJPK768<76v%qRncc&h-w@d1X}Ewp8uc`S^Jw# z`7M<f7hkDh{m*Ja>*=jEfTiHr%^`n#%a#NAzPqLG-w5fQB4#Wa`F_yI7LEFtoyX5A zHfT4}+D4vmL0X&`Fp_`XZEHO>oucUn&5UzUMp1GM)}z(!q{g35rqqDur^1Uw#q|?C ze?QU9^Q>o1u56g2@XgKKCcIj{>80138ZI1zX+c6YH)s4K;#}z3CvxNbN;xRyz4Mc^ z>+kmFD8%Vo(B3!?s!VY9ODU_5)&A&B`Wg}#?5tm2Su<|%yQ1aNCQSHy^J4rYOATQ@ zebcC;L*&yp`xsT7?)q9A|KLNp{RraA88SfMX6LS?k9hU``0@M5G3})YK4(9gl!w=s z6RmIt9GVTk9nVuon1Cc<vUx?lZiH^c;nE~dB!mZ1IQ)Z#ZYtWvWVn|?tXsw0(#-xv zUho1$_7`4XQEk7?4e5Nf@zN|N1eyqKiP5sr$IXAX#bUBUJC~-#6Y~9>`&bRe&FsAD zR*Jw%E1Z`+)0aU5V5jP-i4P0Vx+&8o_my|;r$1<tGP2F4cT<NZD(u|SxN9$4SdX=Q zD1kgmjRvXoS?6096rk1j`;}K{C!}9)Z33CQV;-)BTYra5@%v0=_44QNJ)sTW<giL4 z@}pvzzo|(t$$i-+4uKmRs+|SV&<(RO@|gLzlV7P141`C~nNV`iSm)PzKhBD1mXs!r z;}kD9?s#R`a$lkBu2HnCqfDz)Kj4%sW(G#ryIz(=<IHSOAh6$*qPpSN+p^YyDW$ra zfOp?kZV~bW<s+R-3P^!%5?(4~|Hd`b*pZkNtD7tAJldR)c;d<Qs*Mh0e!OVm9&nXm z)6Ci7*Hf!Vg*aw|$+6B}83#mMKUr#6b`$CntyJPM8NUg3H~V1b7raQg#@XtgIZa$% z6DnboJj!G*-`oVP6jcI;_p2djV2Z)-o^NRM`XpD@d&4Z$B~mo)&r@RZn_J7*gYF_P zdEvj2GEuA-^j3bwTC#S<FU-<(=W&b?m}T$GO`{~r6>N@pe&WrLKi^;)8UyB1UURL< z0S#}rzBenJGT;430jt0FQZ+93cr%Gs3mHAC^MzLQUtQg*nr==#&P!S)PgD@x@hF%O zE@?fVpZ)8nz1*7mcWar}zA4JLdbt@s0?U2bGefR-PQVhL8YJZm2(xReLk{V`c8(5{ z8%#0j;oPTwB{hj??ClFr=xTFYR_Rt6P$GPm!9*$UWaSD*E89M**g07PBpONwZbhX* zGCMO^z#dU5vc{{nu}KD!qN~?{pRisy<a7=3n#ZryTHNrRmN%>JmsnP*TaJEMzD@G+ zi81^7Nbj4_@X>v}M5{|pf(bAcUekSP0T2F(n5G!DN$4(ObpZdZ2CITC|Kj?MO2eQh zq8a+Vz2AcK-0I?RLpwu@eoVqAVQV0Tb$GVz_=!W4%AZC3*DhD<$pG!2`^TH#Lglj+ z2AM|S&38J)N(LYLnH<p@Er_u!nCOrg@K{5EeiWoI;`+e6p$QI&pmHhWMv}yPV9MhA zdXKwb*#VOBmcS$F+J&W$k5xZ=2gi+OX@6Rf;hC9nlEp?lPRl>*YIAeHZ`0I6Z#(WH z{Ow_?L^>++DXJRGsZm`M{<$qN|EQMhAvAr7%xa^+8DzfWCxu-}x1*T2jy(N$O>mhZ z+=G2q$fs_}Jn`anR0Tk{<}^{QTpB5Q1s3A~S0lgM_r8H1%E#7E-Ch--Y*MEHrLczO z?AOZIyn~^Q(|HvpddS$dO&e1eA~c``=`)H4-7_tA@2c62y_(Osez=_N*CYDZL`1G1 z1AoUM{-;G@=wvCTp5qP0bosPHWVOc4l7i?ACBtok@($N)XH%UU)o!%7{fqSPF^aLg zk0WJ%(G2MrSFznp!FIp;z$$$hO|DhncY@~HT^inyo2Mih-ahEf?I-UVY?HI)ypqOD zPA%p#)1%UYEo7U&@=ahkuWE~Zs#g>k9Gk#a)yqFXjr1b7uS*Q=q?i*<>jP{q7jVGf zC5p@1En)t<rZe<pws=6htV==F{zsz8e7Afxc&T7O*SA-dsnM(4BlUoN>}NsL)d=MD zS!N{D<X)Vy&A@Gu)jn13%*j{jWfPOGvXL$h%M;}bY0N8z{nbAMOtrzID|2%RA3<kP z*2t{3`811w!Wzrycj{s<tRe2YF{>s5_5st;Cr>z-zUNRAVI6wv(&S!JRV0HRPn|w2 zsi+x^P&4!U=yqLB_Xat!PPWMVV<*4&P)#CLS{P??Kh_D(Stnc`DV#ju8~W6Tl-^zv z6(R)q;A~s%X(~uC@v8J%09aa8UsYLWWX@;GzpvFUlY=9J*^QkAoEx_$h7VWpOC%`b zAwzeJa{UVZK!w{Hk1Q59NW>&GI5~`6i{_A3NtW%*o=c07m%kaKES>25Q{J#rjCxC} zta5r;sQ^4Ic#+zjuF%xo=L#Jx@jf@?r78tw|8xxkKielKExS$`ZjVI!{0y94IJk%g zLT<O&aU*%%CVhin_tdm}c26_4;PmDCWSeH-lKdRT5#20q3}ANST(&bj)OnG+HH)+> z4-j|eE1GgANThr#ujOVAwy?CRxs+8kbM-}9(~J;VCNXeao38Qe>z-h4Cpkxb9WQ#; zo7Hn`rCzuRbfihDk>8hWV^gsbX7(L9?12zl$uTqX@fXp${gN3@!Cj6QZLh{(^zvnY zcWm(5uo@M%&jgU^p(m#lRmHc<#St=E;^s9sn&C_UDGP@HKhl(wvwzbyn&I(Xj_G0J z4BIrop49`lS}#_-@MK44r<_S8R{V{!>;YKaG$&=4EQnj(z>SBJOiflVk#f;ey4@o` zE%zn8+KwzpE{zXG!pe8fWlAgjBe=oO6Wu9kuM)FdqUXZT#_>Nnlo|<I)?@)?YQ(Es z8P%db%qy*6z9M{&<%^GlqxSNbm5Oo>gCrILR2eeu#I`lv4XU7O^07~n%bT~>e4CHh zC3<z3!wNIolw_o_qTRkphsYY{ry2R&&EJJiySOxB^Dk)HlP3zh#Jzc?f6zos-r9t` ziyM{Vnw#AUxf>tWHlF2TCWP6$Xo*xdye+7*Y#$mQC#Y`>nBbd4J68eB>SeoLLt}pP z3o3TG#YIL-e!P0`lB27ypwn%qMg4W@^Xd=Z(=ND#+iWF#<ieSpk<4`;^3w`b%S!Lp zZr!O<=Sg+_K@)Ng3gD)oOpV(fRB=Uozmryv&g?RBSIS_cyEouddsQP{&Dvc|TA_es zlx%oeptSTrtRzcCK)T#$FY-jjE84I|9zYi2VT;VSFx^0=HxxAsC!SkRf3fir4v6!+ z-iEu8iorIPcXPkfv^uo8zn>Ajx92ZhI(mQ6R;-%9(yp^sxDlIozsOL%Ksmlrg!5V! zvqtvR?;a^@A9{nDVLvU(>v_>JVK-^2byri}j{rivfV>0tpSy*fPM%=hj}1q=gGFoY z?$|wz#O57bK8uK!f0e<r!Idunfn|)%6xa;i&^r;Tt^2S%HE36i7e72nxZyTp;Uv%0 zeC_wJYA)~s88v!f$RYn>=4riu!o70M_=)zL(ER;!;(bX%k90lyQ~lfr=u(y++(6!R z);&<uRSSol`9Z_#5C{DBHVQFw|90wzn!nO&x@_$G&f{wz*PLeGc3P$6&&?sz9<u&a zf{399wiqZIM1NRUNDA;fE{ff)rzD!$NhAu_&v_0Fut4$TIO#Lt$F;bi2LsE3R;;}_ z+fp$SZOS(*(x0aLw5dk&jLQ?T_rK_~n{4*r=`c0Nuz4aJY7MUl%X~2+>X(ZEjAcH~ zV-&0v?=`+$>Q;+-=n-y7b-(D^vP3g_y=<F0#)Jp1(%)Ol38YJhy~FYMqyCulY9nW* zHLzd>V}-pw4%dv{pSm90U}<-vg{zs7)cQ2b0#_Rb8cakola5rR$}Ci71p$zU)||iY zsAYf|jlrj3m~zXv8;J<>ubicsH^~_<km4iYO(C7AITq~)5>`@&uiIW&Kld>$iIGpU z+%N<gKf!MJlX3~Ug@<LchH;x|d>#?v*x66t8$K_eChs#`C~h~;ZA|}k_?e2F{hyE! z_<y9ZT8p-J<GZi%)xtUw^wG1QG&$6J`ufzwLO+H?S|<@}<CBs;QHf0!Xz!Hci_5!= z(!F%CHI?}QZBYiXMCSyru?bZ6vw+7;#z3N8*d#~g$3^+$7ZUDeJswL&#^JQA;TA5w zQiGcErX`-ZCY#GJK9A}r?2R+%yY(ZWWcTQZCuT`#t|U2(Fa|g!<+AI$Sesm{;!$KP zQM{{QP@qDU8|QlH0EB76)I6^A%~8I{Gqlg~+M@DvMN#NoA|zCg9wktaA@nYV1lS&O z#aF?5*Gt3B!HlSJo2A;H{hNgRo3ruLi-)^C?QztqqIZGNk<!`|)d+>SEad{6br2nV z)Lt&~<5_gHR+Kv+ew3Ls;7cl&F_FNiJ?~E+G<;VU-}?qfw)?`VJtLf)8@#e0RICr2 z@b>gK)E4+qEP(GJ$C^8I`3vjMJV$8sqYTp=YV`zLJ!+v0&l`7~f~bVxMhgQ+3!n(i zc5CU0GY#TXl-g^xj!+TqCsqhv6Vvo1{v1QHIT?zkwQd=d0kLZGg@;q!mdni@e>$~p z_#zS0`rCV>4i6*kSfj~7pDs))Kg`DDd$oDUltdg1ckJy}14PW3ja8-1R{<kxX2wtM zG_=|`F50<cr?(8Z*&L$KyS<x!h>-aep)~~7L;B-j#H2&bnF1t!*Fq?DxoogWhbY5R zFE!nhmwVv#NBh%-SQGduYhqpE*-GD?7Ybu?!{|q38SJ&~)PZ4x4YIE(=QW$uc~SQB z!u?IZon{pLV*CW`PiYW|vkj#6oSdElB7&gTS`kV&LuKHNxq{7BT_%|qW241bLffwI zaNz!ZP4xl~@}?QjFQiJPdyF+vV>n<XFn#qXax?;q=?&Nz@_DGmw1j8XyY05myyxQ+ z*&`Tiww!0t>6)9eU2Z?O1tzLi><h}ZnYK<oX6?1}VHa5QtteVi*c4h_GIXuDfUYvT zF3;b^-YjfhzKOHat<M?}KTFsFy0&}JDSM!`H7w+0zJ$Wwu6*ea<!RrGH4fmC?^KXB zT}MiN@IYxAYleWlaD^x@!?}c2?E4RWT*uaY>d!iKS}P<N)a)WH_+Y~ZC%iX<+f?dr zqrr&oleNQ&*vpJ&1Y4Mkis$ah51Je-9n*188^#f$;^z^08hV?21jxR`8!K9{zmJnX zZ;~+YFl}cE%#cf=&BF2<tdu9%llnXsi)@_G!kF@PRI=j`f#Gg(`tqNOexU;@QoPLa z4}Z}7o`T?N(Y&@zLf?GGk)|3Fc-^vL*l|m4elKW4>-`U!OZjIzi-S~Mc!2}FtKx<- z7w7CS{(iQmywJhWnF(0`obe(sX6_g&6Vf&%l%P==ZsP(^HeaCf24fg;2&{4jgwHP} z@*rsNZuu%f{-U?ff9XtdmiM;_Lwo)z)#gdwkp3F}%$alyX>g*LTV6x5C;~&NPM*}z zH#7jd6J?@@-+$l8n3j|j5B$(<+VZZzUyqG1W~HWp-@ah2I5jq)oI2U1-fv&63)Fh# zP(+!%UzWSlW^)!drT}3ct|IZly<~ya+HrB%If5S(4zK(|G7VAQDhO_Tp|F#D^4r0$ zfnkT&tCY1aZo2^-7e4+0Q`QH{E}%_R_Qfgy;w>bXYnp9t_g+ml42>w0@3rZiwEvdX zUdQoUx_IbK#{$;qD5T(ErsYzW<D!irQqpPJeu_cM4eK3~Rv#mB<LJ%;o5LDzXujbo z8=rN01{m@Jt4G(ub7msF3vV})a}#5@`GDj(SjQI*nqL@nvmr{j_mUhbQ-&rM+79v( zQG}QQX3S*kR5i$3*c5|Gfg0*BQddD@AQ*L~uYPxTcdtk0dSGhP+h?Ny{n0XI@$sD0 z2nXb&bce7pdM(lNN8Fw&8-qyp`DH?Lea`sB8eQUe2(zer=LeioV0$E1nzjOy1oMtw z*fKqjmq?8Oj^K=HN|;cop<TSroMP?>egq6B%KUX7Vv<RiEZS;HU+;H+UVJaryA@hF zd1*?v(?=({8^*gl%``t3Rlv5(G@#1{Fq}>DFvOfIMYU260<YWJ3l~^t-7|E9nobao z<s8`fTx{Eu8fS6lG1~Nf<Jr{Nk#&4n7bCK&mP^LS+z!BR5Q4F|22ZGrZT;%sw*I0c zNJt&%*6s|jx|TVheAB`Dz0YIB;g_2gRvD$v=j2>yUc9~W4B>4bzWQ|;i@;F;R>kXh z*1Ms*2fEKJsnS)Ah<|MRr}g{g!Z7(=6_1ounjNd8V#o~3kVl$-EPvO6RoNQ!rzeOc z&_v$E93j~)PNzpNAF2Z*X$c4wIFIOtriK^0BgN8u(!$7qB<p$aJi9n3N7}<?O85!g zqlI>E>x2My++59-eetZDj!>OwSiF+BPo>b9zO_cu25xy7|A{3MR6GfnNpwW(5$qtU zt&BTWT{)5dlhykRQH$TwOa5h;f|mYenBsIWhbir=c>wz6IZNe*+UFN-i}LffQO>&^ zt05J4HJ%h?qT$Ip08!FcoDp1jqafs5fFXB$jyg=8H97z5VM_Jy!&E^iCH|%$*ruQb zS|<C_<9GJY!PQR}W%h;yTLPnqE`*v4)`E*N0~N4&c~%X!Ixik-Cu-<m>`|;Csj@eK z6sS>@^)-EBnqLo{THMw4?TS*-D}qZn?h3J9R=kq*QrWtyc1T4n2KW^sa9#28<KB07 zZG~10Fum&h2J&{dtc?IKPt4;xir|jMCI;ifN$V073=D~DN#KLF1=FoRpAU8U-(lx6 zLB^Ukw`v<ctOZ(@sD{rRWx2Gql^t)2PHZLYoKKk@ne~!S{e=(x774gDVasDSCSkj5 z0VsqhG-g_@Vs?=$ci=)4O6wk)oEJ7N5XACF_{$4P*inf=iIknd=F5MXBt+9<&9!=K zYU@?X#aIbAw?541;#{>Ygk9TeVw?Zy$xkH3YRZ$dyV<+Nh|u7vF=4UOy|X*R_6=VS zYE>F#XWvrmaSOb;?=Nz}Gjd#$X1{7EXUK&rXi7-me@nw3yR39El`qv^!AYIDK6|zO zQVo?)@Zv;Hz%w26jWKzzQvBjchxuDi+CPlXCPKvCyHK-z%oNk-+=O#SyJnA)iR0{C zO*?8;?d3gL%3_})Leh;rLGBUgL26>QF0mxvxzJ{-o*k}b_8?ty<cw$h#HA>kej9iy zcui-+TlCX$8(V~=?w)Zg)-K%^e#+aP(c1br-6`jLMUhXQfc6qSP7f>azAJHo6PzpS zV$nl!f#iuFz)Gv;a4Qs(P&SVR=C<cJqy3%L)nBgUKQ=SLy}B^pdvxE3Kq#qEZcR2V z^~SAS(ec@A7cMi8zx}L%-&dr&JM?#i{O+>v0z5R<)Zbh;-j9y%eMVgS6!;+*GazbA z=5A&JuaJHgak5KzM>(fU?4vW6hxw9ct}*<9Jm*)VmbCdl<RT{N3L}z*M84u79fr&$ zXt3Gr;}P9&5XtK%ltK$f0}$X;&}8#&v6+U**XLuKIS>0wpG6n|I2*keihXinapitL zQI2m#72gn;*Z`<;eBmm8uriJJs_QcE+Cx!F1BrDT-xirRmr<nL&%pXFUxz^tM0F{j zbasA@g)R9*=>J9Ddj~bS{oSLUW8qi;5m2crRl4*lC{?<&0HFz?2q6Iip_iiwC{=m~ z=@1A=AfX17PH0j>3n9`=2nf>K`Q^NKe(&6S=g!>w&z<?sygM_=AIW4tb?^PGwLWW| zN4#CtNZ~B)Nd%Y+WJkX@h8#ZP>G_kkFu|E;xAIxVYL(UGGQ=mzjsFGakwKfwVy^13 zN$)(!{;Qa{1#&8?HTiRQzKFTo5=*2|((q438a9m!V-HJ<W8ovFq_?9h#+o&(g;|%Z zq5QBPXRoQckn8xRBf`bAu+3wW<L#LjRz(O8qan+&@u;Q|L0?DU40w8Nw9&a{a<KSE zWYWx;A&)-gc>eLES*Kr`hInl;xJf`Z<>k=UB8VuQMaNt##dIriL)q-qmZ<%U_r$w9 zN+CI6mQm#Qh&1$WDQ!<|prlO9n}t&!uMgv&<x2Z!jJ?QJlarG=xc=VmcH_;bqlUMl z=QDiF3v28+)pz2}opQw#iZ`co6^E+K+|yL(`itIFcYYpm@jT8($)Der?D`zQdz~fQ zCPvm<no)!f@r<$d)#2l4w*V){tI20#N4tsbj<ov!TxlHad~w!-n6lfpbe`Ls!b$}4 z7SZJIJUm};H*trUdffpzcJ!_G6~K%$I0b_DOfrgXA5>Z42dW0R{b$p}eY(}F%x-Mi zl&>pXogh_44z7oMLvoIPw!{bxwiTQO#7<b#9xaUm2drK#d$|^HXRaAr^w6?g*=;MC zq*{n9JwzM!>p7awr;5SG&WNHv<R$47PhGPg0G{Ap-N`p|@JymuIe(tBw6pV47P4>c zo=`oJVtEqpl(lHi6OY~x1We(R<imrr@}w*L0rC{ox2>=j(1wI&<WDMe=@ER7-}tv! zyx+5v3Wv}7JO#V4Qx88Uh5Qu>js*o=J-L(oFzN3cdyBzn-mz+tgups86RXC<IN){f zMv;x1@WvI}iRJuz^^puwdqpWM*4fSqf9#jiAf+!GmU^y6JI?6R);0L5t$*;G9Ixm> zg(cL+=vc0>1a^0$o2S6mDUKhVWFMKgzakZ>aQn=)o1WSSkrNb^UlIlWxE|@Xt;m6U zQwWG_kpk8DYNm92ZQ62ibQmmUz}C4($H>^CF{c>Mh$*qRfj7zL<cG5lIT=yEGKHKy zhdzB=3Yg>;bI>VptQJq}l*s=(34MJ_-v<)H{5Yu|bp~mhwVMGNW9z@X?i}ksHVM=S z!-GgW(cOQyTMrH@D>Cvv|E$yV{iT{XoL^j8;-tz^&lJq$;d!X4qp?{o>Cm0+vu$K% z*48zSnkB+rbpZABvTYfXr*-oC7+HgXh4AwG!LK9pR;rz{h8<+T^jcR|8;_eDADXB3 zDkjuT{6)@;*VO5KrP)-n-eXJjMLdBEH?cwKQQq^-#5W4{Fp{I!K!NDZxSy=vCRE~? zN}Q%I0xxZ$E*$O`gJ7j4$qb@b0A15Juhxy<ydf|DOp&Zg9XH(pHu#PE#614qM%J40 zDAIZ&Z6H2bbfx=<#O{06J*EqKlYuFS?PG{>s8dHhnC%rBOUzKd_s^B5osiJ%D2sXR z`^2qqx0wYwx2%5b7a(^<1As_BUil8v)G`lh%y7rZ1=&h1dNOMFV2A<td;c~O=$LYn zD>66lS->p5s+4{5M00aK1r$`C<R)*{EO_0<hr|=|Z2n8u2A!Q(_jc*%sqS-ds2bv+ zFoXYrmvca=yoQaO!#`JUg4@MI!ci0NG7ZvrhBaYc$*xR-*=dNm_jwLKH$2qh+t}*T z*rSI}-Qir541q4W3THDwi@8`w#@6ShxS*OW#F6~>J!{_1ifiJ;%!CecxKwfm-u1R5 z9kHXFYYdrO`D>Z3{^Hy*edenBKUcOTB_BVhr%r;`^{^6;!XIe_2OT7wk(!htQd*Aq zMZ-=VYZt2ow&m2an=I5{{r}vUT=wfvvw%d5^ti0?2*EoFutZQyNdR#gH^@SCld|x$ zi5C?BG}_#(kVQR7c5HT3P>l!yyTw@Qx5d|9wAEY-uG{13n!B9hJWXr$BU$msWDfvf zY_Ii630rY$nVrtlRS|+ntEYPc-D2L1!bIlRRgup>YuVNZCo5JLQr8Ss?{hH%aH0C@ zXsD5t*~B1UsdMIJ+^<9F1sYL!uR>#8S%7Y33R>9DbrD&-{Mf@cyZ?@mm_uP=K=sXM zDAyw06{>YocByQ|!VD<e2;E_d5G;ceohgW_xoo&cBrdwJ*`YiH=m7h_AIYmnAk<JX zSZ3(<gIbH5L0q=h$covlYCvREF6IzlYbJ`lC6%Q!OLax?`vlqFK62Hq{{5+Q$~oIy zFazJ>VJksVH@9I6IvG{0n@RVOi>OSQk{)MS)37v*0%T!=@LKI_iAn!T$*$1+GydP4 z)&Df@tlYe-S5(e<>V8RJq{>Er;}f3|q2sk8pD3=c@&OybPVs@67hY45fm4sC;K7?* zLF{c?g_5pB-K=3r;H{TD9&b-89%BdiIO3PuZSzWJlU?0JpB>1r|8u3)^CIf2jLgk) z3y%wKHc5RWmE<)`VHuV`x8ojZtpHb6&}kW}N81H;WpDjbTfRBRDSk4Q$}hEhKMva5 z&T3TC8niF-wgot52%G+%wX=Fsk+C#Ap<0t#XbxPg0=8mN17o-`bRpnuzvj&&^6kxc z8-My##<^4k#_X>S$p5bTI=rQBC(<~73iAyFu{jyivPVhwKig81j7m42*w((k>G;(` zZ=h{u3Tx!|V2+BS|JWaG_UbMJ-#LppKj}hsi5Q?7Pg&R0`^p{#_VX=ZF)dlk%KSXY zN@+m12qN|_64I7RO%E7D-|^njZMZWBKj8o4)b4k3Dob)V){cdNpN2k;-;&uK;s7X* z%+XCmi9)qIqYn$*T<1zKGru?RI{0VR|6H+iI{mpP7MInYiPihsDi#~;UHZFM+WFI> zj6Cn=#>cI8g{d<&k?Q{bulqcxe#D@751fkf(!rVlC?r#uE_dN9#^(@CZ}Nglk-rer zj9S<yb5J7y`>B@RYv0}>Pd_4N==H*)Z&BEi>+aP#{2HGYIpGzssAQ^UVbjw*c0=lv zxp>3OfS6`#q9ZWf9FuO0{u0RbZmnQFm+!kl&4mg3rWCR+A#EZ1rIK&rQP`J_XLiY> zI&RmJir98OHIwY0>YTU{tXl42{<(4kizCf4^NePwh{K?_e<yH_?!c}eqa)nuc>25_ zv2_#WwF!hr#6BJ=Tm95p=hR9ZIM|%uLkvV_GF~m$d!^oF#J2rXnm|*YUj(i@X3N{} zp7>?W^1<+C-3|TLFfR1g{<u7);%0j>cNQ^YIh)Joel21-ZwL=sE#Mu0I~1Pbljx4G zQ;;xzo?)DBxA<JUPE4D-yi{eJ1SRK+4D_-`u99<H#E3>2>T|GJBu5k9+C;{w{B|uN z@u{xT)O?Lm?s^a3X5WYVDEzp=ipgt5cw3|S1{?z6#vDXmuI=0`mWu42l8>jwWGovg zg>>87kO!-;@81W`s|nb5K9v`CVt!&LqVozJI7DD;x&P9~4Am_{D-`1?>+N&A|3(3| zsozrXqdazKh7pHE#J}1lzb!+5?aO|&%>Jg=3A9`~77=Nn$YZ1jxejpE^*|zPUIHic z_?^@+%AaDD99=Z@?;nIq0h{}L(;u($rR$`Y>`A<Z#76(YA1?%)Oa=D6m5JK``kHjA zk~R+~3%Z7@A%ubrFQ0xRCI$_ym|q2*=zBU{J3foVp|7*RmKX{qT^Nl77N?3fqnkgK zL9p1gu@w3j&y-5m6hidj())=47v1F?CjveFHz8*OcgBeM3=u6OdD6OcI1VKM>s&xy z7}DHGK2VP8(2Nu=w3(kRrAAR-ZI*K>kgp**j-pzlHuW2Q_t~Tq_5IJaUUiaNBP_C+ z5Qtt0oTPq3i&d{RqJaby*j#Z(H2~T;zyx3<Xe?n-w0eO?EnafB{nPY4YMPun`O*~} z=$Po$pxvjZEA*t??{sRVY5oNQA*Os9CTi52Ft36<5_l5CH2Nz^n+J0HfzNZVck&yz z$1C(b3k8=ZcXdr=6PxJGj|B4S|JJCUFxUb3%Iqf2tPfh01s(K$g3PPzhuysue`>hR zg(qXjupI7%I4I^TyIU>sE2r_s2U~#wrA)}1BtI$Y)`;X)mF#$^c2^SAcT|@*sO}9D z;^(Q@mN5Nfpg=uTb57qTt~ch{tz|!pVvh`~h>S{W(P=Ps4VE>vji}J{*(#aG)CA^T zxB{aJ2<<{E)+ak+%fZd_-b2Ts=D1_OfCR~<u$Oz6^d4dDzp?Z4B!7DO9reX7a)0R8 zP4F#&-!ygF+Lnx_jD7$neZ8|cHWd}H3Y%91rfSxd-f*`RM1!U7W~wWs(l-j97hbk) zHDP%C&y`;K<dzS&=l`ZEauT6bBHL%zW0C*)o={@s{K${y)-Y9tGeIRg9sCF3Z`5fq zR-CGzqb6}JLR7K~zSbbEc8x=9Z12DBTBd$U8-i~4Zf!W`HC!`Rd~_`gW&P-A{g}6A zEMIN=_|vw^<=2j|Yg90ZlErU3rlKxJ%^#>)(sha43JT>_xhAo!_iqnZuClHQbj7Z6 z?%p0nKV>;esu2N@DOgRigQXG&MyBKw2|_lS!<hrp0RzE`9yK0;DVR-nQsM9;1}N1g zALEcQkS97@;}Imt?;8Z8xQNHMz|DQ}Mro$zlFGC?8#6n2&ZB($Ec}aqJEQJ(Mj-b; zSJWOTgg&2XSUkHblVx5#x~SDjO-IwWm6%!muUrM{INC8^{5-7D^4rY^%~^l^o;QJY zyOe)Z-5t<wQ?=EU6$r)-E)`$^&i(aWnzs%*FBh3(v~TLAciFHKm|;4jU`XdrF}sbm z67+})f3?lw?ez7Ax{%->%aPB=>#At1KYff##ZxPEJ<}t|Sl7>s!O!q-E8|z2uHI&< z_3xGl*3`B%e62GbaRf*TXigfh%JIiwA{^dNAko9zH{Zuu3xnsk%cg$LkQ`$CJRmI! z_1=N!l^VZ}-k+QOv_%`5?b;bEv9@pmCv_Z+-R~N!NeuI3G*tSO)(wss90l-M3h3B{ zxHl1E#vmG^wasr!rgNp!Yl!Ut^h{>Hlt0s`hRl*6=xK<%gLiO0Zk}~FIeWH$wQz+q zw@YUAA-1|E&hRnFbnlL_#;i;O!0*NYXu>7Mo`ojDN#u7ebhfcc!QYPvgE!-r(Sa*j zXo_Cf>5f-*G&mL!y8y5*E6F#jj?NUGUs^wD+M_e`f@mAst+qZS92^{KW?M}fS+Xv9 z(gLDB407U|eRg@hBE+j|!`4MMhYh-_n<+UCUmN=-y1PvL(58Xs^1bhbXIoq#nZtQ5 zhRvR*s;w%k=bidO826ygJX^^iXL;#@BT&0>ZO*`Jlm7OoseslNIZcT@%&W1FgxgO) zXugC^nMqkTq80JQ)3MhH;x&eb;5=oE6F&(;myvD%jGa`=w(9Vet4rHX-h@v%SEp{d zZ<|4_L6&Nb8Y^B^A-E&l+6;NsR5QB!jU2mK{9Z7U5~HBmUE@BxS_J{(ZK{ZLdzh6v z2g)fLqCR+1)G5k5S2*Wlx?H(G@|vzT#HW<UlP)6*7xbQ;!;i03RBJFdqj~zW1Lt6+ zfVhWQvUJo(-O?B+GlkaSE%>W=fQqPz`DI$Rnh=qh?pVHC(zTK`K}~V<ZI8I1#s?Q^ z%|Q8!P%XPa_x(EyhKBrJgy;V0!HFvx)`5$5iP>@4uC5tdnNE1$Lo487yjjwxsevjA zxTa`R@HBLj2xm$%CbXm^GsI&*ZUkmqkM8|Gzk}H_@_?Q;5xcouuKckVrXcJ4VJV%# z?{H&zi&HUm{hZNOw{P{>z=W1DQQiGEhriKh;P(2>)r11RM{6@et6p~qEjp_>MgRO5 zq9GRE<Zc98nSI-UYRXL>A|2%jA+p|PAvR&Jf0t@$g%%OQG?%gFa+0l2{9m@n$jlDz z4J+?1iWg7HR{f?Gjopgg>{Lif@=ipRJ}jmT^elPK@CetNrUbhg*fgRaylQUn`_#R# zUQ^&PUZbu#Ls{Ec>u0W%<;w$n!XsQ96(QYXuLk(Wt$6bp6lUKFCq%GE#iOf&YzE_H z`9o8Nw+b7yxIgPjI<y`fF9~RA6LekP*cdt(q$0>>{+NC%dk(7W+Boj#=G6aYI)x_| z`S^|Z-SDd+yHf*VUB54*&Ig7(^@=!#Jm-om$N^O@B3-3RFg+KpsE{Uj(qPG#vI3$~ zbb73R+ys`FfGE_l`j_s!^YCGoSG|d;lepwBUEY&Vb*4RAdA<s+1OThwZU2)2Uv~oN zP<VxaPKM4j%LrpV%;1yFT}cMGpo8Yku@vQ;keEPSt+!#+$K~rjrRiN39qWV2AELMC zu{JVDtHP{peY3eH>v0XHaW-c}DHnGz7V4E5)#Y%E8}oM;Y2IFhf}~vwqn#0m%+j2~ zEC)Vk7c>K-Fs8+;<-`b;xn6y5qpCBEqOAi+Ih3VC{PK*00(x-zy02P{J}B`pYT!$l zQ`6xbcjq?=R+DXn7JA%V=;cS!^<#03ZTejixB1j@2BZd1^FrF>JzBA@b9Mu|Nd7b; zh*;iI@0K<hmD1}x_4^|vA<IzPOj9M2*({>NJ)?6}Tow`c&lRakh)kic3j@;jIM1N` zlTUU=UP76OKVvt$P<iAY&XZ2p1y}@LU~zdYhr@A#pG<vLc)wA;!l-E_2;F8r)Tgzq zd>xBp)#yRF^(bhY)8>|kYuMOqUX5&Z_3Vr@xMwqdE;lBJ<SrFcU-3P#dise_;fxo* zUu6}yPeAK4X}M(#oeog_HPnBBw8r24XbiFl=4J7z*Sx%d8^F!YpHp)^ly+2YZ*5~~ z`l_FJ{d2|JE0Xb1x0J6}bwU2mV}K;%gFl%6<{OUg9tMvXtID|0GjqRltg=;CdWrDy z0AbvY&6;t95Yj-+D2zB;-h^q)ts5a75woHz5FZhFW&D$x{LikiD{Sijkc@b)X4AK| z&t<dQlFH;o{ur<6+5;(cc7!>aYZC+@snIe38U8obG4+tP8bl?_8Q7`bKwA;A4VY6_ zIDAyHiS#z?ANuvox>jST1+fOZ#a2#Z(H2q1Fim5Eb$UL0Nmrk&`hb1apw7lU+}>eS z)CTy$tVz^T#62)6Y10hsegN>>Jb3`!X_B$LidnbRt;~L?=MJ_nGd}WG#0GO}iW(op zr3boE2O+aB{@@WPpZ9NT{<_A>Ca<_`I^unJzt`aai8=p`Vcw`4FZC0Kk?P;oYN*14 z8L$IjU>lk(^=;h;MFg=5>p+P{L%X_8%DxM}ZPMr)&Kx?t`DyS9&7TShfz*M1;aVqF zsG=%p5NfLw6e@qaU_ZOvMm&7L+@$|&)O2R6nmk7QUPIqxIq~-W4{a~qCP$?+8_>GU z$m!tggwYyvZE#-bs}sLx)?G%LeFQrx`S2K@x=r+C4ey7!kT*xlFS~6;$^^*gLgB3M z+Y0(7zz+SD9M(yHjE&#T2%42OZey=DDAi4Sa>0US>9IgISm`Z(ZIqknP&e~yFg-nI z(Ta!`vB6^YR}3Y_t&JCISme~IGB-s<UFXz{7Cr(ePk43@rA;2=mVw-W4TCj#_xA}B zv82bpYLIQdMuf8aWp;D}NQ1N)eJ8?{m|2alv&$3=@wD_KE(7;SKVvSR_cu+r5@0Q_ z-pUMCWUxrk<*1cy0PVp<5WSM$i|u$FbcTM)SHXu+)~dj^TcNyLIi=Z^CWQvVmaKER zGZ4EL2PD`;T-o(kXM~Rll@*nYutss_=Dty28`RyZPHh2rXIqQCB)3KhFGNmgSjR~B zPTQ7{`zvA{#1Y-6mw<g?3_7`k=~HgtQU`iaXqf>Co$2Ae85d`5>SnuLG_^28(wEtu zA-KWIR}W4&JT|aXXAwF7TuF4QC?h>z91%7OtiLwJ-T+$W;&DW!3C#{`vH@2;tkk+( z46WLC3SOaK$MgrQ-$#xDic<m2dYXS8#OEo1t#|i+2Xh=+`K>qA!Gp)P6B*_HYialY z>YvyZhygtfT2=CJWTbUESGnD}mq#a^@a-g&Dh@2m*a=MT-Z`|KSv(4ASDbIL_huNd zsP&-2uHKp#Cv#1<K^S;|Q-g0vYoQwiM&+>c0uMB7>C&=bRB^-F&Pka4yZ<9G%Rz$v zAkyQQOZT5E?vo;;Bz57i(4r+ZI{w;i|J2}n@7(g|cJ5u?G(5o@baw1)rL$a|hW-VX zviosn%l#(T>nn9%ZipP6wmqPRh=R|FdiC(iJfQ^q_=5IO;MXh6TKfh6T=5voUYbb= z+u98W{Y~`iG7JmhWNy|M{CVqnpzWzGIEg)H-KICzgU2J%(TW_jgBANDLs5eenNd7B zI<3U_eQ{4qe_Aknh45WDM<0L49TH7+Gb>3q-W;pHY0$Q5wQ<!aJvw1LMC~+S)#gS0 z<=tq{j2&VB!%G()+_LzqN{9o_TXx{roSkfZR&!5ZahB}L5C2H@!&B?JBZGAFo<@ZV zykUq2tYvg^d5Syx=ZR?ZM`F&)sF_4LnIQL&Oar-b?u;JZpEE-<oGasOJQU16GbYW> z3fW9{1zLqc>TgZ^AP6?0fgsQ9mlVkDo{zRgSj7fT-rr{3a08}AH$SK=9L4fUV{Z<` zlF-B2IP-9zLJzeDo#UIoD%IPfIP8v&X)vfNhl|vd%6Gf}iRs)cdT0IXM*vm?D_!f{ znAg;|nLRlvU3oZJQ|pa<BnGeA@z$|{gOKegvJgD&=<MmEjkQv%j+{1<iPu_0@ZOx| zX+IGl7d|LtvUJ!2Ks0D$^So(h&tPs7lTB6?R#nje3`tj{q`{ADrS=p0Wv*yHyt&eg zF==m54%(o1c?C?Qt#9C5Zh5P#{{k}9R3lw_Ri%~}P8mD#xgl07A(t~L#@592I=pj% z%ht$FOn^U#<^kUqiwC1#$G7ApFUD1NI+yQqTvDH4{($>mP;;*J9-X!^T`FQ;vlWg1 ztt(i=DR;j`*EZ;;q4)MR6k8P{w5HS)Lmy)o1zeq->aH9pe4YDC2%=bzit)pq5@zqO z{B&ppp0h8YW*666(5G|eOM8uGKT@{4Y+?i|b`^hC$2FkRjdDS5`LJ~3bYl`B=;Djf zI3jl_eZQ@dH7~OkIfG-N)@LCJ_2IiUpMT3ZMavKF<fBWbDnXTU<e*y>q!Ns==qH;H zCFR)(<v+;MpZ1a!_VeWpKYF47I**dQkGKEoG*@_^tn+{uw!NL@fBi&C=7|)_eC&}- zpJ(xMhH4Ay5P?aB5!G|0j0qe(9IE@0lJj&+$<`4QEH}7)IVNh!8zt#|zPIqr9#W&9 zaT<1F;hXz*wN9Y|yphXWJANr0z9b=j-Pa+3@vOabv9E(yHiEe8%{EWI1$hNb2irH# z`BAx+JIQi70`o1sz6qPT1fR6rzDzw0M+UH3*L11OqU}`T4iM3;C}MPdt7K!2L+e6c zIZI{g<|56kIeYt0rEBJ2c69PQcC9KOJwEZq#jE~0b6K^bCT*lC7Bar1tg}>ItoBU@ zdE2aJDq&t$ibKM}I~;ysoWCM$5BMmVXwZ|un-=r9Ndkoa;|1*@Wqb4LL@Ke5+q+o0 z6R_UYBqX?Sf4jltfc;AnzM)J1!7V8rGNr^7a>VNd)|s63rFnssNilAD7p!kv!EZLc zLi|{YcE=z}lTN|TwkUuA(2t@ICX`trOM*m^X_M{fvNx7&C9H^=F;Zy<8BsWZ{AR!* zh{BOz(FjD2-;{Yd0%2!WW27NQMT0gc(MT}iwE)!{XTfbNK5YNT)LXrZ_?o<*hMx7X zYguzA7QC=rJnfAfoSu6SM^HDnScnEiC;l!XwXQ`&n6mR)b}ux7sdaW})*V_EL?hMX z4(z?%!QaC#3^3~OK~{(omv^3`jt>X;veF5<h;H2q(ou^5K_|+tpjmo1rg%h0wD|bw zo&#*FENF|9ZZG0ac%bv}5)WqHMyglCWx%0vU$VS>+CNyAC83Y0*4e9;GK$vXWUa>g zHftl_dfWYoHNRIw*OU{kSa^}k-ydvm9Y0awQeE*$q|)BKWBYS+%C67@pAN=LgVY+| z=+P0EcHm*u#AW8686vs7wP&zw?j0QSN@SrS(0XwK8k(lBXXR8W9SnyeAJjG6&;j5p zT_B3o`y+Hn@z3fIS0e)RddT{kNa_js%lLR}q>jO<(NL_2hEF~6RH0YqRYlN1Zt%ce zxaN`N>1+iMX<SlaCiuq&x<|tkeN5;@A7DrQ$msgeGV?#1>2jy7zM`K!y}b)A6xk|s zw0W}`m0sqgcyIfint|&avA5K__m(S|m6TDIzZ*}iuz19xW!|W!gKl|45?kJGBilSF zbXT2vUXK~DoH4wgJ8K7wI-ksMk4-vz49UOfadxCB_(`2@{u8X@{@4wB9qJ0c%+JxB zQ!1I3f}XHn<-`ihG8qwB<wr1j#1Qj$Z?;k}(Q<WDGq*O3W;giITObqI9$8c$dy!c+ zi#X_OF!cE8Roz&aiLg~@Df4m{eM!M4w953nSQD6Gvl7o6_7><hYe8?Vs$RHkBi$lA z+Ikq=H_>;UN0qx+>b0frVJ4_-t*@IvX|zLhU`8a$+1Wdn;t=3(B{pik2{w@3Q`HL3 zw&Ov^XRHV>xhRYdRuYn8I|G<Ckq(8dGHAnf+Qc~qJwhk7Ce;97lVg^4XnY`A-SW!* zL`NPN*z9+#B9Zfa2#DtQITzC!*R21qRm=bB?FRq7Rrwy^ZqN^`z<DBzvu_Ff=xMT} zm!88dGW*zmGNyZTo7t*D7aY>YF=>vahOsn=N-}7W{eyhE$iO-&gOH}|2Jp;0u91{B zcV?-#TMI={Eyh<;;cJ|<Is$~9apj{d2h}hCcB%5u#D5cB|I>=JZlxVSf4aQp6g!}a zBKwUcuzEBeCKJOLt4_e(XG?(848lX}YwAjW!oL29wd);pF*43*<NkAKP~GOxP^<r& z)~jc=6j2+#cXe`p8y22cK~Be^vCGwHQn1AG;mZ_I^X_)d(7~k9S1&R~)adE(eMXk| zea}Af{tgu2=I0_R0K6Z(N63m8{By<42Z5%Kxsc4^GkHFNmGx@18;}{=gPJ(W8Sp+` z7^`~PVe+h}w&%{--d`4lTUK_W;nGZi0Vr1GMmja0tG+}{<jVyga<s$zb*nu&zf*)# z*dQv5Z~fCc{M)a6=VuqCDNbz$O+n{QoyY4Hx6QS&OmN9aT}LCB=#KF+iv)^v>)m8< z*qGgVM4|>J)nhovO$JXX3yFVOenNBgDIRDE!F^fzP+AIY2w<z;#;c#L+W`R;q!4Us zxhw6)#v30;YPJ)HgH@+JjQa@~BH+wjQs48vc60OT?9@{~iRX2UmCrO7+Pg3V+d5|8 zq&8~Vx#A=d@@M|@AbIjcentKxco;9Hj8USRdw;IS&mF)~xFE@v)6j>hCJug8I<@6j zOoe|&_pa2XSlC;rZwiw-yJY{4MlTKp4>Snjfl&xg>ZOdJ*Vz6%*Z-4BdBqo6H<9jU zU8)$s46++m-yE?FPdj>VV{`YE#hkwduHLLOHUGFP?wn3lOOac7TNtV7nX@#bxq%Az zWHxJQtB;&xrWpdQvRMU{r{hAhhsA_AKCV5C3GicK_hm~T26^qt14N$0ELW!`zRP|S zQ@J$dvmwn|sU;))L#{Sumpm>#H#<5)FIh#h1qF6Kj<ULnJGoQZyToIlmS~@JpP!CW zwHgp^Bhs4a;R8Wq2S4~K6CV3VYyz9NnT+?hZ$I==TVJU;Rq?`w-O%L+)yZxzB!%}k z%;W7JwwhYkorff^9=Fkctn)9~8UOC7p#RD!X}FwfIG5k-i_l-k#<9^zJZBS)VK3Mi zkA`3S9zb}%nW-e3`dZ=YgXo?o64SYfH&a0wU^+F8tyg;03O(8~I@0^TLk<Za&<)cY z(q?5YPN@|7WS<c=&hlJdg#yRmj~k9_Hd~huR`wD%muEpPP%(RYScsW4SJ4JVGNpvC zM>QU%?~5hdd|C;KpMuOo>tf7z9W&+VzbbU?-yyX|uH0b8vz7AU6P6MbcK3HTsz}Uz z{LkaGoCEGlUx{VcG>Kciy9ImtHsqb2E881B&@zJ^Yd?t6FepqqAdbBpp&h6C@95T* zUtTL?Xfl&8m9l-`H>aiHzO};MnILz@k#OsK2OX0ge?!8~@3<J=`zWN6)xxZnYHy!V zNJX>i$FaP-zLjtH4ZKPMX`rI1!7APlav{N_hY_EXhwG$ge#RYQh+*}f?7i|sE>OfC zQalZ;4&u}iFBwp5O0f>&OK*e~`pLaku3DGvz%GsNl;-6v9&t^ByjrYo56EnFE$JCP z@kr_58<3c3k}<jI?V48cI3|MWQ;H74O4oIP1SHsn{_QPU{@@kVaZjvf>ZU>z*+M^* z95*Z2>V6o;FP8iD(?It5pp3Ii%8G4eH?vz&lh_SD$gKim8;SLl2vHPzArgFD!(U~z zC2RK47{l_B(a<}ZYQk>5+e&MGMpp^f@56fm?*}nesWuL>%3Vod5JpEhHLQpLOZ_Eu z_WX-gIepT}P^XQ?$fYo3o*z0H&-5LGQ32i3(*mZ~cy8qhkX>6<<a(LS*Y4$Xp)3wZ zj4(Uvq7a=`^4K9+Fn2*u<oS5mSk?v)forMVFgFe%|EP!MPLi|Q?cbR<5>P@6hp!f9 zE1e*}E;afbX6|D%c3U|6)jD43byRRI9#nu1#4N4Cw>eWd6G%c!O_(y%%UZT1exJRP z4=5JrmZ@4sBy9hQcjRdLw~kddI<Ht^0Q)2*h$$Mdczh_4y33$bjQ5%2*L0Qo5)v?# z{$(P{B!B~qqkHD=Pkb~S@~}rj@*Zx5H1N{l<Wf3buMJo0pBbCX^5&l_Je}U|Vo&{x z8gH&vi2XE!TQ%xn%<9sf^y;0(DQBwi9wZO5Qmn@<?SV0T5$1mk9~HLTj{QYn7t5!S zTAQ%6H`i`%nFuABHowU=`V5fdbP;+Qy;-`w=30eLzaHDHzYqTwXyTc#@}n_Qeagv0 zWQa{fvH5UlwBd!+Kpn4F`mc;(*=zlN^fnql<s|Oie!}6lX^pB>@IBBq#!?w@cE$a` zK-Giv4LA-xMo0=wzP}JZ>LSkFE`G;QY)Zas-aHlbP}KfW1*c5#+FdKTj|TKlsq*7A z4eeSD$DNw2TChk-{q4rT|8uy!<1w>VpQ@|UTfh~U;+$^DCL#Cct~qWRae4SQI55q| zLE7~WvL0FAwsVgxFhfK_8$@J;u+9{mvoyqr*&uk_hRJ<rjap;wOodtehj4GJqg|B9 zl}~?d;sK<<%%k&h81uiY7i#<eM&t#v3=fyg$!zq$H<4Q5oBPyVT+C`sW|+JS*WxBL z{d2`3<_Y8(C3F-At9ckudc;+gji`@$TjNx1Q)E>^$m?M}<U(2*<#-<!kwDce_m>n( zfU@ifWSc2U$1iKGo)rb>eM-8erg6&=zaP)QTZpi0_ko7nw-L=TegPaZct~31$GK+h zXJ3+;rM4jwa%fCR;1B->X;CWW&PH=$FR;s}Q#A)1B5i)KX7_!SpHupO9dAWhQLkNT zx)&z~%WFKob<T{0dq+@K#D^?@Nw*>keVbc5L!$ZNbV(jL(#9X#11~Yag8STTVT`B> z97zg#bTWgSDV(REy<2X*`WKR-Gla9Pw||c>_1w;f4tYa)n-b%Tgo8excJ!UQfV)q8 z$nHVf8@Fn`nZJr3`UO*}_}QM<UaK*V-Fb^h1*Y2XrvDlrGw|^?*csXpx31F|t_)Lr zSK+?h(3XJfuO%{|o*Om0fpA~qvPF5dqu9U(4uAQt8@aOZr#s4*wu0{sF>P1M6Ht26 zJSNcolvcM&l9ed_JLoha(;=Y6WX}+ra#RwoIH^#bHT!K&m#i|LoRMYsn3zGs<EeLF z>}s!jzi$s)v&+we(4Y!X3+0F9FqrnU&NS}$gPo!_8Z`=CE=c!5mKRbqDi_9XH!5jl z9SD{>yZBl;SgvEC&G5qDYRSC^V|1js?ip_-?REWL_w>&}Tn!`+MO@A}%RwmeTh>!V zTs7{^mpz<DheT{$6C60W3f2<G`kYHGE-R^Tz|(%+-x|j)xkbBfgMv?wTC1cT1gqih zn%*PiJ&Xr!2wUGx{m=O#%~+^w{1>J2tfriz92LHd?DSC!?_y5m<9U`bNhv3Ry2U~! zV~kXs=h!1gxA!=7vEYUgFJvj`)u2hgJ$EvC?VLm(vKp&Q1dk)lGv8WRSOi14Bp>w_ zf*!xIe<&3l`61%Xq$n4c$ou;;AT}1(ZXT9rZ~9Sy(j);(2iF;h2qvXOKnG0aZsg}H zz4@poU!VwIBR!zd3)dRWeXyTHo{&4}J%3ldz9#CCfG8RI5q5>hR^qi{+hDvbSk0JV zP;v){n_S*VUrwp*2w9)CaVFi?vwwyM36WDZO;3+5|Jo^Pkqq3jEUSnkzyCR{$y@cS zO3V7E+_^J<_#2BsPPWL!Ur358L%hTBAjsnFL%E*G!_gZIM($%Tg%rU=6wZVsEp7Ji z3saHm#lVmPeY<VuNs0}gn~X>E3;4`)G(IZ{#?|&Y>ZR!TJ^1XCS}r90!D$ry4EO63 zIT4j+wq?>24>ic+n3~IlVp=J-P0q+5DvI4QFI1SdBv>S8%#E<q$OHTIFB<aac}Ar+ z`QkPjvc8Kal5!kplNq8{9`dNNs7s*&r2eEY8t+8i(sVQ$w3bhQZ^+&^p*oQ*2jL>} zrnSH$dn~(%Wof0{3~Z%}q1f}KZ_$)2ijhKcZrhxc-760*8c**tlT8B+*p8PxK1V$- z`k<|Gk`=%2O+li*WIeaZ4v-y5bv|R7`kW*>3fRwWF>r7)9mgt2IJs5Gm+i;j-yQFv z`RiD$sPSs?ej3->wR(+ci2YZe5&p<R0Rr<BG|r;kPafewp#*MBX1zsZDOix3h2G8H z*4j|g%<Z(NjF))9hs?zc^<h<KMrM|qMk(rUqbUYPl8lPx<i#4=<KB+vZ>NmC!1@cb zVYhS#gt#IV`ZZi&pKerGzc;aLvw2!~UL%`_W+OXs;#z%IC&&wgkcu&a>$xw5oQ{}k zk(4Ai5!MT{xT#_Q5B9acx-hoP>EN8RN3jFX+>cmtI=zK$U9r`R5=wS_v2fbwG<>t$ zIMEJ($YQw=6&9Ja0|xcpa?5gyu9z{^9qiI`QcOAB5Xf4|We+Uc5sf)R!8gwXmv6iv z`*?z7`<RU<$?f@2^r*$2p|yY;letXqm(<80Cm}cZz;5$2k!o!YZHGjciu=2HrND6@ zL2MA|+EEfPv(DEYKQX*A5ch8+oOtr<uP5y4c`Bc~dJJC-ef49Oyeaj)s#v|%YG2I# zRK`GhPZt&Xo$LhFH#I};PoOpla3P(^RP{jvuh#j>DG4lF-(T3zWg^Y0+ph8XbLA0D z%SG-gEE(A!M=fJY=8GOLvLK#K1PN3wmP{C=DaJv^K#V@`1*EG4Z<?7wXJ)83`kqDO ziU`#kQl*omYx@X_&cs&^PFe@<hc_J2VXS5E1#ayUc$ZfDN)EMN!pd&<gxFVlPks{2 z2E#I^l?;+TCxFCu2<9eo4r9XZHiopXsCI?4I##&VKZ%<G*33p`&j)uBs8wgFi#gP4 zKjbkkfJ*o~%ezj7mGRT<x2d#9UcUO7Ibj<RPfFShmen=<PPuag(ej&n9Frr+_9zvb zns{6JZ6&y*grleP@rF>M<t*5wvYe++)pM6avo{7_xeJdnsl);nQ7F?WGu_ur)% z#iz$5Zg`KIJTdd}n1SK+WC>OYckRBZR%&TWwr~!~uvt30Rlr%k+r%v(3X38Qot9Ho zaiq}d+kfECrx=H36Ox{vuVL@7%(qYMV~Bej{i9*w9Fk9F+r|P{=Ni04H~^OPPYy#8 zPh_T2e%~CMx$#+o$zfK=ZfQsKgplzP<K(bmk;`dIF<nR7cY(wfUCMIGSK~<eB$o!~ zm=J?YKMQTk7gXg=Z*?(|{#bgVO<C*7jGW3~`)6g7CYpW@<Czb1U9|+?iYE{AV6z{` z7~gi(@0Iia9ONllrI;XuIlm&0o|;GXkUHH<y&HxUvD?mUX>Xg_ovgQ68<xX>+keO3 zeZSHpD=;xo=C0b0iY7I7Hu1Np0haW43ZG5}2I?d=83=*zyYXK}t>BZxn@@RgG9hg4 zZE1x5pSx!eL;jDe6vLVzkANuPL3~YV!!T;?+G)Bcp?v<P^>|DWj9(xr!4+K9Vqsv$ z?hXCPf#8am7=)iS2<p_?ujT-wjUjH^9J5#q#up8#ac;h3J>*1M)uwnKmXVA!aH5(% z13QveA5+KtE2h1tJ1W}@|6I98Tef3PD!G_Cs&rxf-}aGz-Gg1CGH@&bVKmd{ofZj< z-MdPpxH!=7c~H{=|H@fg%deK)hQni<?V}Mt$h39mo{X^dh%#VqD$NSj1dDCC&<xlj zrCCX4R<z)(n+z=7%$SY?fo>z0ap~CQi%6Ph|8Bz{ANy1$S=xVo61%9gXwV9|TYGVu z5O+r|ueWK@?3d1UM3{H0?lG^*nwcW~?RJ#4%hAU1ld91$HHv@Sdw9<`>R&u;AZ;Go zo$J^9hD(f2R{K}0m>Wj$OK*O=V)ke(>Y`o8Bf<IkKUeB{XydQKNes^~_Wc1HQk8$p zy_{+(sUF#U*-JD`+f5et_}g1HDo8ZDAuix*zwQ?TPS4WaDsxbrJ-T7EjbC0wAXZIV z9fx%4lSz$)CLKMV=@@=ZXXSM^mXW(8xn3;`uUj}gT^!-^@-cazIXj)#)~0o3TDIFF ziLS29LN`kM-YBgj1uN~=#vf{S=R_m8Qvu_Kc*V!@ip<z7ZT__Rs`u4kH<ps$w7Tfy z=CrUHl)xPizHa86zx@(HNv};zd%d3qhw;YMI<ZYRGx-kP-a(}aK!ltoiJoRP#qH+t zem+hM+mY{ARp?}VcQ^9u#E;nc6N1Ah^g*P7&2{TTnE8|Zt~9E%$gh4NDXS?NFc|do zbI+<(ljnkOjg6*Jq3Laj%^e-JLSNhm1N|dm9%-MlD7Wfb{i0G?DRqJn6fHOw{R-45 zV-oe;IGtoA1d=zG9mCiF$I|?ujgl-o#Ydyu*FFG%!%hX+N`>J05sq*5^M`raiAJ~G zn~`JK5C{hiXJPKC@jyP-IrV_D)xHMZy7l{ji(EUnja0H-Uj4EG@6;cP^8C#?t_bE^ zaS_JkIJ)chDwzM-u?(Xot9L7bpZ*5EIWkye5X+Xc*Y2N73W>?WydBC)HExLb5c1&B z-$mgnM9Ir@<(Geue*O#kycVT`KFfA?)%W1^lV7tgrr7Gu{Aac<4eS){8PjD?GTaA8 z1aMgMXhFOd%=V7nEVEimNSpLQ^Q<r6Z{M|wH3RHR{DY58z05Mdd#5*HHAQtI9$yPt z3s1r35Np?)*Sy>p736W{(rFs^Q6t>NmbQh`A@p37X0VKz>0BW*^LP%&euKhWd!b#) zC`(Ksu{AI@goglJnRLnt$cdk<9owt6t9TOI3)5^Y^@`^zj5h1|mFgl-H#!jEhUbO0 z9n{bz?;EXOZ8`4mKX0!{FrmdVV&%VQ*d(`h+ZQ^`J2PZ$yC@`7*_!7&v9yLitc20V zk~so5ZzliMGx_3Mw=fnt8DN$jSkK*5rg;fA2sF5JTJ|-3%Fj#uPTijwZT8j|?*m4X zdK)d{*EfVJBFvDscwO(lZW9!Vacy=iCbT=~%G8Bx2xq7o#lQ(1U;LbBtu{oZzn7)R zz0#vYAWe2km|VL^od_QVFYHXl2hc)aCeF{VS~|ieM_b1>OLx^Dn9ZSLqUNyb3hI<R zw2iXVhX-Pdo}AAP?vK44)CSF@QLFP_Or$N3xk|<j{=_%SckJ!s6}{@2+#~vp5xPq- z{ksT1WsT;3ZJNimSm}+t4WcI@+9Fi9O46E>Pb653a~T{L(W8Bix%vQ_TE%MJD>W^) zaM&6J6134wx@WO8vpQ*`GisWm|LBh5%^&;)j%7OKL&(;En<)DuG0CQDLvlIfr@ib$ zI*ZdX9Kl1GN_he|lO2b+QPz{*&v2hr4MOe7&h@Z`Y*QoE6lhUd!Crn*Efr`XN}pH` z5}W$hpZhUKLASJXl>cgD%l|r%-xwI*`?<dcqaCA(oQOBXLm^12Y?{)(_Tsd2%zPso zXHaf!^5Zli+Dp#54ODY-BdxdZ^HALlf6%qsZ0R1a*ttrr5w=GC@e!b*Y+1ODF&0Pk z^Kkm&EA}ocN@8j4MkA;|MuLHYx&L`FiUUsPJIi|ttJVK40xo}cF8NedLSM*TNAtNr zqZvgb2vSnXuj@fw@gM$SM~Ag}(v&>$C<m+3Kw>YDKF`B0A-R-Y4Pb+mND;xQe#)`% zP?)Kvf?G3+_&JuTId=d_F;1yF1kYZt`TKl(Ryq_v@L(t#>u}IK#3|_;4F$HittcjX z&J4hjSY|?X+yUxLtOU|bt$Z$Vef_iyO|2HU-UuInMBzBYgZx<GRfq85>LjX8GHJm} z(sR^+y;9(}Vnz(%&gjJ1gPR``eXx&ta#idVncibc<`I(ukC(ac`zVs5CLe^6MIt7r zd>op?Uu<UbTBF7r)h{tw{g97IaL&^(w#nn_Bx7?RXa`l#O`-Z83TEddX1`7S=y&(C z#<fH}ktY*H#Ydc{F~6Kd8TB9Mm4|<0Ssalgr!FSGYA*duwa!)`Gk>@4{`PdG@ZNE@ zwf*9coyBS!dTFKw-FucTm2Ax~1l!ByJT?M-cBfpuXku7=3+I4r98Jpx=#iws<FzF8 z<ga-4ldg?Vm3=i1Y@8B&DQy)+_clc>KR}>uJ#S}R;JV@EA#|sIQj{Nh3?7w7y^d>O zY?Gg=r3`=>-Ic2HtZ1v*w{E8%!n1YPysI3RVU&_IO$DI1Znl&M8zcL|;$Mi<c#6?i zZ*oTN{XpEAKS8Zx?FP~9j(9R9kw&)KJM)}mr`*Tluy?9Tqqk*B{F%8ekn(MA(S*fM zrUxhQhWa#%tt^1)&L&~5lVAL2RIbtS9|Ujwp@=V_)rxUsNB7r5D<(Dv3`>x^ls5ws zE-70AVCMJ++5Dt{JP<&5m7c9_mEmK66$00rP*d0tFi?eRmEn6fGiZ`)LKs0WJG6jP z2B1cCTtTrSt_PtmD*by`_fh7Q;v<HY^Ff>2?3XTFr=U|6i>TK&MI$19V*PW;7Tlfs zN1+*Usd4zxOyj2CRuUYEG~}Zp4(DIKAoAqgt!|}eH^m0@kn3XbiV$2b)^WNt8tpw9 zd$dj505!PSI!h8ozjvRqPOG!$_)LhsCMMEL(p?l6>($#veN0G>Nlx(0#@rJhnT1T) zh=+EM$p}XG+qr$JfQVx1kpe(nO7U=ip~SCCXM>1%@?eu~%LiO-70s<)$*LY=RMrcJ zuXkr`L)@<ho6lg>SnlIf+RQ_xM$e00F~ey3Y_|_THkvVs0Wg++u#^(%R6TtYaTYC! za$-ZEgBNvu^nYogTfUa{an3UZ4u?X2h&k#Gq@oo~%y2(`{Km}BVgyU33N(|ot$;*b z(Or?Y+<A%seBMhgaBJLc#e}s1Lhi9Ck0uv+geg#E^b(Y{yJ%R}YBNY_y;9)U<~U#^ zu>9zJPXh4f-!A{b|2K2^Kde;l3TxE!rR@*1O`_bH6k6_bUrqa()dC4Udf^dxHA{wL zqk%@8PJv>)p@U@89pTtgS?NFI@cgm4l4i`aEe80cX1qwr1l^OsS6HQ^1_ghYznzs# z+>3j8j{_PP0~nFJOiIkfl8w_A0rxYNMPhqfG3zsTsFtZ5LJ!~Xw<Xj>W8eE)S9Yz_ z4A05#rvyU1CI75bg|ofy@lWit$WH7&yv$jldjLCC1xZE%`%comSY+((9A0GsIVQM8 zYf#H9UTFxy;?8#5J-qR1J92GIr_ZzFE1e&fe%LU}k@@UUk4rkeWQ;RdVAqmDkz~c4 zo^`uN?p2J{H~Gm}>4M?J15qR%>Bev(lDtm#S=Vgpw4_U)rRRFzBp|aRJ^Z}T=}3R7 zXtC9Oo9ls9*RoX-bT!2fSOkd6F}o!M!T7m`)R&u=Wmy-EJQvtjds}_m)5Fl^$A!wi z=<fSD>!g*uuJ-|Py^6+s_e}2ZbjlP8jz3B=yfx_Zy7$eTLe;A3p@u9SYmda6l@9yR ze~G{U$MzrLZT6oScFO4xWFFBvzS3?HUlBxAJX)kRECYHMw1i8%%L46!N*HsCYQ3UP zh9R^Gi=U@UziH?xihS&{|FtQt$vl31kn|?or?9%R*s9E+U!N@VH4RD3EX`UUkef;C zTRm6<J4chTW~NS(dWVx?8*3Z9UY)Szq2u=9oSP$tbmogtWT&$iN6wfU{do1>!}`zQ zO+If+(A!TC4Qbnzi$0}_`{gp2PqM1|<OpGd<~hyyCUsaEe+pWOK!s5vm7*bw0+l5- zB}nI#RBfMRo9m30%*nN;0G%^aZPOG?dTAlmlx6zgHvpjmI96YQG`{?sdVSEGw4Iq? z$UDshVbm-s<Y<zbZ-g1gkgJ=qDHwvQ!R%!F*Xyo<S%G>viVKC~S>f^8600t}Nj8Jb z$HUjfG~hQLNY55YvpEx3MQ+NRFxAndZdcGGl%90siYv{bMP^%#q_?(ot`Noex*{J) z%+&62Ov<Pmo~pYDq`(bKN1;Rp=_xZ4c@sVL!NILhYO!N-*0j;P52M!$yPK(Edqg=^ zZ6Z5lW?;m?w(1OvpVxV4-{@E)ewyKBbHpRvQ$N+XCV7%j@@sAfu-*!kHFEfx;S0yW zw|P@FK>mjUPQu+OA=gs`blK-NCa~L;K~XWb+vJJ%vtHJmm%DLY`8TBavKKBn=Wkr* zHpEoYM<Q0+1o3h@o_KwWEZ0wk6LYa<tZ7X;)uWX*vdGzLuFUnhhYKS#$4<qy8PBi7 zDkt6`&<{j46fm3FbuccG!4+u@rBq9NCDX8%l$oi47um13P5Q0!Q?Nzu%U%w{hz+9G zZ9<T>%k7Uk@-(757=n3PRu~+R*0+{tj5F){5FTZi1IR^GhJ^h7?KF@sim!n=yX~|W zj_XTln)bY&r=fXFJ#Vn3Dp@0?uu=~iU+0U;k85l|dscFu@)G@)HoocpBF>_%ffKeV zuVGX)7k0-PKe&%f#VQDPNUMvq#fZi=n0)9Q<~z4K&HerJV7fbSjb9y4p!nOd2P%dr zpbXe{`E)~e(oi)4;X_U8vcBXD9L31J=f(|J^KlDNdYKL4lnM&A%x^tnFpaHHL_wW= zt0B#+0)Wi=NG>s(Wy(R8jFxO@=&K#INY42Z1w0%MNe%zVbOi>g9{El?lJHf%W}#7{ z>VXqsH=_oQXr)p0c+d7XH7n+0O{aG_+l-%*!w9hK8(CiH>Gj|cE`wZ4ehIl`wzhpq zOMvzF1)jpQ79Bl@wDNe+^Q*TiS*pl1AAH8hb|iVXyZU8cs#NhdB-uORfJuV)3fO8t zluMYnybaGfG?Wbt)!xww*1!hBD>gR>^tGo-2aLU^nVx=@JF{}}9_WJ6(x&D6&pNuY z2=Uv(mN9Iw2O^+kGdGFe-!jl_Lk&yai9$V|WL5Ge>b4b>-ImjHYLzsxlR#75t0*h4 z!&Oc4=-8B({MTPvD(s0I{>zCS(g{t&jaGipi0+zl+OEwRdm_NZridaSRe{VGXiY2j zJQrOuV2@#&wao)~Sd2_P8us0`Mgy=-8I`R|W>QluW-Oh9TCaSjmM;P}s2Y2pt+D2q zkgokYs)0{Tuh)QIch}Zh=5Sl}ILUwV{+J5=uvG~IiW6k9ooO}1>t1;$*ToGDVCzjp zwmovJVf6UiV8G>^*`j$old{52XgHRiorU0QObH)zEs4tiTq*Es%gsxAaQ{Rxv8XrC z8dQDEGSH_TxR4x3f|l=Hwbggp0${`kIaM+otKQ7nX9^~{;>AEs5)2~@o`n!LxkM{W zX&FP&_H4ZI6tz-J_Vj4MsZ~ST2fdH33U@lJfHcg&8)ic4+Xl9fqL?#i8Kl7quILJH zpqhywRUD_DhJB$Py{jh(#4Daca(UL%!raX&RKskRHqXB?w@k*TW7ITp9H4;;zoe90 z`Csh42UHtbmo7>N+wFj9i~(Z|w8<G`a&FrMo7f;k4mOx5a?WxlgE3hkXbU5Z1j0li zKwvT^8iXW32#m-<B8m)ta{pnbXV$E_@2)rV=KlAuwU8)^s&h`&Id#t7``h1#tN?%? zOvg<+G~OJ!VH6j?u>OnPJIa|L|B~hpvkSLQC=zw{Sq~uE!<0PP)d(>cU|bi~9<htJ zSna*-@3M@mT)KSGqnUMC;<||TqsnVgv3Sf?>q;kv%}GXun)={b8BA;%?-N|ZVK!?q z8LjTe8ewI?zK{*VaxSW2CBYpo5QPT<SXpmutAvgcmQU1b77j-@K*26)Rxw4rp^mZ} z=f^K;>9uxyt{LzpLi!)gF8bfk2e4F@Y4ge`u?QB4nC^;V9pvmmypxE;a$AP-uYXI2 z2+Mx@XBz?5F6KOCyAVh_MS7w=AT8tsB5CygVAevI%uej>G#@tVU4aQmKr%aqd1RhN zseHD(-R)GqbbY1K?OXs^!48jyVJd85+zNmU>1A0tc^n&Eb+|6tduU*2>Dx{IXF|Xi zrk@%47B-;did5x}kgV@std*IPN3jIiLdpm06!nEev$~PRpD}Fbui;U}XbUJ>$Y$4^ zCHKI-T`IE2_^0*Dmu4!JQLvA7icfok;NNk_JIj6ubNEo(C12z4eGM-k(}b$jE47z~ zzkCWR%7s5O_aU{JVDv|7E@TCvRt-t-UfpCF5h&X&9#o!Hdy9QNdmR};yj(CqZ+1o& zS8<hW#?6&)?pB*&&MJY%&s~}cFbvLkr?%7xxI^(GxX!e{rtLV??1ZS~1x9VLTw1=< zAmn0aRTN(zRv<T>s|ps0u6sumdGO5e_JqE4g`0m3EXdz`kJ#uU5gmE&(9nN<c%0In ztx{lJc4+9S@)MA=SZF(kCL^1k6wTwf)YD#)W!Jb+9Y0yl2J<Q_>XdFCT{b`l*NrL< z<M}EEbLK4yhE%O~d<oWWx0Jvl8-|6yY7`P17A!6TzC@7JVk2YM1S@p`rmtDxb7Bd- zsvxhDjMUDz+?X=R8&4}zYm?;j5!+X6JQ{~Vo6d3J^6l0P0;7jjD7n&~=!gYz^7G1V zyCTry=7$P#h*I;@7yaAW{W;1Q`E|d627P;%Y<pW#p1+|T7`^$=8~g2@o|sF~?3?QZ zt@W6>gPLKUbjx@xW-))LkGk(0i+sVye?H;AWDmhv<hEl-@7doj-(uwT2>0<3s9}YI zB9(Z{nVs?o&>yPIe=7OA_zp~pe^!&jj*LE7P}dq-Y9HMzIDP|g?O8*&JXVle8PWLC zV#RD?+BY^hb3GJk>)n^sVHz>TOO{n7lnt;I`nXajc0;RBO7mz<0zlo%7LkAgs<_yP zcRx2v2szpr!Y<^ze*djdmal}rTdM!JVO$x_kK*b>Ws|kSr$h7RW3Sd~PWGrn(+G<u z{0>fy8lrP%8^5L8^Zeqw>HT_2qbjK6#j}9AcbOiH^)Ye!hm>(W7~gR9FVU9%%DShm zpOFhG%Up@;;fr40J`;UjHn$U8(=bulY2e^m3<yDCERR<9^%<lOqTJOc5z-nQ3RjE5 zJC)HwwJy2kI=SWbA%lZ`lwpRebe*|NkSOx9tvIb*LO+yGx1q$P=CmAS6C11mFC*AE zUVKTs4z~YtSm7}1eT>q24$3#Xc%kDacjWYEr^<fsB(Hlv(#q99+G%L4V+^+T`>;Rt zu7AB_o)~(1RFVj0RasB7OH$m8d5NDrWF?N9QVuQ3Zhqs_{P9uhVKaj|k<H_n%=|Li zb2=e?Wo4u4mB=rQgCJ`85p=$#RUE9EHnuNt@`iygZP9C$ipe-+2>qEbay;p;*!KCA z7+GG!s=H~2H^E1A@O4{tC1=v6*#6CI{%<8PG4XZ1DW5HV$W`G)l+X}d5QBcQbs-4P zTvLhfs|d6mty*P8-gogX_AcHF%eFQiq=JGm9+md1N<IKtq-Pu=Z~?MZ<OWuqjj@%Z z&a-v-0Ca)?DvS2kda)LWx}(vdmW8~(baqBr=Iz6Lhu1K;P1-;U=NMPb2sR}3iYAxA zixtn!tRV%@Cyf939?rwkd>wpWVr}#MKAsH6agT+lJHELxwn|jj%=Tsktw*w7VD&ez z-wALtuM5rT{!kVp(CFvFMX{|ut3Rz^e&y+)WD59!@~d7=YuiT)6Mc7p!RnxKyV^QO zuMk<w58F`8_<&l;)DA<U!80)pr;B&Z9*y=r;W?C2c;`wER#>i184ew3SUysJYKQxc z!fLpdmS(T+QH3#ffzLW~*=!vZ%i;sn6@KIvKef?-BnUzkRre)hdQaWr78eghrhCKF zUBE1(JA{+y@T@b-7y{|Jh9N9RdnIXmA++fjhBVs5c`7GA8TY1nxYS0ivmtzlFUCHL z9j(|b@U+obeaYBa*HH3|*$v$br`H1!azzD7F)keIrh%cr{?%atQKrj4I_IibD=PQ3 z&u>$CLh7l$lI;Vt`4NQdTfK^F1D0NSIeS+&cA_S<zJD6^hVVW=X**|^cBS|fFd*Uk zJlHCV=h$#3Z6t7TeTV^=!s;|5!MEe=XsfcLjtH!<Ux!NtMeFB<vVcJ<@JUb4xES<T zOnGK)b4Ooe8kcal(TI{+f<jeKk~c`p1(q;wfI8`0i`l)j`L_GVaa_dR(Iws=iL91- zPE>ra1I$TS<lKu~*!&VgSU9g14`PvDHR41f3XH)Ce%mR{%zh@0XPn-5dq6@06cNcb z4Adnt0OFq0>*OAXm@~E>W>p>Dc-1mmZ&Bw<?w*Z$AjF0+E_nxX#$;RAgCpiv7Tb*! z<1DKtfWo`{P;wtA7;SG%k0xwNt$9<5;*vN@zW;FjFrqO~hk7#};_K|IJs4<6#>4Xz z7mMR-U%>_twW5f5_Q`k@_=aD5lIB&vsoe;tQ>$x8)myvUumLvKtO!g$(c%;`55#lz z17r<Xy2d{9o$r3Io(jIf;3xT^*yN)ltbA<p{HFY3E3A+loum<HxIZQndzJoP<CfMV zMxSOnBlf%0-dzn}_TFqG^*ng2fzpom**Ey@{g9Q3;5@_tSuk@~hDWm9&2<dnGihxj zIlRD{Q1<|2YN4Oe;;*Iru!<btxR5%)8@?{EmN?D;=9dhuZb(;o5SW<ey6p>}aToGE zjCXAJbFq@{L(j@OFvtKdznK0}>ATZbR>xP1XO*gGVVwoFCQk_g7QZoFg%_eH_kx=Y z#P7&&7C?9aeE1s5ePYj}35J@UPoi=V!ouoBkO8xEo{PR3<DHqP8>VYMFX#=ln(9+x z-9Ei2wV&q@cD%Wma;VvjE!;&kO|^W#Dhz%2t*z#L!%O?d8iEz6kt};3x9caIkGNSV zQ5nVU^u7Y6KItC%&&%gpr{ML}-{y=fi<ooyt|vK&w9p&MDy8rV@;)oX`+CLc7OJ{R zl27!rQ4oLYi(GMp(XfW{*LU!{^;L$N(!1AV+%#n5Y4nZTlMJ{YLUDT+U)vyu;w!2q z({H0x^L7S1KO5J2>uzWE$)ECfbsH#GEu2SYEJoa^0VpCIfoYARA0c%#yJDLLo6?fX zp)>E4j)&MZ!Ed5Q3Kzz}Rkf?D{gv6qDOLH`SKQ8yGqYC#x)rx1)u;5j%d-P7Ir_8% z&-SXk_Ge|W9CY3u;}8=FNVxwI^V)|jKE7~_K!+)=ZeCN{_gJ2Nx0pPgH*Lz`Nmhj( z4<fEqJz<)YF*B~4<XX<XdMW~1ER@$+oWEkjmeNq(;dR>QAJ{03<P3K)4|^euc?y^^ zTa>%}vtM-#eT}5vJbmF0ig>w^E_24%9c&MvbL`RWdIh(UNH^1hGW`e6xvn~)?EBe5 z0a-P}5XxO(Rrq5G2vD1CERYycB0%C4Prg#V1NI8h2p+8rsmwweARVW9yQd#Iay5a5 z-Co@I1&+GBAwCDNSI!3_O4#FIh~QG>x#zhshAurG;yZ;HK)gpuTO(PK@>;L_wo`d8 z`#FF<J`|QcbjqiAPass(g0<&mLug|Ou)x6t{sx!_9woJSWuNo|zTUOo<BPL@$QV`o zSSirt+X${Xn4)tsbmccj8tTkyb-2y$VT~uO^>+!)%k|J*4S&lH*W@MR@7-5CMuLZt zkvw3FUDac+L1{;PiA6lbBe&WqQBk4DMoI@Dr<JmA+djp%L1gV+ZqgpSE}|+q4CQd2 z9v#kKRC85Wg{<}l5c))ukJ^1-Rum6)<=I3vb*9=D!iskQ&$Qf^WfpIxem?Ee>>6pA z-uTMIv5Mc=**fw1)}h&DPaB7hUVuBEdmQ2SmchX%E8|^%rQu=v{>S{5GWhLR4vww6 zTDJ%S9h*@mO0&*Z$9p-num=Y*>!@StMembl&PePwnH0i#>o_@)Q*I~|tuUXphO#S? z{>o%p5UDhu)xY5Bvz09k$g;`Q(d5m7RDWeEa#;`8`k#=s&A18fF?ak!Q*KnWdsH0A z6e&2++uxXmUV2!U!kW4u^>zxQJIayXjn8#jo>GxDFE5q~Yt^Nd(QpmLYGPwIWXGE0 z7j>d&53EJ)nX44+2i50StBAI<?iPxBG7{dWF2dnEw6Hur@nUJrRqik;uVOm7tvsWO zbdR$Fd!;#X4A3Pb60|!xk?|P9F*WpXz5LmD9zCrXY_Dlxr%6P=hY@$}BSP%*A{*7z zRc&oZzfl*t>Mc8(xn_-JH6{J0&6eJW62`r-huh5YFY|g(2ACPCOc#z{;3iqB#-n9* z_;&@W79_8_3Hxzxv0o4W<2Bp=gj7Vvbn+XPTMOof((8u$W*^5ZTAiXn9S1ixQV=aH z#UR|@gfPE#-oI{qjXYW20@iizR@j7(2IE(@=Dm$a@c}jR>Qr=Hc|vLMlIgn<3j*4# zugSo-B(zcAJ~ZE$w^4oqW8PIxirCEd<ZoCaO%KMC3;G+wJEZL37*x)Xs(5ddY7M@6 z3c)}*sV8OTd@D`sEAj6}&HruTx4+%)|KPinWBp{$gyWPyaGD=;&3o<SBC>l&prWd% zbEn+u?l&m>Pwjm4sG(C~+(85Pg+qJ`y9gdX<8sOPSH>|S$#zez5B$vhG+3Z=L+?na zl|fjR`po7;Y)6wpa6bE$Y4wuGhPLnNI4qbduydEeuDEh4Ul-=njivxL?n!HZD}aGN zMLFf)AAGd_GnU)zX<@kd7T%|sH0o0)l-^2m_OycTPSx`C7YBO;d!gIw4tMuT4Se7O zhmtd!94qmJMpv;U426o=-K&Cyx}l{Bf!9{iz))`>my1rI+?P=lwBW>aJ$#p|{BM?Z zX)H`@M>eozmYf$O^Fhv|ID*P67<D`Q{3w1_s=yQftx9JMRr#XiPhVS(Q`k0<jYe># z4{Kp9f<l!<R9LjcH(hD=ofV^{Rlmjj?SRM%K-pew6uJRuS6sJ-TT?H)49E`ec<hxw zcDR|iq<cj!yQR{S)A*jsOQ`8~0w!d6FV;z+h2@=$b+Z0pq#bU{<Wn8nWc#qA5x2x* zKn2T6HXa94G&xh!@NqdQHS^fgblVQhyx>zF><V}TpI9B$DNHSF*1s&Hkq+dL04m#& z)!l9fl1=eLcIaAFG4q)ZIb*~&LqI5|P!H73)qaDaDiYAhHOxTXm)+wegu-v2xu5|v zXjuhu8}C?WYj&PqjQ5AxE%7>Qat;7`w@BYx#_cjU+EkmrEDlS8?;gC6G_7^74c>m< z(K%>f7JNKqKQ6aLpa*X!WnN$TZdo%RFKe)hSp}zdId2vYw^;PU<tOx)r5;ocR@pX? zftw8i)^?Gmb=FmTgo)|~XW`-k?yN!Q%(}Vd!yn=uoh`X0Lzj)8f3ZkK>|P-I8y&kW z=ULrQ3^a}^KY$0X!o?Hd0}!8Sh#VqMLEEtV-c0tjChjk;+?hB|N+KR0r-QhSIvF@I z;_6}`xv$d)<h9oz6yQmhe13r3mI|#qKWl;{9b+`Pdnd=$m)EG_bwQdR61_$9%?db~ zE2}Os0O~k21KTq>N)q);f<gL`NDB9uSf}IFG-qQ!Sc39{_Q-G`r$0y0?;CV#&XN}o z!2bHE7akkqGnufISm(?lSIU<X=HKmmejljtrN#?iw4-3F;Eh)=@A=9k*~n!KK&wiv z;4%gjw$kciHu5NL;{I77J&*I<<}PdT1xV#H82gR9+~J{0;lYxwSd`<e_b@`bq9MbW zwim2VteO}-QF<~Pn_wgXep};qAxtH{Lk9>b1wD9(0z%b1lWk-S7Y)4;w+GdH7diKZ z+RCJEz!}+J7elt<2g@{8oW;m01FYPUcGOGMBKYO}%Bb;nk+OWr;aMg3_hg)&(I|$K zIUj99V!zXNVcgcYYQ=2Tr`W^BtVZjtH5SC`nXk)>09D${0u=z?e$3t20kZjqhQ|Jk zPw!XH8pP4&!*)grI2A)f7g^b6VKu;wA?oj%Y$@r}yr(K(nVQe(7ZibYY%A;8C>}%4 zb+mv-*CG~jH$OOD7F+!-;$ckNw=owKEuhH=k6hbtPub*4+0)8h;L{Ks9f|1X?V{EW znle9|OR=FG)ahM&1F~uqTT6a0D%+y~ep{+HqTg`$P>c`k+O9W4p$=Ls+7x;1M>^!1 z#9`!dNE1to?mH0%I|m(y9vj(~{)0lIi@8)P7P_up`Am$o))z1@nKPYr-?S5&t(NfQ zL7w~lM%r3KrD-xUShU!;+^y3|ge}6y1kj+)+h{Fin;4{{(M&29TzkT#B1?4p@@lbr zjNfu&lFQ;^6?MPgvH|b#!&{|R=8xbH+Lkkz*5tLu0$I0mz?b0s%nYV;3Jo<ujH+b$ zWxH<<T8l1(Q<JgKrT)r8G4h&H0HwdsF}?@b$(X%H#G^%09tp{y>sE9gV9IL{8C5k! z7vu63mM}cV%Nr3?=SClCQ~BK^<LC$#=$)-*WB*uwiWa{#n7Lo`%%_rfyCE8HY(ZWy zw=-Rn4V@eLDMmsZ*wE@R%4>t!^aKVUr&&djSrC?Pc6V?>{uQs3-Mlv)vD+PsUVf#n z@d*L7X=n(Mv;&PYp3V1ghg7{b|7D@5$T4v9IcOJ-Z)^<AHdidohqBvjwzieWBbZRx zroMU?<Lxj7{@DEi!PVzCnv&D?#Gg$>*eATMm!vtg_F1ki+@?mRYIcvj>d6S1po_hp zHNH9T9Ya}M7ZWYcDhg?5c_%%QYyj0jc}&kAi1ZgM@FpC3M%YY_e~f6R-(Tv>nVkf$ znid6U9K6l%5lIFOdU+<)_6P}C%VS9vD9&Ebsf#=l`jc%+{Sgh(>W-R57167!4pXoY zdmSr7#oGmdbLN0RwBa|orB}+0A^j^;Nz04$uS`0Rtc|O&w<ux##O%xA@ufhV?~zTn z=m@Y68hbO%v`TutEzk2R!yJuN_93@<%CJZ2q)eb2`(>QGOM#_7KHQWGd@~9KD`kfm z9@k>+qh^IP!s*L$fqW3@MY^7GnNwr}L<*GO`M~$m(~!7zuUse|qegI6yIzwa{jO5m z0!^>^{tf1PrE$+sy*IsyMZQZ@g3*ah9{w{a3Ces$3qd;UE97p9T=kP`*(`r0cy1n1 zY*4N`7Diu+Pk@h_LQRkNUPZb3xjhXD93gIX_PZG+hFiuodnCxk!E$>8P;<k&{u#i6 zPczaiu(yxknY~qRRgrv71`otUzcPt@y6P{y**{BEs<%J<snME3bKz05?7;M8-cZB( z7S<hsg54ug6uvRNPQ5FWsXxhg$}gYZu*yNnh9Sh@UDq2zI;{+)gKcZ&cd9v2_z1cJ zpu)3JR!%!cd8Yfur0C46<{!?>J^fs}XgE=8J`l<u;u6AO`!`i{a)*h+oB|M#t${tC zI~{}OP96@;fUcNdXYY%cyTiuMLdHISvbK~jwjH4h`qvR`fy*|bYM|}uQL2{C5=~k8 z9ge*d%hpzK*$HJFt^*Z%)+mQ;5rxqK)eO2puvUkk!AmRs;7S|0`!?{~BnMu)EIQ;+ z0POKQ@lFV`3_l`X7cdU|*^eBwt`o$mdk9BJ2o_733YnQrkQf2TY(^kbV!iM)brKyx zR`Le2+aUOzzHQFRIXUC9vUS3WhVtwHAiI%*cBiR|q49o!hf$dKM(qw}9|tnY&Z%4; z+A(iV@YAF62puo59!`&Sk4;z}o$^u05zV{>j^$7O7+qRKh8xi@b^o=uRz&lO46Oxg ztIQZtf7yObkE45a{kGR1Hq|41y>CB;Gj?A628i$J*2z~Ub`#ktx=7;mT6J|NZ7(Ji z8`8EQkX7k4WgVcnkbJa_3255$TG{IJSvv~X9-Ww@*&)^GD+x_JQu6bRUOzOwb^8Cm z1kPU@`X7D$k5I8@y6`qa5v)CAmzt_NEpu?itMbH$7{7Hlk_Q;Wr%#0cEm!1UHR4*n zLCzu<sB``9PRW+GOYTG_aS~>f)+rk&Q5I-0Voc&h)&qTtrOJ2rL#-Y5B5La<>-%*$ z%V(%KwsOz@VU^tlA996Tq&UNu9Y}SN>*{QHkC+E!0g3rx3Zf;xErv%^9`P5Rd@J(n z=fB%H|B!*3%&6LhP`-W6Wv!+;PNA(_bu~*pKLQI!r~+H!oJwS$aDbPN#b@d=bCMo| ze>d;t>xOJGZKP8)6m5~A7&MLn>ji|&s@CE_IA7Lsi!~@{&kV}d{N8Yz_FV&5?k8+n zSE%g#tC;xep@np^evs?oTe+e7v&+Z*yo{H0&Q|NNV)*e$WT|n|w7GEj9urwB_xVJ> zTOhBMs_>8Wd3IB(^}kmeWelI>fO)=4zyzH{2+i`x%q#j0}AzvV7Y{t$HP$^w#w z_J==Q%2Pk}&=@Vz^+m9$A3gCY>~Ezqv}aQ#dDz?v2Sge&mIml|-3tAfaR)gXe^l%_ z%xnAL-Jhy_t~O_ILH$FJQ2|)KU<FX5gg;*p{ZYwe;o)vI*JO9r<$pHipHJl<y@N^L z^+5S=_PrM=X6>?H?_8_1lqZxcC+2^V=r?o<7rsuL%;P2Ijp&;~`ETcpVbs!e-W}PN z+r)=i5)Ma5NL!y`={X;(VZ3R`ZKSQ1`YjMHkd+<KD5Jmjs{B6VttxN{jNjJU&ofzA z@{(A!I5sb|w0xN%tHL<+gQK_a<hs=9dBDMFN_Q*YTK2h<L(TJ`os!Q-&HRz6Uzy5o z6}Gar9J$65Yf^_VG9oj`{gLsRM&9Xolh#WZwm)+InEvN!`m*0zir&B--f?t`GwDK6 z6?3NAD=EjXv$`EH41~fT4w4j?{Sbi<{^7@bnw^#X(-(Rv1$SJOV;s+My`dZk3MMEi zy?#~Ly<mfl&q;`yI)qn;{`5Yf&Z3U&?cvbgZ-`SJ9R%L%_?F#VU~BIkrq$&jLyyWI zj*znxc<M2JV*hIGh(3G1l;|g`BCYp>>WarT?zwjk`klY3Wh55W%&rB_Uw0^9s;lJ4 zdN-~$=Fraj-G*bbgL;kL8RgJdOH(Y9=p;<QAhypx!0V9@8O@IOL`dKhmf@udo+Y-H z7G=v2SjAkvpT~emYs?wS4*UhCXLcEZmnR~PY%1+1JdmOcy&V;}E5ECV<aQFA-}#>G z!!B9aB>`*sR42j^bG5M4u={XBbZy0}=Z__gu6j|+LF3*vCEh0Qcv#===$+f~hBE)| zSMS9U+dho+?Bd09cukb3Ky5?HaYk1G`Tg@ovRwVx2&c`krWpPvS5<1?SYtXAIEetE zN*56b1{Xt%oP^wt*m6vtr{S$dCH~ph9>w(jbd1!!WD|IvRnwkK=cJfr-i2s4au=RB zv3aDR&J7-!6SgH&N<pp{f8QfmR_~2lgP&PRFhH#yA&7ndcT|9GT8pbIGRIJ3KiQ5a zr%1Iyj!VaU)dc9qZ08A3^5>vgo!sm&Vc+qv9o<-c5!B&srvOlnkQg^2Wf+rc``6~m z`i<=oG~Mw8Z@f{+4Px};!vLyAW|F6*+-nA0bsXi{?&u_|4>GF5r`*fvA1F@!wd&Cu znP;S=u@^gUmTmBDLs#w|0jtoC-acy@K7QF_25UKAvd?Tr-Nxl}&(&)@{YXseuuJku zMKmf(P2>?hQT<MsD5@#DQLh*p=r51YFt%>Fw?tD3s~>4FCd9RR@OVWZZF-W`Q~3EC zR*+^n2@3=`5Gae3GuIs>U6wdB1Fz6n7;+3E3=M;VVK<uN=e)HT-mpW?FC!I{=3WQP z@5gp-?Jof-14>B&GC5H{%`SMIM#x;6n#?4s`bwvFLiH*?%~mEC)&%>oF~E>FBBeN0 zt`3Ihn^O>SK%7W2&fhy*^jV!*Dfz<*yXpeD;D^bQX!&K#mTtV!no}GCt6)gWZ3WL1 z4@7tE8G=hn)J~Tt8T`4=zgzAjMVSQZy#b3IF8)s4#xLyf&PFm+S8&j;OhGg)aO;yu z-*}q)mdQNNIp2Z`rQi3s$+D*f`Rhj|{zs>me)#LzqDyK~^l<FC`l;pAot;H6SuJ&X z;~_7J5(!aHKhV2FT0{;k-L2Du>5Ledf+lA@*JAXypR*AUr?2z`mXSm<Ce*>kYJ8pk zRwaPIk#%WwB60eQUe|4)Ed!b97%a6`m&p+94hIzb1MydJMr`JTrd41uieDW}E*B{i z`I(Zc6Z1rs4<X+4W=^=ZU=9VJdCbwC^DzwV<zQMiLCdFFT<O&a7s`M9rU4asIR?kt zY4LF2u+q<)TN4`A;7!mUn;*95chziCEN=*Q-L=NIh;AP@Hc2Xa0YX(vl#6Ny*ZKb3 zxSPAvY?H%tg}rY7D{a^K^L=Of+sUezr!^dW@6ePQoKG}VruU3z_l~cftJ^PFNEJLa z{Ty<zvK_(45-hS~ANE6g!TBxU^oc&-?F*rrBZtE@mqcy1@YAgH4!%!yY02&owl&#P zP0F@(4p1rEq7MDqvm_$p;1E!kITSk*y6y-ko9dPgd5Vn81Ty<12*1xA6u>U2dPPV# zeYc?WBO{%anuk7kd8W`O*_|Qr;&jW9!QiFqbV+cs=aanYPiMK#@dd<Zm5Ju5feh^K zs{*h#$0r`+`m)!JPx9!ta8Z0bwd2qr3=}-fZa5govwn}p=a0qlEiVs#WoiiJYx(l= z;on*v_+Nd?ZroTk{e14;PJ?A~(+eVQGLxh(2_5s>XAzUi=vBxo$2}82wN@&d`w;a; z0{C&J|GLW<LT3Dfg&8x+Rj%x_QClyG|CyNm^KN210c}y{(5D(YuL;f$efo@^;O%1W zCLeM@MiEZqIUh(hR`^9DQ7RIHm#Q7tk_>nUKjat4xNn}^Uwh8p3xf=N?5l2|$ykG* z-n>Q^@-8NjqH7u%&dn8zjFfVT1Xw8?;hq2sfTkZ94!^9G%{Q`+oO(f=^bP7hj0kL@ zLA%%YZ{3JSckIcBi)<A{{4aDDmVa~CHU4^X%5(IPW!~q=WLnNwCKKb(6I?yRc0c<a zwOIsH^hqlth^INCY3fz+j;;KZY`5_v`j^>-E2j~FOT+4!cvWB4^j>?t=1+6}$&YHn zkuN@K^-Ohiwsxu)gtMQ0lgjS-DKGejee|c_Gc#c!+atjPeTve+W`t{0r9sMde#k0Z zN&C=JMByS6lXi8}4?j*=z1VFYAF~ju{2*DH?0h>)K&|`c*6}^TWQ;kXK{N7t57+&B zhO&sB@n|!@gm}WLn8V<NS<SW)5TH8R-)Y*vDa*!XyqK{F<mL9qr9?l*D0B^|RIIh{ zygI{*-10JEs*4naq{f4@mZePcjFjpOZf0c_26CWGvakVpF3|UHET%m<%#zn?#bcIt zFZg?Zq$%#t*S-w{zev9M_QQk>TVf)+r9B7DzB*)p<G>0nkGF3Ke}M2_)nOly@9aTM z5_KFq>ZvmvSzjuC1a-MfG`*5u5GI$0#X(Bp4Io6hy?ahViKQq~aydS?M7$~|uEupl z192%w!RJ%DdD$JLZk*sa@-bUUu>5a6$#sGW7PiK{w%%g;za8=nH^}KOd7Xi>z1`To z1(9L#$qOkPhviw6+rn?d6GN5~++hjMF7h~5R&IX2r~cRSb#I@9mD%?))F2oPJ@&yy zK%hA_7g3s<n@eSgb(gDrZh=QhQB7BF_P&y}I<5QoCNgtrKY!f9|1)Ab5#D&9v6&?% zVV<Ky$?>)peaAnDs>)XLc?XRWw5hTlLKM19SEch9O<<Gr%_gz&GrF%KeuriY9O9@o zor46?VdXG1G*tE))V+k=h*iZFl`msrPuiu%6jEdo)#MEQ<J%DK=%QPjO1DNQd&QRJ zAeEL1bpW3!fFiuC!PAx2>j6VF(u*1zgHGmL2Re49-c1>ANu}qjzkZbHY#i)5{j3c6 zer#`R5J2x(INSDJrUvj@)$Zi{gd%|yiLEiKscLSlk6csO)!B4wwR2;xcm7?p-Ou?u z9ro!KV=X=Vxn)#?6iyvlW*>?;C=MEy)oCbE87hrOXtgY9D%Cg7@MhG$t<hEW@sQY- z)nRjHHLk(2neX6j5(J9jZg7MOdd)I>B;xR9{m|~Uo>SWfjkK7TCL^SmTA`9(nV=pq zVY?<@nI7B7QN<a%nf`zBy?tglxD1v`evBC&aU6Wa-QvvW?BTe+4^9kT*^da1sr%+P zxxg5Z_KPQNT9i9ACo4xgEe)r1uUU&f(69_V{P)I=1OV4P8JRCfd^sRiN?5Z<-ezT4 zOk{tky5Mn3C^3dJu<msFB6jM4Ms2*96QkRin7i0Zf^7ALSW25_gWnHn<Zbo21}Z3p z8)S?1N$JB1SqzM<zcLM1?KKsC__*+`5=^pO=MLMIj#-7iGSz`Nmeye$S}mrVZ)4fU z_SE&8&;MF$LJN%t|5$RoQu1gfbk`v1^hE1N1&GX2bOq}N<N7hiC4S&II&oxJ8S%BJ zK5!dV{1AKh%JRm$1*{d*h4cuEaYJe5#GrwJDy0kZ-5*X}1Tu!y9yAQ%K^IfIf9=y( zHbR1~`ps)w)ikdHj7b&EHH>M$+(Un@Cd$aJShm^SBrYGG3mtFX_>&Xjr<1?<O?>|8 zZ1|_M;UC@E@DJpe6F)iBJ8@G5)31KnMUF(7PgqO)e%Oq$czC4mD(q&tc0&vqb(_u9 zS6yHCj*4A1Uwn#R10c64AjsD#TP7N5A1zg0=V<FYysx$&iL)PzgL~vm-`HGw*x`T< zh=b>n3X5ZK=I{P^wf&cVeE;4dxo}vHC@?#S?mN}alLXt=QlefLbORk@M{1Y<hKc)E zbzmW<^eLv5k>n*EIv)zH#fJyfm3Vq$Y_9W$kVqDt<_$ZdBOVeU+ftV)AvCU$TrAx< zD8gb7@wP)aTTroKeYLFiLEh_&+O#28`z8tp3SdVxbc3?HX!6*2j;{lG8D^%g{vW^= zzOTc7_sRbQ;*Nf}=fx|r8SDMnbAj73MU~st1u5^@>Q(Y^g*h^J&a=|lg>d_E*_2+& zrw8wcq1hJkB0xr}V!4O6=wtXigNx1+A%MNTDUVZg6_6L8pV@F*xkUkQ1&{LOb{E*} zg<57gD2Ohk-aLG^FGs)TuXUih!qPv}=RjN8`c$eXAI>t$*;@F%J^m}xC*p50ZkPW! z#YkVJs3+$4=1V8KH%v~A8=h|~2M`+@nyNfa2YB!OsgU+8EEzwaZkFP{#rIz3xt3`x z+gGM^)bGcGH)?6L3Q0&tpx*0~J5gMRNy>%C(BN|me)AQf!Qqcbiy-Q;D;K{EjXvu5 z$~3q7UP~@kDzXvTCtQ4Ecuwm#$Fng-mqi#cRr@;!`6?hX*}?k%j)vUWTj_4+<(-L^ z!{D+WO`6U+h-5l9JtDo?KQ%~p$2y*QeMi5l;~j^a2#XwNqC#5IYxmk3tk7$-PPT@O za<m!TOMz4!69+-$5K<=V?O-`*6>Yb4{T)6E3!9?S0|%~!yo-sGA%ojoYcfg>fs*|- z1+|~HJTggC>Z{I%k!oC6-?BCPZ;$bUUKkhO@=_7+jJ3K6v;56$A3!`p4Dmi`7Onny z(-q=6Y1rYqn*HZz7?1hmQT_Ar{vS5r3_nPV`h$RT{o6*5y2`&p$z7XsP)hB)C8dJ; zaGaZPg&Fwxgd=clSA|Cu&)J`iWiPL^^#)4Ns%RvTjb*2$50DE81n?YW=fHDFtX$~L z<Znu?tgp0I4hoNrO16U(+3Cm_aT6r6t@m2~6NXJtQHQ35W-)YpN{?6coWG>*8azKe z;rp@n5U>=@;MD8>%0#$k@+EHiq*{A*LT~BiSEhCRv4__NIn}qL<jX6&_&-poOwM+l z%4zxSQ#T_Ni+|AE0?s4I(dhSNF9VV1bzP&CYE-PJTCV=e$jZ2HtT&yyZk9zh%G<GS zr%2)1%0v1AT!Eb=Aa&h^F%$XNmo3N=eGs$>#O>aM1-I5xdo_*2qN(jQIh(&(G5{8B z@RHM_Nq3{-vExHmoIZU*{r*0K|EUz&Wvl)du)&3#AkBS`lV2*TJ49wJL-GuLAB}Cs z+&6Hpu-iDa_)9+2w#QD=DUU>qR7Bt0?!%bvlgra2k+(5~5v@h;p_%3$mf{7uqXoW$ zm7k^a)V(`Yf(OXwyQxo3bzZUM4bD|;<-w2v0at#`;XRkR=C;8+Io25LyqbP9-a>WJ zgG{NZ#9LI6DvU`WTH&}>R}6&W8<+C)W^yYj1m!V#mba5b#i)j%J)YS9<vkWC$Hu<J z7B>%@>?;3+=2*#rm*yOYc2=DI5G6Cy{KNCZyNJ?{(-=D<ve~27vk|9l%t)iO9VH~! ztb%j{xr|;$|5D&Sr^<Gfh*hgGza7#2(<i#3+8fvPP4kIX*%otaiPtk$C}?M{&M=Fa z(;o4HE#Z@pr-jNR=Mcr+8X!gd@XN_%AAuU*Yc`G#B88N}F+r$;w&g^EUyYM6vR3!? z+#1FIy8el!+`MnMHtsVWs9?nDy1*ZR)k#=7VP1PS0~h%9k>9cXlDNRdr;RUQjn%&5 z&aVk5^0f&5{95;e{H-)DkSWslJ%oZd-032W69yOeSZDntT@8f86V^`*ssaoI)=b)- zwFVQwDf5^tBk|?7_X;lD7tdWoWMT}cm|#R+khf`D&%2V!3Kx^}JLk?sr%c}N^owN& zU3BAYCEt8jsnEX|%AVBb&^}XU3+MMlG@?Q9+i^K?C@6D4@ja>mtm*Gu<bMcAVrB(> z=ZUPH7`YaSpQkI9kzw<_E4jV=5D&PU7d5}ML=_QNuoz*A^BcUK!Z{mfpj-aB<KudG z>3zXMMKcFQzF%ICmOU(X)Ez5#kWYa`Cf|qQgC%Q~E`0F!47CpsH=F+0@>b(Xx9zaH z@<^y8xkPuW!yRcs8&J?`pjj8)2ZoT@=aImW(iT@_M#q3TAY>BH%8o1CGjS0*QgEt~ zz7AQ=*WuU%0*(F4uM!pcA#ms>yAgY*oSLu)LZCDsQS@g_Vy@P|KoXTB{~aRn`**yr z(E^H&QhQ*YhAaNUW~+7CLRCp7GV^EecJ-=zRM6!kA@jHVa@l|OgOqm5CBJY~EbuiT zsngBXJs;R10z!pCh~N3-nFCWAM{ztdG0`D<u}$f$=0tO=qNsKHcG*zZWfhR7fd97X zCepYwqR`HxNm_!r+tjR!(44jv;?UImK(R>sIy(H#JZ{ilzgMMJO?@=6lfWQ^r@t+4 z3_zlV=cCPgAsz{03C=-Et*t!_?sCK6@%@{a&E20ekCn~>pRF~<$g$IEEuSnIZQS$Y zTVrM4_wjR%lwM4-UNzt6aT9W3_zv!Efm3XTvelzV`JR)e4)sLt^oyD80fK<a+M%MR z`79aMH+My;=ZwbZ>XWuzt15kb7+Ne6`~zo7y+JObfwcihOa6HtbAx2_&Y%Ig24K!k zL^xN~ep=%J+voJGk!;(VdR&G}E|_zRlVF->^tANd4V+m1i*EPEm+WRLb6yi%H5VhM z<`)rg!8aCj=}EN`Ay!90WLSPM3jUrnRcN37WgXs*mj^0JOmkzSR(&DG5C7A|E(uo# zPMe7-JT|!HWP|T^OWcIS$=cyhy9S3`g(iuG8$4Z%wfe1!!Kt40HGa({>r<aq&`uEr ze!f4(8^o+pJ*kOy6ej&L7|`<`FXOc;me}U(n*$dLdZsT-xvh0G3}Q4T{n9%SB#{Z@ zgke9G71n}X7P<3(p#b8bQtb{G0KPlj3f65iG)q>XqO=n-F`BhhR-R}NaYax~ErN{3 zU_Jo*dPG9YEq~Ki!*iGFeP4c_F!S7P5vNVUq3QOD%Y?b@X+ujD9RQCaDx#X*#XMwa zgnt3<Trt|#5Vi6iUe8ezULk8Z>!kS-W=ijQC?+Ps_F`rKK7r$xk&EY_>`LhQO4eoD z9XN`<%tHI%L5?w3Pnc5#f@FRw?T!?vw~xTyY)g>O61eyrMho6j!l;GHTCLU+p_cxZ z4Fc(CIa!X<c@$7d+5zVGm5GE+Q&;G6Kd9`aCBSYS-Y!#UM8lzw9T3n6c@@W{qxgP~ zjz~p7^_?vs!qNeHFb<J7^E`(8Ulw_vr{#FZH4SX_7x!@x%Se1(5YSqIQ23|Nt0m9c z6yM+^Cu|Vew%#-{EE$VHK(k{ycf&lAIbqR>>LRu8DkiE!xpX;MoFFT42>M}Vmb4Di zzq#Q+%~IM(zN6n3Z6BB^50pJljXM?=Vej%uMzZ)ImaCO~EM>Vmuj)XS35ZDZRiKf| z;30xB$IG%Y{DKe2qc%<Pv(6UVrqV7G9!;;Req$yNKd67@Bd5pN`APqFF*MnEVZE}= zYrPzgAXfQr*NyaAtPixj1%f#BIGRKo13Fjyf|narv*G#Wb_{y!tqfbFCZy3+-l(Tf z+=+^<Rxs4tF?me4D0vZ~2m!%-buTn6#V?n}V^nK_Jnxb4gzyCjrj97`YWkw1L1D6D z%|Un~&$)k%7Hry;-Brvy{mK-(k9MetEy-SGbb5yRSSo!AJSlK0$ZaxJ(PD5^v2HQ= zmsDlO!Jh>w8n&_-8r!@|Rp(z-o$|e$IWReQz57d43%C=|ABufI**lV4+l<6cL)Yy; zVB+S>tk79@$(W*;W13xs21&K4iqxn%WvZZvQOgz|(ujanoHH;|0S^c69k=}V_$!%R zs)OJVvY|8op71+@t><mliJ_UII-he1i%Cv=%6fhEk=Jly37I~v6V&CIDVW80G$D!# zVo;}xgHS0jSM@852t_l$P2islzHZHbT9yA$=5d)!5wR;q*=tIN4ow_aj~P)rEBC`f z!Utvb5PyW9VPy)}xwXX@CAy;MNW__=s1T99F0@IXT<z7!WE{G2+@+>?pOlHyDTSBD zLm~lR9#$L40j)cHtylllZ94wq4ya!Frw8F5!WEK6e;UtNCjD1$|L;AM|Gip<BY$^I z{v*PL|J~EQL0V<ou%v&#|DNWUHllOQp{J-T_9E6NikW?B_n7&Z_f){GB_%l{uxl3> zb8Y`7WymJh^#RwvyAI<I{|y<DTFFAT-TEKp96C`J5fAzSYH#ZL%8c4>1+ry3ETBtW z2m%(bdrA5v1KOr^6%;x_SPj5AH4=O#;m#I#R`bOHg<;*n)8MY-IyX|UNYW%cVF?~M z*ie;vxg6-dS6T=jP`dfsU)%QoO*$lFnO$?J3%;D$!hv<!ioB&2ej4jbP5;~i^5EM} zUfh^|d~Rf$>tvhdn9iK{xnjnQGJWd0zK5aWCf2L>cHeDOpQ?UkT3gi9lJRHX!4Erb zmK-m}g)Ww9-H$QZ?t2pkUmd|n=caU3k_8f1vrScKz^prSDQ<78qvO-m?9;>YS@>fc zZZB{JdRoCM%*+s0<>F8=@5~k=_(S!0cBe_@Uc#~CcVU4qaiKwQ5fjHQT;O?UmXHBO z)Qn$<M*;$qSRLr-$l~B{gn;pTKs^SX3fCw7{qMD<@cLyD@;+z#na`Aeaj%vqqvjO` z%*j~0ejP<*iKRrwyc~nmQBBEB{_}N!ZV<~1hexxL*=Nj<V09fM+s-!*>}fE65U{Kg z9P3W@JUQa#(W9^?C}DRxvNN#3$DA^R2ii6t9#89aiCnIaKD?P9`6aCRi-OX|4J-FU z1ZrAL*FUzM!EYy`KkE*|+HA6Sbe1U;n28qI5O@=oQ8fOOzA&w~@|-_M{nS!YGdc`@ zfu``6TayCj78N(@T%DEC#tc$px~rQw3dnYq1cP`4NW9LwmqAKZn#z0TGv2hQnt|D# zs57$oywT5EMfki=P;Pa*T#?)@yEK~aIdCx(XkcobEe=E4!O%x_6kKA;1%HE&`RACz zIGtaAzOG3qR>iT~VeAHL`}UA=a0zS#1~Jb--#B?9#l>K8@C5L6ztk71fR{F|r%)XG z>TCr*f4&OhqzKSq&0iVTVGw<~$z^ym029zVf40vHD*u&%u66(4<qUqerKfuEvV5Pj zQ|eQ1^6v=GUsu+w+xPQhi0<+X2KfgU*Am<OtRk}-pjFlm`cy^^xq)v{P=#sd&PJM9 zO`p?%C9M+?+J7K`mS!h%EJI3azMzYqwx6VCbkmwY9HaG@n@s~J0s?%`gbTj(vb-`} zB`2m;RIkg(MSnkAeV|-d*Hv4WX#|&I<^+Mt@3duEP;Z9h;M;6gE%x@oO6|8>V_|M; zcselZ;&0bGe`O4~{|#ysCMF<wL~G`>yR&Gg#41KmC`d%Ko=xSP5>!3;E*hD&G`5`S zh@T`0($K`Tu^;n`kdGl`ec^SE+>F`*;xA-1vFhPH52%;WRBd2r?DnzjdH<`1E)gk+ z!lzRO7XmNZZsQVcd^4|O&2djBl&eFx#!d!5hu(a#khV9?nfI`oQy>&8l<>IxhI~1` zu2)&VW768>{Nq(C-*H6ec&){Lp=3yLK>}r7);wg|HYfk%e@3_RzhRZH7wT2d2)8wN z9y!m=vpnR3X&qU~eq{;{0&fq^Xm(e?fvL5=$9j)dn}Q<dl~hzTyTg~0(haIQ$3644 z&NlNY_uZ~nhgyfJG?i`>&nqT>EO~^rpI<aB&z?NQOP8Z@?IkYQ^^U1_6W8pklXv|A zflt(x+m?HGY9k!k5)yOlG<m6U=n%$ubMma<^jv5TK@9Sb;<#`)-@YRm?nx8Bl2~=o z65}P?9C5#z8L0_;W5B$^DggK?w>J-n%K~=UD@N}63^}i^$=yBFx^X3UD3JJb-o=a~ zpfJ_`CI<ud_1LQ>2T>#4(m@D#t|Cg-D1T4eyKRPimw*@#81&5KRZmGQv7X`0pS`%F ztMQscS)+A@ks&A+q&;9h(3AARiVMY0lViO)U~c)&zoAkm@hT7~-*4(Ek;fscj2T-x z=6JHJxpAc_M$^5+56Q{Oc6A*aDY;zhtDI2UK0c&MGt?fOs3M{m;Z7w@%2@u>iSVvP z5*K%W#Un43&c&?<CE1pT;w!@Gu3p#BRD|j0*J;VGop}euZODmdm(aQ-GyOh~b<QWp z7rqcV)vtW?6L`Asc`J&0xIV1b39s=!9)dt&rtL|!cp!-=KFDw}qUHk?@N!y-L4@29 z^<PHNJA^EZQcw#29MK*y)W9!L%P{Q$I<k!S1jLD-pI<ggao^_9?%1QYq_5wKu5c*s zsG}^foATx~@TU`lHRm;N2?n5!Wzz@i$YLTx_{bP*|0$Pc-(jz_sLT8@pYt}ele!6K z$99aOLh4X>%HoT{Y}(;^8!cp-G!xo5twBaV3S{XSs|-{>unlyu_UWDPy}eH7TC9$- z_8N4BuZsoDtGJY!17?;zkXna|4twdl*KT~P1JhZ7U%oO~xqfAOCfKq&;6&!xx!b+B zqA7oi63M$5Z`mr!QF=1CDf1<RfnG9SQ<pyd<X<?=2ohB5oUqhV6wed6zg@*?8jPF) zZz{G7jP~i-U?}w`_L^7oiO6rq{>{dIcgO2Az5v6=8{F);B{=SUNUmU;d$FsEIM&Rp zF#3bh?BAU7U%m^xI9z=w95ELaPB;Mfq`Rc9hBTSHVH;aPGNKAtg}>!F{!2Z+JE|Oa z9Z|@0eVI5`_9He;M%rSOYGf&K@7^FO(sK-v?eOxtk&rhiShBIB?l3g6rkEJsF|%52 zgv>PbB%>=BaugD%WbE-0bbPH3oqreK3xX^sZNth++L1=K8Y@N9+dZGGpD+si;VbU% z3*mpj82!K8(!c)pf7Uwqe<Cx8Ii`KMB!5CJGZIv4qDwRAdz9DbHD@fBOzK=a)fJLt z@%f~TaSOckyQ6WDov=q!N8-zTA?8fj8!sMg!2Ao`MXJ}-05snvfvU^LX&j{O!p1#I z#LgMmLnx&f*9Z@)u)6S0T5TEa<B5JWK;bdkMAP1RwTM}9@u9BKEJRHx-E8V8l+ZWN z-t1`p_ExMX)hEw>@&dInp-35>@&>pWsRz8eRqrt`6^cFu$2M*2@(Tz1bd|@r<U7w@ zGq~j<#zB9V@i<*~gmpxgW*XLZ=Xr;h-@vL!^15jwJSDHxGyXl4XdRtxwhFSb$W&;o zGp5TBm{=4G?+?w4pee+%W)s(Q>sp_wCsh%gRBwS(|E5#!wI_!T&RWfn7#{Vv+j?vV zas__t;4kXQ1b^iunlB2Qarj0;?U9^FLc^~8%egSY>~gEw?XixA(;sz>XSCHhdqVBT zpv2I%;!o4-&dH||%39r)oDq77npdZ~9_?ICpHs2T(Wef_mAu_l^bZOMcBqY+bPMRb z$`Ds5TY|t8JaZ6*9ZhUAids)6e`()H)irfpP-Ct@8jT^4fxWgUyv?vq5KskR*Y9HP z9XF&rDBON+v6#8~I_~u4q;{(-Z4=*6+pXAiDrF*NF3E5aRfV}evXRb%Ft}Dj_I!<N zs<LctEDjH+M!;`%T0zxE%<WP)ofMoa+>ewFy>^El#J77v0^&-djL9DH_|(s1zAhZ; zaLuS;4vG9z*h!FApBvC;Ve%-7bUS&w(+9?Lrw;sEdC#=V;-%=9Ggf6fj}+iY5A~Wg zjx!t!U5Rs-%hSzN*;Txri@fph+`6J9=Y#n4%Q)6U+eWEwXwspZ#Tor$bh6zUOe>Z- zL>A)67UJu?lN?f79mo#6KAB;px~C#>Ei%|hu{@v_r;QJxMeL!B96RgVW`8j7PlPXz zDEA5zu8>u;ZtdU|aGoMkUL_V#Pa2R5Z&7C00We`qy*J?1F2;-D{nCZAgJ;s$lUp-d zsswJdZ~Ww;o*6o#Z(04(Yl68EJ+fEi>%C%HTl+vwssSMhm1?LtW$7j|*uoNhBq^uQ zD0^>a_%4<&8WMHF-B;N|4h(hJ3iuJxL(Fo9R5)^XB|bLvixR8)%^6;}nhD7Lgxz8c z?r}h=KjID~P$H3ek^VZSDrG{Q>pCWRd4ZSU2lMA7(kUf3omf-*<j<Z%<(B3Qcur18 z>(oqM?E>XGVbp)Pq-vvjSN3As?yVKmZ5L@B^3ZX+O*LSI$Q>2!|Fm1TFj=L2ExJEC zgiaYK&)OLClr}Une^dszo<%9Q;cr+FrjEf<EE>}dfqWnKB|dte`FQ-}mm2m2FCA;6 z;9y4BK@EYiqavJDa#G+>k5PC|ZY-&u({ieWhp+k?GYbKyZQ_%Bb&Ek8^fa*D;Fho2 z;&4SuqQMr|+2n_nWe3_5atL(QYu}{B^9py|K((1z^Tz2<D{YS|{VSd$#gBr9P($ir zJaFmBT2*wBYWN9w*d{e;vSPMSmY(4{Gb=pR9(uVYy_VZ2yHl{q@<T<YZa43{KL5q| znx2jRv>$!z=AB(2a#5LRGjy@OMJB3h9+~AiieY0HXTal=mh)$J#F9T5Ou^)~?E_U? zR!~_HgAPV9?0yO1T>}eQ)~P6jY3|wJR8+pJbrMMwDs7|^c0mKq%4!?Q0aB1sTq#xd z=_0L7KBC;RdeDI<BF9ah6MdfxhKgi0aumHU0axS(jEO4SIbGqq-p%j)yZ>5*xaQ@v zmv82UE#<gdWyO6+j89B;hZtFP>&f~$iSlRG!QWWede<;?xd5heaw>!Lyj;LX#*}qo zJVG~GZ$G+3S>{s;-($594&U@Vw7vB!rwGT34Y|h7SDHG?<Z2eGI|M4QDL-7uhzRy~ zak2EGZh=<>ZxHJ;7)xJ`iFI6vz(UYq_|T`pLe_u;cZl3FoJCLWJ!8R$<~y@L)V>z! z)7BOc_yC05=&v?d$OdrqyJW{^=7zi@oPCkJD?9WSm}-_HQ)Wi9uQWNadG5JuR(><K zQRfiVA2nDyq<j#bq|qx56CHxbS<4ee85KV(9&(ve<V8+bm2%GVTI9`y*Ut-{XS+`6 z3cGSx!}^8zT?EK*q~-94q@6>;64Lt<B6H974^`D|Hd&Rf?FfjyTFF8K7acr-mE3*Y z1i2x;u(lnY*EU)Gi#^a;_IULd`}_SSTn(oBHjp>lJ1%zo4(O1w6;EMS{1qQEoj8r| z(02Aqi!Z4#t*SVOnm+4J9TEufHZiqWcf7r%3w2%`G}x+6X;LLzAtk1(1zsM#et1(M z631m8`)bR6;=z8+t4{xg2aP@3H{v5Tc8XvS^{9#yS@Ds~^4qqx0d$)zifhSrBs^}g zw3pp#NVSEoxOygc?mFB5!`^#FHMO;C!?@k*R#Z09q$>zWm)>Ek6zM_;Js=<*LJhsB zD7`41(6&KZAVC5lkWi#c7eYb_MM~(sci;Hz_k81==lnSDdB5-Z#yMv^>&F^dS!2yP z*Ia9^`=0Z@?(2eC#pd8yq~hap{8bkHmS2wFSXvkX@@_D^3R$i`ka=ZUWx@cIc4M6% zYe5*Rk^Cx6K2`WT>e1bLn+RYwh8&b8ff}8*3bRK<`VpDkdEwT3&(+Vb$yfQ}L17lY z6N_<^`(28KEH5WYhJyu^-+P|Lb~R9<llPO&_~bftKg{8HANMRD-!N~~o8|CQ$WaXH zHp5}|-5o^|TV})TqYI2DAQJ2qyqm#}0rMiH<#j?XsPXip;+?(s)saL>x)k8r^YvhU zJSp>cL+Lr6Z>$E_b$kr;UP_PD*$ScDDy0pBCfA}Iqf>+u(<Km?V!J?%j8c0+rE_+W z<W6niUsgBx>!LbWR<1>^u&bbqXGHbyz64)Ow0A6+RSsMjcW>rOIV>9ari(aFP&3*n zBu=`!x)Vog^0twN7hkA$Z?A@*epj{+r>!<Q9owT_%h;1p&Sz5ju8=@s1+uZuZTK)f zsv7#O>THt88p&2aYRNhE8Fy&*hfSTdKFuwKq>};#N9ltrZC1~SMDet(?c+7S$9xCq z!VqkuQdd!7@W`h^{>h3uWrZW?_eD-cs;2ho8<lt0L}Hu52pfRwKsdO)N6M8%3L>oV zCV-K-&!7b_O?1|izSdLEguVZ+oLiv3)Z+)9ErG$M!0iAXyrsQ~0gx`wqF52;-?rhu z%CQHN7JP{>GHJUh;B0P*1~ze!s%l&ON!EL@ys7Eb8J1~XKdA7l7Mq(ts0`CNaMc-0 z2A&S<0D11nfK_^XX0>&8m$Ob~A9X>Ryiml43=f&ZH5F9cGd%5J5Jx*CG?ELh$jVC? zi1gW%wI0axTh|K#AM19aRuW|r+p8LxELQ#Q$kcc2=iPm`Z%sht3yr<Q(-~?HA<5)) zH3n;W9BP<UrB)z4-4O74mh-h$$A&2X_oCNGky$>4lc&!>McMvh{<C?|^{+&DwzRMT zOS(|Ik6N~Y1khj9B<Os4W<p`6BWsREzdyB89nlDDk9BY<A~3JPaz99o7_B4gqM<9f zA9QKe=y#?0<a-YmS|W!+EQocE_b|NA7Zx7L_FuWepKJ~zT1<N`M7Mq_%UI)nUuf*R zKuWeHG+^LWscU*C_+38Ea2P}TA=94qH$~(2JX+79Xs9DCLaaatI3VMkS;j0@RoF_< zEgeAF!X2Xa!Y+GVFRtDjOq`J%DcF0tKEIO~gH$w&i4&WyqcaN51Kg?Ue5S8H;=Ou{ zR8rSDtm0%o?dsB-sGvfaa32vD8>$RQ)MV9?eG94baqz2+@SMG)UD;V$Ilv4@vi=F* z*${%SZR|C446xU$%w^~Siv#>WdDv}d0d;H31cXdsrSa=C<p%VmDpj&x4MGgqMd3>x zv4RY&iQL$dc<lM~%3a~>QLuJIim`<&vgD*Jtsi2d;3%{x;M1KMJ;o%jl7w^mIZgSG zw0ONZC?5un<0RIxUt7(>X<D|<iX#&2wv?@#W=j_orao;4pQrl;G)!&wA0kIB+q{WF z7Cj>B6N61*{vsxM>$z5D?vwc*524wXxjku)c?||85rsuLO-psB7uKUMe10~8>TZ0* zxlQ)PZ^;zggH)Wa{~$Hzbji`T)|j>6JRa*`|1>W?RA_5@1Gs<yK5yYpc{;+w^53xZ zG3_ajM33@Wx>1U_6c>6?K>`1@jsKvM0SL3ZEXL05`yLtkSe5^+ihsNNPtTG6?dAW7 zqf17j>H|wzs~@%(Eht<;T)OEhi1BUZXZm*Viq>WGJz~kftMxKnj1SwKa6rS7RqDmF z_$mcM>}jedO14Ps3MA1vNRwo{?|%a^T!?O*zP&0qwP{>K%3zL$?bj<|Z6OFVD4+5~ z9|^s-X>aM#0}d@O3K+!z87N4qZtQN-)k6C9!{z+oKC!=I7o0za|DUP*KVw+`jA8u; zl%7;HF>)AuMb!CI$PcPsiWEGH59h$c_Nr<xMKU7o_1MXI&!^$@;E2WTRP`_xlI66^ zN@blIEMFiw%&Q<<xG>UHHf}TsjnD&a3?JFF;CwCP;qUD7JrBzdA2SX3aQx;d!LA-~ znVzgExADkP_ocm`!}ZJl_5+)pUID@BSxMe~tVnE^kN}xgXs&)mgB{L4skK(;#-U(; zG{3pqvAn-|3~;fkteMvJ$R3&Zqo|#O!hVPF=teTc&95w7XdW7Qh;{Te?!T3GTF`|7 zv1&>XsnEWU(!soku!dpXcZN_+EK~W8RBmo=<?JJw&*zdI=*EEKz%0ZxY~kyeiA41S zw}JojNqpb#Qq0ly(i)D1mVE+7`hB38=4q)rtDTorWiK?Ae{3cY*?nZNY;93$MR3*L zsA;G%3k{vyb>vX)M)KFjv`(~aMKBLeh{Q@1sL$|bXJ%!^FK6TP`QBmV+E%UL(3Jvt zgauBlOl44(sXgjOfV+2gEwyE0>_AZ)D5hwt?<61Sha?)Qw&``li-R}7sY(Ke;pP+B zHrjpQUO>`>CtglfM5g-QcS6zQ+Lu$kuuo-o1A0aFnFp^9d2MeP)Ob4^aewfeqG;bX zpCshMk_u^FGF3?=gvkrk!M6R2)jS0jyz~-VOn}m51&VX9%{`151R{qwGO&}k#XdS% z$;vwa@I~aItmv1cVmg<^SUf#Bk84epK$md<m&UuutjALbyrC-zAC_#IMY1d<mpk8( zBDaGL)$F_nn7Q!6<7PCklik-Y<~PvV={>uhx(4q-@I>Kl_e6WUhko70XmB5kakUEb zblX%LFn4UMZ#*gRJS@)FBEB?gn)j-zw!#-r_rhrX)%A?XSrYZ-?on%|l$pTlUyT8= z^I~u-DCTo^=fZenY^pQRu;vHVt(O%w8Ds8~xz&Zv3s86wq%<qGAZyl^S3I}7+}mPs za(u#Z3}uN~a{U^T5_9@m5F9GeNm*YA+ca2ozK5!)=$t8XER`R-TdZx2*19I(Dsj!{ z9sf*if|>%q!_d_GBC=w-bS6A8Y$9m4!w_1oh?hU$<6j6Vz$iVu{oJcHiFG%z{@YBA zSEoqf=)u+U+r_zwk!p>wuZxZuNX0~gKV3>w$O=!<BLZ-NyTP~ykn}RqG(Z#U^k%rG zx7vwhA_DO4^D<^ts=uH~K|h+2rQ~uuBgN}ds+5zM^lSU+wp8wp%Be=MVcws$sMEY> z#VDxT7wO^NqMq&ZNL}2_Gwkabc4V2^0=UZh&5qn&x4xH_0+b>=*>iOZdU7_^B-zp9 z>lS_FID$@*rfASH4*(VHr;-^dvY5&S<V9K8%4T+lIXCYDuUTl>-HkfETd4(QQ{?0F z6jveakq-5Z_{u4RtX{*|F(B;=LXfo9CUbk&efJeoIw2dgLO|0=Yz0^fBD1}60jUC{ z_xoHciz6&S)+T$f;jwGfM;^f=o^s)mH7yx`EYNM&Xj*lhd&R@0u1jZ5wEV^giEXuk z<mNgx2-gKhJ}Wb~sESvnyTUSBI?^!FS<#y6pQ77?sWDG5mpc#BFgx)GQmKFRT`}Ho zqK8F^Y%S~&Z289SgF-1(LIfs`9x224ungP^o3)al4)(zwQKEKM0PbxM!$uU$B|y3> zx^t>&NJHBds%&kU<vt3V8Y5XN<~|GMoVx2XtF8gIb?4Xyq}M1FJ*N4ZE6{h>(eT)u zdXS`<kQMpai<TLxgq~EiC}gc*`fyakXKe<QJY&ra30-A>ut%&bp5OmkXB(GoXCJaP z-=Q=dSC;=YYbn8+;177o_HCvi$^4I5wxQt_kW%I!>eD=SybN7Cr4P7SUZzn0Sy;n! z3u=4=GQN+U=jDK<@k4x~TI}pBsO2+oS^Gy4iM#ZcI7j<YVnO~0*<3q1<oj%=0y;ai zvOTmj*4@$$J0{m*0Ismlm@(9IYh1lAF(IJW5va~AX3i4|P&+kxNEQrnI23qC6!b%_ zXV(Z2aCCHANA!ar8E$z;*-%ScitBgz&D8r%%G>7VslqoZTOYxu{r*fz-RC`vwt~5R z(IcF1W$hkW`s&Rh!|k32FUA*se;!@yG`o09`02gac%a(QllC&mxboRp6Ma7kvX*(o zH-gT-$~D!%+zDj0>2TLr{=+-s!&$($5XemUt*S)zeUY!8l7ITOt;LIrNHNMO{L&ys zt|@z#V{^)6*eC8+dS8rtRjtx3nAQ6SRf_?>nihc>vr0gN$tI#E^fOgs1K*Doe1ybe z;BZ?gw?dXOa!$VhhprQ=vJ3PW5qy8lCnWPr&G-px;^>9mc~L?09ni~sv!veMFGJT+ zgSy6r0_C>_h%C29u8*{NJ&4U1S~HP+C%ruX*{EI8=U{Op&nN$Ku52J2vf1y`i&nn= z>ian6_g5q1_*?Dhjcc)wP@;ERwlaS!w_xZj05qt%*<4R*k+Nf89EvT2T(Iz)xqCFO z;uKuXM@)b~pgcjR571x4#U-B5<vc^)l2Hh<_r#YhQ2ViVvuiRWYfHSW($RLdo4P84 z`AnUPB@0{pKEQ%De|)vH7T1oITTil?DAfYCN|kCoAF!hfrZM&_c9d}mU65ZN^cIIR za8Cv58&FdIaY6*0M;mIkITPP+Pjr*T+&wxcn}rUz9qbrefc#m{bd=>3$mGx3b9N8# zPsZZC506@gXxxp}FI}Uq)YL`LMh$sMNcJ(!O80`#E-t1{%!?LS?D&ZorNXoz_kG;= zX~1s_kK{XLaAuo03+s?YHa}eS(yjN&>%VWmw6uveUpaD5yE;`W7@l+oRq?xrJ$*=D z8W`q)qkYp9nX?kVzT2_c3!7XK0aJ|f=U?Lo9&KPK6v>wtOtx9o!W;4*b99A2l~~^P zxwu?Az1zWXOd4Z9f2%P`t<pCc;v2jb#_YoW8tZlQy1Ci}Z0xoXHU{Gu_xL~|*<fhD zFk#T&+t)yv!AyI-PzX!O)fFvt)7stH<Y??k<UfkV_-HIE>eu8*73F29&j=Ki4fl3< z4Vp-kS^za!c>o2xt^o+gbpKrRwIa~7IFbMezvc0<TCsmZZ8Q^Rhv~u-K)L7onmP7B z-yW3W%{{-m$zhfyrHtO|{E3WSiRvX^Q7x8g)(-pqT;SqRn)?yjrnz3cn{LJS55$8^ z;h{C<Q}<hBhUSJGIrDn0B#$;5d@g<323=}qF8ee%ss%5gNd+&(?vlkI8(Cz&<XEh$ z9|D{-W_fisDMIlkEc+-pq%o}rOtHfg1C-Vbk0-iYWecYPjrUh%HGevHis-*Ncd;iv zoL`oXt5m&v$%M4LvC~UEM)>pK9LF7B^DqZe&Y1VI7+Tdf6AsVQEpQb<M9o`_#*N0J zk^P|?!vXitt^TsZBnPIyv9$d&l>E<7^8Z07`G2&^`@fs(|1*^Q|59Xv(xb8|!)1SB zemhA7aesbr&tz_z&!uq4K=A{<ve$OU?D}wWO+1I&nT_DwOihGe|MMp&$QgAXBJWfi zv>UC58CrdGv^pA=0mt;I@X0h!+5Ggp{DA|vr8{=>%Zne6G2WFiXn@EKbG~uQL&tR< zdm$$qvd8WkiI)`(Mua4ZWLH*U#A}K}Rle14BoKqPtuIABtMYYz(pCAk(|0s*e)CWQ zH_|+BGtyvZ-w#a;w@$ORstQ@2QxOUJ*z8@QzKEG04|7dqIgv+!zc1J<eB62XH3X4b zBPf&fOhQXD{>*NFO--BMC7OR4Z3Hx+UNhb#G`1?Uds@dP%I}5W41mNeDP4+au{+j= zrcGo)w=$eCYV;OG6p?Q-gc5?JZS?C^_u=fRo&E;Ze#dsZ2`0(YXu<Bco?z}1YxfYR zLy(ZtQB@P8lfd}8_50~vj#Rw9LPOB=CWe?36VYLjmFK1}bJE6$^&Own6NY?j?_6*0 z871KB^Slsg2$6)&5AS_rbEhBSj5gru7jF*!xQNEwthMgh3XY8x*$R&Ux&magppKf; z#d!inE(KTU*vq6$f@C_lB%mOgS7Dv&v@o>T*+Zz;iMn{6zQ<Do#W5W<lOnm*Sf@n{ z$x5Nfqkz<Wk*n3>=0C`^W0BJ9QS%tITVu;C>>wj$QRbZ_rPtUHXsQ$*iV4|I8a6i! zBUKotCd0G>q)&Q><gM91ZBDe!B29h*r$7*((a)V60SM`bP*RpDx86UNvj`qpI#a&W z!4m5}Uc~h`tP~d)_e)h(x9I3GTGpJ*g*D%d$H*%A)snC~%@ZD%PTuLtj^v;^ZJ<i~ zSE*6<IVAqH`P4*P0^arI(n+^tr4q>~{JyuGq>t<K$9ntTW_gLt{T#?94|k=b{jqtk ziUlUvJcPkxfA`o#DIqyAE73;m_IYZ#P8l!C!21L8eJDE*+wrfHVqwj@KnAz%l#cFk z7)4d1t0Z?AJ5Ee1bS>@?PHC_^cy)Of>r03;5zUta_oYa$$_H!@bzxixWxg9`tr;SW z*tYlJH^#;kCHiWL?z}m%x{#`X*hm;X{8UFs^4(xB9|HRqF<tXo?h}Q>W*vC9i*P1F zUmu>AIY*Cu^*7kj&9gUjMx^1q`;06x(TSa-byZljtKSN|Si{CPHkh}eYHELytVTO1 z<3LeosH_&}$eOg2zt`WhZk3!Jes95q*8PLOOvYB6J5SitOmz(;dSe=qU|Z?Z+G$^P z!#pEU(^9<lKx;ktgVs?Ny^t|_?rx5Vw3L?tJ!qrAzamO@vwp{)@>Ukh%jKFb<Cd>% z;qy>BXb!isDW09KYc+E_XQ7jZzo{EL@;^z_QWrE|7=X5FkdYS3dVBmV`_;-%fo_ed ziP)YHt)A#FR+V@>eta=0V}#ejf2rc-S_KqDzVG<7>OAVTOT2uz&Dt5BaU_#NpxI0( zL%h$iKrF}hsvO4v?R@ooPmxzI>kzt--#gYqYtq~>7meVzmc#>n%5-!HqI6=kIU7Lh z<goV_Gh~kb^jW?q7xFJBib;oub4AD8$#Wv+D>|33n?msi2G^+-KS@Hqm6R6}3qCl| z-20yFmzzsWju!L?cJ|O1bjdSeH3DeJfI|Zd<hFRrXr=TDqx%E#BKJ>ZmKTEMI6(XF zr&4nE=GU-YT?piS(E`U(x%w&-u;({^>imxk{P}86N(u#t_i@i|>gHyY^ncK2wXn_b z!hI4iPHq8|dgNn{>vyLgwl2ya7MoXy4;~#TB+WiDxZB8og(luk_RQy5G@Cz1ygl`m z>vx)2S;gX_qZ1xihq(FhE{{W>aplJF+5dc*v<xF_92|UdQDuH#Cwe)kZYn=boICcV zZxl^yemZ~D|CnuqE13PO9kcFZ-L@w6g8>+M_Q87}P9C;>Yz8l!nlDJp4C0O*A3}dz z;I;KhNcI?0Nb@8w7KG(7SEZAu)z6pZzBKB!34MafZ%Bh}(qns&4Zb-|Z<6ZX+(BjD zG#ZK_B4KQj`E65Xwr;ERedv)=a5wRNf1WmzUPEKp^y035sBl0?u~qL1Vc}`O*fPxq zhltx!9v9@>T#;^jLX)GnJYBLZQJhTtG(h@u=V-v5&hxW?PN&5UR2Ru*jFDr<`?`sX z^^`N?8x#LP%fUTRaauEw!Jv<nWaZo)!Xq0~1QG23^rO`;eclqTi2B1#$p&gmqPg6i z$-|%EU~07Ipc}8RAxxU7kI9Mj-H|&Dq6}TIu6C(*sksTN8o^%%hnD1;!)!|cbac!e z^KDx@-xm!zpYcV8P=5$7eN=q=*uIAcMEr#_2?{zf%upq36C}Am9;kb8^n+#Y_|2>k z3r&d$WYi6QNOd_x7#nN2ru@tPMIJJFMDZ-I?vZ7a8Y{PZ$Tu>F0{&@PlEv~-ZZV+( z{L)f#md6^E(<ZB3YKT<I(E6+yF4?Y=!jR(isPhi=327OUJXVal`2l_*pxLfb5EMFI zO!ux?9m&XrYZ#^oG}^Nti0G{^_pgyPBuv-XK}kW9p{9E^GX!DY?^qk3IF5*+Q)3Zx zTMr&rII1@+o~14`IVTfx{{eYHkQXLrp&`m())O7W_Bzg0p=79Lr>JyD)(nR1Dsb~Z z_YdUYm1kMgfxv4-ZxHY%eHO~LWL$?nD{MKtql|Z^tO!YmcG$3xRbL$fVVAA7%Nxgu zBm_m*mzXA5X8k7>XRMZ%Jd4~}TkC;=ftXINrk0kb{Ns3EHy?U>-{aH6{#4B>X&n-e zcPzY+SOoPWu9j&TqG8-hAL;>@-+o9|3X<<x)B8AvV?rrjU0#;OTW`y7WVqjdc^iWI zm`k*#>k?=tIXGE!o9rWlMcs)-#|g$Ab|BN4hBSl>Q}LgkUQxvr6C{%$CBHy}!QEiI zcTlW<(D7L!cAsl6JODIstU>Z%bNN9PJAu+YVg6NvYp;sl&PvPvrsae6xBXvRpz@J% zefc%MY49OkTy#!s9B-O4-%Oz@IE5yu!B&c|2u*QSke~&N^oMmA2xX0^QDNA>Y~bnG zXs8{*4nU#9jr`i=dL?#O1u*UR6xyshv2)N1{<`D*>umPC_u<FM!b-Wq`wkOjQ*iOk zJE*Dsf3-w3x%$0dq1V8BJvYNnp0ZE|bio$;NF<&mt}J(nm^z=W)aj*+VmEb!W9R)J z_qVA89q|3J9Pi>l>vTQyfbQmkt@ty(auZEe1d5Pt4Z%!g*k*(c9^Cdy`*Oi2`>oxx zDe4Fr@r~$vReZ`z%|x)y4|n8Du~+n}eg1;6j>ggeS~?&Epetb%&OTQhfwg!y!GeKR zGayZvtmFw64*apsu_9^|dPp*@u3SfG<FIOPo6hN5kSsQ8-!cW<#Q9mO+Ju!pFxa_K z+x^#1FDi?5Eo$L+ZhhV-NgG?s=4i!~+Oya#3q|-#8}JPYtu<!k51qePf!%NIXII;x z@p5JgkZE?QDo%yf9`v8HVuSZ|@DW9RdPOXyIGwgm)e)UO5!@H$d%hg+pkim-P|3)Y z_+n$bMHjvX)peZMfVY(6#Byd|U}ILp<yslM&BOR{CRSYNjsc=XKKN@chJo!Qh{HVL zj8EI8Tpzv12!9EKBP<wPgX_jWHGHj0^Gy?~nYJ*U<caOHgp*f_97?ltt0ati7bT4P z$0-aEy_>legN&ZUasd4xElND`z;bXr3jCG+e@`p~?9To34}YT&7+%F6mTeAQtez68 z68=Rw@Yn0INyfeQG$EY{Yj14Io1$g{!T`-3l}DVS)7wV7?3;!G4HrEMidLKci@_sq zBDQj_jKbs$Zm`pIlR}2zfM0)wP|d~wCRJA#sYmXv8n7xUYaYVuS?^g=aO0wDkK|tc zY{yOY#}}XbDAX>R;p@<LtisZ}q|M<FC!4kdrGYyYZ=MSSPIG6ioB4lG$(N1>fX<WW zRGRdgZ#l%BaJsg+(IKUO7Si7MgUY0Z!a408o?V)ri1umsI>CnU%T*ZvJo|T>z`Lcf zb2=q&WyRHyrg=?N=RVGguj~361b7rGXa)V78r|Pr@((}!r$)Vq)eowSBQ}md{^5Q7 ze^9}HuZi}5wcN#@9UOMuw4`pd?xAKak?!}Zn;dG|ZCX_x_n8El?oFyE&ArT2&~-@4 zRCYoy3&qx0K})A8!Vu2pLnT=;{W7t9>&jVd40g*;osg2%bI9LGNz8}rWdA9^r)<)L zY4c}p4tK-IVUsNZD4L-cop<*enK?F&9z4tufb)3!qw7%ck6{}*x<9B~UFr~upMdG1 z^)*2Yk?sbAVtODEGcwsKpQF?3O#KEoQ~SM-+wqQ^iO#f_6XyowKfd_LWy)>mAm&9& zTOys5koa;^0igLSpz^_5O*-i(UGY$FZ@*8C33!Y(E8@#hQ;7<-)aG+5F0h`!nmN~C zURx(U?oQXnlQQg=14W*_^e+<WMtY^SjcdU?Zf_Ew>+PNGQs+oEZeDLmMY<`il!M}` z59+r`QPinw-Mm@rwP{Ney8xT|FEs;NV2V;5b$Wwx(Sy$=(WRaKvdP`PZjwzUcC-op zq2L-2vLp@o+b1@@Nib6O;?BW^aHDu?)w8i;b1`EqVSti$Cii(}HK&LW3R3yyTM_!% z6^GCVR{oAbojR_0IUyDXXVYRqZ?zv0J-1BpZOL6?eG19CV=)6tg_CHkRA{L<dbE`% z9rlc<G9n@j;<-CCXID@T0QyAZi0<o$Kd7WB@Dw*SANn2NeTe)jUi;0csGb$e%57mA zi2Z%;nARaz2XgNawtMYX-G`!x_1BqGFa$}_Af+oP(6oom0tkIl?LhIRRQU}pbx$gp ziq;Me{R^slz|k0008PEl%|x~R`%C#0jc~C6hl37kzosdoxLQ38H^fE9>m1sD@Eh=M z&6q9${7Jnn!coi2o~7qc?9zP?uk1*FlP0aLqn=Us)P7$dz0KZs?>;7(ean?~w|*l? z<(|(y+K749c$t#ot1mfZM^5y?<YUQduyv&U?H5J4FKUU8l@WMW8n(w(ra|S^4^Tea z0x0KsTVAtCEn?3yI%0?}w|;$UT5PrI`({fZ@_-Y*T;d{f-6^4TS;Wy$VW7nExtm!> z`3N)J$Tmo^c3-~ceyXkT@4>bYwRC1ue)AWzlz-BWc-*Kx*}XufZ9Ev!mM~+n@KD&t z7nBaSl5(9Bk)a_Z?)o`!R$D*1yGFx>DR9n%v39@hmOWi@0KW85pGpOnu-@vu?YlS@ zguqD~z$0WzU$Vhck6g$7DY+)DOS8`JIBZ=}4ZK$D040+$;3IVsQo==0r})zNk4-w@ zKPUtA(w}ua?MNj`kjqTlc}m+wN5a#!E7%Boq=*&i)K*h&U|=1SiPybvyjz?8jKBki z-7!csSAN=Heaj-)m6SY5N_QE-NHE9}bfr3g>Ykru6nxc(_ndZ1))(;uCDKCE#%>`o zDaTfMmhW;cM7zZo;u;zl$oD^g^;O6+X6Lk(xi`nNF`MG$G-l^&pC^QN$NAV|eG}v} z<9rabgwBd=H~$ZoMV@#B7?CobK1mEIS+!ec{vv#>v-7TpUgOQqdXI`jhsic^XJ?@% ziEh@%Pq6(ImgrEyj|Uv;5$RR*W_O>Ze&;fLx%suHw;o%KI1@le4DROkZdgszu2#)# zK20?VrXAj^7ShHC!@{oxIckV!4<8AWE(cq6IqXg(jBAR0m3Hl!{-|otYCB?p^<vq$ zMHUQAbN&4dHS*nX<y@3MpvhG1ZqI0Lnx2u5`er|D5-Pm0Qa9=Qz&?b17(*Em21u6m z3t@*edrt23r$kpX`++;ylhyOOL|)u_c;+ZfccNZ5MK0*rOo5f8mfM00Ad*VeR?Qt- zt;=YFL^@r=!xY^7AI7EXiqD%AK>F7<9i0;r@JXq$DsLA=^#dJG`faIs0+Q=^HHy9J zaNDv>Xk1N(rYO9~0CP78B?)BFILT`7ffuYy06)0_biJa{M6f$$@G4WNq!>Bspn>vO ztg(Ys_a6fL%iKNyo2oBp87(kx$%21+!(#_-&(eSr8Go7N_G-7@rjnO~$^Q24HTRJt zX_^6rIs8-LblDd0AqPX_jkGbRRmoL7flYJF)`dsZgVET<hiDBGlP~KP`iYFLQ~8#v z_z>WTks3+KKatPRB4zyDb4Z?BAZ}GSe^Jz_(8$Yv?6wve!g{Z8C6JL3<7_`g=ezuD zn+e|J2PTkqHC&hxgN#eDcGahUv@EpF%WkM-Jl38)wxn0qkDsUQpXIBZh!jg5rk~K> z^Kd&6vEtIaCbnZRU{UJr@+ZpwQ(=bj&pDqthphvj>=^HPN}XDQ8J_!1MZ-h))sBo1 zNDJHc+@-mC<J0!)l(?5UuFuZnDNuF1{)8-m5p+_{X~%)-oo65WwSoSfrkcB6M@^09 z1EEP^Ow+o%j8t(d6g7ZJpSJwg4wvV3?kVh1tdAR2Q&VeJ>u7nR{yFMh)Qf%rE-wD; zfTP-y+Joh48&;NPm{YZFbDXN1CcPo5ZRjsHe8bcs9g2Nv@Hu=%8KOV8UyA+%p~8&) z)Q;ypJx9u&3oLB`d7?23XKt>XdAsZb*HuI(_ov@YtT$m=HvJoeap0B(&JUHg3xPW| z3-zeUw4PM^=@p3qhcnbzPM_|SA-UVT$FQWhbqH@9zUS7k$@fnm{jZ1c*Zx26qhCI> zL-l=fmF}Zvsx-YG%w=VXC>@6)jU%ISYYqsNK#_(Ul2EO2;)<DnjQifkp|dt}H>P#O zA=^YClYsNE5?@y}0kH-j4=PXy6+C3$m8FhI;h7iJ%=Dv-p*6t-ji$v9$yGmFckO?+ z;QGIQ41fFm-^)S&FPKzGMa9|QZfHn$(^cJUxbiUhU@R148H?8BS%TJ(%n4Egu|#Wa z*D<U0gOLM4tznfvsRV2=O`(hJNzsW<cep<k4JCa923)*F`&kAwrd9P(Rt*@aSAS4_ z^s~MyC)F8NAEFnry@QZSu^m6n2zVQ6g|f?ET{g$lzWRzPzFBS{Im>6mX+oXmTZk!n zxA7-Yy?csC7ACzA0fbGOvf_#)iW`)1A*G^tNg&hGH0yatkH+>~sH>HM)4JJLcNN(@ zHH6;<6LpTQq2CaR%~06}0WV{IIG!=>>$^v{BG92$xDP9z#+Y5<SEEoJ6D=`7_`+nU zk)Bp5T%brGVW=BC*@ZmXF7eabC7DsXS(vYch=(imE`p4wI-Z-Z1r6O^b9(22I^3yn zO8EWdpa@|~0r=of4cQ1aegum}n$R26l;*@1@yEdZpOk{GOKvo;DD~;7LCEuK)RDS7 zmKhI+&v=^2!B$l*o=a~TTkUrqN^Mp$uJFCHH3r4Nw$bU_JmQ;NzHrUj4G^eE9_xAF z{AGNhzjW~jl}7jn;pptNzLN%WbAr}qDh9W``o<d}K6B0`VQT9Ijxe0yCf~ev+^W@y zLU)onPTyU2J-9nBo5Teu{y`;XQ)y|z|1R`ZxBeW~k*k}&vovV4j6Ej&TehBd_r$WK zacJDoQ5h?5Ma-{c{~Hz7($xvRi>|b6h2^KgKd4li$bzi^C8@^rCJEJLtNM_+<+93q z0qBvq#6Vwd4eBzcw?2aAb8eqtK6e*{?MAQ;x=3#A&+J8n>_Fr0XZ7tsX9)(|(myX4 zk8hMc%?)6cg$7#QGMF7edTkzC+MfF@8lMHP+Aksha8}lHby8~TT>lv9KI#0y0>ZU( z#^GE(4C*)3WdNx)Zi(zZ-~Dh<i%Kk*;*B6?Oiq{yiX0|@{8ll>g<mtv8j;XaxI~dp z<ab%cS5%jZ4=e6T=HK0~UYMT0{jF7svAWZ}COIq2OOnVaG9plfLfDQT9R`-hbWvMO zt5>e!L94j+4X(7q;7)nr5pRUHmxM{+EWETx0`C2e7yI_a=+wlkDQ^h$(36?Xn*+no zD%y?6N<x?aph^ewI0yGZUh9t5GqNP3)mO8h&HL4dVS(7;S!i8hti^eLEcpIW$6S)G z`n&Ja@l8ohI-P>v@;cHSyaJhJbTJjigc7I|+^GmoA)wV6bjeO5tL|;kZ_P!V-D%!) zfVK_V#>5bc{3hzeQtiPLjzBY=4j<YyxkXF7o(}^I1MGJUte={mxAITk3~fqR##-=o z?~Zl36`C<CtZAx9@Z49%m0BkF8fwLu1^3jm8Wh%yzsv1$)%Tfr5*F3TWC<E{)Z5Pg z>Y4H`RaM6n>Nt*La2wN&U5>3xQ(aYW6v(UsN~!MgFyI-QI6W7W@_u(duDH_N5Xuf) zbg0)Kkm{J+Z|gOW8AA=PwslhIHEjYY;^s2ni@#n-X9v$)6)IhEw(36pdTfpL%ypeM z*C7f}UDD6P1^K_&n^`Dk58By|z0yiNB5KF2gt@=i29;+mjQV1Ko2g``pFJ?8WS;eT z39h#h0~UG)6SABWv6?(={u@Q4%OKe}sTbf~N1fg9k4@dlXS&$gbLA5vR@>XP@#zY? zd;Px16B0iWXLs{e|5g_fjj3E?RO5(`&}RRrz1i@#OhDL(quQj>4?JXW#T{+5Sp&r` z!6$vxf(2r_fD#O<K-R*zc}juxph1%Ud(s;(MSt^^n<B2VJuf#3F}39(3KnTv;=*VT z)H3t(2thO6M_X{VK5T}buF%ME+@uc&0U?D42|DvYBY+M;;iJjzS1e5SyZI@WQLCLj zcU3M6Ow>sODr#e*p8;2ivR4~p5njw^aSWaZZFobj8?*_JYKti;8*x)aFZ=Ss4TRx( zo-$cl82=iL<(9|ou42BXw@ZKkVGX;ukzUNlQe%pP$P#rp6;gZ@JvYrIJMS)d!l0kD ztgUZ95V!O%B-1}l=6?vNY745ddl<Z+=<$;7mi?Iub?Z*vZK<R$$6=JvLviM2P)hse zf!WyXVQ`be6wbznw#T&6L#U3`NB#VGqRuL~1`=qG@e8eoxww1#ivaV2_SLLzr$Z_8 zOW5M(ak$OvzX>!@*^1NbM|vD_Y5$;dBMJ{rs|tmO70f-o%~!b*kQQ?1wM+iQ=ADb{ z`o{#l)|Sn+4CeEbu-{xIt-qaGalgp*`b@c#tHOsTjZ8nN=v>bxb*dp{d4fp<{ETK_ z(9e^9xBXuv)cjou|A50Q&l^}(V2((Q&Rma-vlwa93yf>q@qML4coR*bEB;>=;Qv+4 zH}!aWed5uxhaZCg$6VsQ>sqTD2E1QqGus%5a)rx$?s0?(0gPcf@iauCydt>4oCLOX z;EE$|9W2KX(GE^Ir#>>^k*bC?uO{KT160<W?W7UVyR=7OwO^4X6@Zy83f+`!d-uoB zD#QPW>stS-ZvE@$e=lG1zusamhldhaK4$lFaXtw7WbL-#hGN7obqB1SYN%fJzP(%` z>!m7?M1)C~<K16#jbCM97l@W`^bxwu#+m}fDSqRpWr3p<$}rP-2Fc0zgZ`-r_dF6P zi0rr7i&vb!+>ra|oL`y8`*3ujoD6?n|8)NH52|0}_+v_4n*c-~!SH?y->d#2O-U8( zjg8}zZei+$h!g~oE482<S%{9JD-ao9M))3_ZEyOWZ*nV@>oTlW*jw2bverHx|4rTn zD`H-!CUYwXW7z)Q^9|8J)#UNZRc{v<+~05&T!XGzbtUNs5Cx1#9$}{gah$YlQS%zy zx`mui;M?cdUDj&1Lj@gwQeI1Kj1dBE?-1oKvd07Fgm9MbH=l%G>Dw;7VXa;zOVnkV z6);QdF7O7kAc8eyfINeZ?W8hoBdt@T8d7O@EF4yX%uQ2Wq@klVa_L_-!ojZM2TrVg zR^Ojruj7CJtiFwXo{kjtrmlBC?J?3Ku}8)~Mfq*Kmy4BN`r?tR_CiQmaJe08>XU)0 z!WBg?ZNcgeydH16>}v2KkfVP3*A@#2X{2r}#xF~+KD){ea$|vp9eaBl4Dl;-l#>># zmMh3o6AbG8yvD-ShFXeuyoY81vQ)QiSM#UWJ2lx?JlK2%PCGzA4lKV6>T&d$t~Qi( zXKtRX?PRQEr?tn1?!$ep(nc&j@j*RLU7kJIZg4HxD!EB>Gm?@e!)*L5VD(p1Y2YcA z<bo34gr`|5`4zkLPr_l{#&BzhYZ(%YG?5x1=q$jYwwV-Gb?M6Xd8#WGN}{4~^4X5Y zT{u4kJB=+NyHC50@64WzG@=^I&wC-A+cdu)E3vu4SBhJTWFA@Io-QY9uEw0JHAzJ> zU?51HcT2rCV-uIJAH4&@1^=AVgnAenIK_;P%VG}<g+(8qUO8m|qqIowd%J27Qkm66 zFOaR>2yaBuySxGQ(0i5Bv%HMr3j}`iNM<%>TecVe&?6gIxs#5Z*;%+XC4$Z*%Ds1x z5sq+s=C`D{mDS-uym$Ua6F$TC+9U&(i_;ERm5mJ)f{3ZubJTS<%xeN;*Za{ihYevS zLpgW$G9Y@+xg&9*`snxy{XDa|{^t?-KA*W3E8RsUB+Jy3SWo&wx`$Dr4|jlN6_4I9 z-|DwPx@t4jxSZy2z4MwLBmndUBl8SLg2NXN>l2N)#U#qSrCfKz>_7frQO;yjC}&jP zM*NmeW6#4;oe-bkwD3e-{c*R@sK#f9gbfa*pzZc$jLRSeDQ2KXk0lAA#wQ`pTE^8L zW324}`P3jlj^`ZyI6?GF$!{AkH#e6mi3^oI4c3WAZ!;p%hYxes?sVybWy(u(Gp5Eb z8CNoWDg^Hn;IM+AgT|Yl5^oiShlr9KubXEpv37LEh;n5Pf`7$CW(?dm&KCd#q=`uZ z<@69@QhEk-V(=kzyGyXo=sB+uce56Y_?0^E5?E}og-cd6NrINuueVKoGS<!Gr=LD? zI=Z}}7vyoX_+{_Cg6!>vkhnd&&u9D*Xh6d=H&@mObP->ah82|29P6dKL|*hGSmF$V ztRYk5vTx3Bl~pkYJnbyJcuIpR8I;xjAmc(}7m;CB?UPh((*e3(2SRkE0AjIdpv2Ri z&f5(i=ohUnzczB6Ah9#}<&-95uZ`stIYP@SX>)Wa6qmMUC8n|=-g3WXJ|udHArOVM z4(-&xYo)CfiWr`lX#s)58$+1VP_W@?!)clM!SF$Iv(;}~*009z3|u|peATivdBs*7 z*3U61y%f_;5sl!FU#&AXkeWcc)OjPJSUB9lac3cQ2&=7Y=Q<>Bem<ctT}J|S7nN?Q z2bad5nA-_BCw!n~Wd>AAt$sMU-*iP;W4oF(&9%?JeOeeSxXDcpwr_z{ggQ%@mQY<S zor0Qxyj679CU4bzPwA3EPP7znDfY9ho-tT9&+9P0ARFIacJJ=gu7p>6c8!O|N%|$b z@|i!(MHdSQ!Y92z>_&PX3;+gIyh0%m91&b)=exf^!xeOUCmG_e{bEd7zgiZQrBxOr zRK><()$Y9<;>d}1F<_DG5ks%0S2;zwm(Q=|gAs?q?&%iQod$YbeX^^d+U}B{Umc!G zBNEaLxG5IuagY~IxR!4ju%z2j|3)qE9{%3z3B{HE7jE!%FCjl3oK9B!gY3BE9SDZ1 z6*MM6wgd$;3&C72<$CDO1&yiSfO--IIxVNMnfr?rrxY&(R*UubBMuIaS6mvzc2ePk zs@UwKR}-wG|9DZWF2$+6LS$v>u(N1aMWKO6gVw@wr}1$(c4P|o&ec11+B*XTfj}s5 zQC)~T+))llOW#orj%<;we??Uq`SJWPpZ|hO_V8<>9IMvFJHXtDA%4tf_Jr{-nU}x3 zk^d+a-}?fU+07gner@!u)ijB&eOqxlA;E5U%C2sPk9^vQ+rs5y4vs(@hXelZqn52Z z(n6L4%El8T=@zIu?|9s~df?i0x`jkmDX!bHPS4B*NPiS$?lN$ZkkK%I9(nDr<csL9 zDn#a{?=hn1Ri+q?(BCW1Pm&UD%I0;}%>uWyuE4{6>a~w}R2G2>G}KKfOUJ|Iqx<E9 z;ZN5C65c>MzEJMuE@pb=$ofpTVizJlNJIu8RZR5X@ky=xJok6of8HJby8`|JhyQs_ zzpynwv+4wgv5&R~f|o>JYWJj}6(}sQ-@fhEOpVtF6pnmUPtmk6pVSuF7H-U)TIYvM zdC3N?;a$i877Qf_0V;`IE$|4J=kp5|Utjzk?G0VP+9@uT@o%l*jR%5C4$pSPjbHq{ z)&JQVcmM8T{`Ydv|9@WU-Gwjtj9iWk6@}yrK{y}GVl2+eUhK3=jBaVU3UOS17*oaB z#M$WuH9eoNag7(6(jYz;9BD-}2yd0SPhN}@Q>W)VO)8}Tpax4=d`*wF?LH&SwtTm5 zLKH$C%D<42b3VLJ!BuIih7Hd)w)PxnVMRtl4y`~GIM$p`dcHTC=w7u_X?ti?#x6UP zYh!SQ2!&R2yRJvS?l#kjImcfYCB~trl}0kO!jC4%#S>A~=fX5DUe-3`vre_~&Aio~ zLX|VHH-6*kyNmQFv~0!aoeMkIy8pnxZNby=9Fx(&aIrx@+#+^onIb{Vnp1uHekQ!| z<GP;UnqpJt5)QOG8R$z{0!`>Q5B=)dH1zGDnBjoKy4M$kJV{b=lPfL8zJc5tKZ6b4 z^5G2{k?N4LRF!Am6TBJDS2@Ls^qMfXs<54Na2)4K81m90u#B&qOr^O~!0>29^~CqJ z5jz^jvL16@{{RCkq=+T7bYlJ(K!?c{KRNcvE-H(5lfK4xjN7h*CVcbn%&ioDaB!PZ zyi-{sPD&l5ub>3Co`A*~NRFFs+%6OK?zf#3)E22x)Vtcj=hlJfr|<?`aGWaP_DN%n zd5)pA9>aV_5b3?tqrk37wfKchONmAn$4q677)STJ1!74Kwf&bGP4W`m?=!BiIXtFz zM=d=Zdd!-#d)-=}fpK-b%=ddkRN1Y9GK^(gf4yG6+e}{E2Y)(UgT7^JwjmKpU=iM! zCd#?}Y(r#)16J!7%36F3XqjxNU>FXJ)l-br&8h14dDhPQ{W(*?q_H+n>yCPiePtt0 znQ2%2%XVk`8hMbmUy%5G-&kv}qf2eh=_EzU@oNTyj!XO3F(WONr3$CDU?sfbyA^+w z#1W{eN6%_Q_w}txZ)(xX-h<DPZ@NOg_}_N(cwaZZ;h~%#l&DIs3OZK!bM=a?@z{5e z^P=X6<cJ<iW;cPB+5ZRCx5=5_7JQEGSk6k8#lxS{X}=)yGBTR=6GPmkXudX7yX~3S zht8kHc!j!7n^_x&Ey&LuMMa0?B}x$>fEfU5N^9KLYt8lR%Z06B1+~{cgAG?6#>3U+ z;)t16gAp*(h3~{woEo7<zD4@7^kKK8Q$(kce~9+DGKE8nz9OWVK!+N4tc;=bsrfK@ zYF$54$^L&6QUDH&qgK|JMpSh-l%+Ogr`-3tItwjuy;91<zE%7Qnlw@>O!PhdcCODX zcW;5tkm}j0j-JI}yFA63!<66M4YvR|N8JEjZutyu0Nnt4la=#fp%C8xR!tVMW|mV* zK7aql$~?Afz5b++u02Zcte4|8A#tADE31fK4$)`aBf4wcvljCJ>}nrE8E%iS(Zklb z2Mb5c^r!MV23|zn3YclOskLii9bVEC^&kUr`>LQ0+of1|ES9lN4}s-%f(C}D8L7Gg zKxL*-2uvk%JEk)%>U-`gl>3tEoa8>M08FBY07u0n8aM3gP3#M|Z9rY%6Xg89QRUh; zsW}?%c-2n?H6c`Ivg?6t#s_SVTOl~;;?xOo019n5;c@h$7D2e$`W+CXut<K{_}QKq zVVZS)DoOWxrIV#1(OIOu4|7arG%1|c$hB9equ#6_rImzq$u@Rh)zP0rGI)->4UuTy zGtO-TdPiqLg#kljn7rVJ7*;Ot9P|pYj?#7$<LA{Cy8W*cjvs$~KNXVG>!)1goNvv} zSK{R+clWAK(&yMeSN0{?N`+uo9p=r*8Re6vFO$*K@MZyQBfMyvf-|-lQ#iSgku9CO zilo{$c{2#LJxGjQ8j{(T2r4tOttu9h=5PaHa!mtbm)i(NBWwuER5b>(I>b394t%e4 zM*VeyLQC*y4$s|qc<Z2tp+L5oexHczpm9$&?}R!?$hF@KBo|6ud44y<L4d_7oO<EG z>H{0GWjQHZR02Pzba~w9LVun))O*`Pf(<1FUoLcktUIinimW%)tQe;Qj+?HAtC?uo zZrAww<$O2hz;4bu!9+}lAmg$8NVs#q`^1;25jd|y(0XlVw=@JW>YG#<am%GIAf7P` z33b8%&CxTk@&ztOc+ozy>c)!8;--LNaAKIcWzyiSBmNzggrccqrc(W+Nx?DeKu$rD z2puALRTKJ?L)~a(=;Pq%!Ih$b{ozfE#Vu?^dd`yx=mjh2CDXK>^LqX*h2)c2(d%(q z!wltXQ<s&y++wO68Fu`dhy2>zn>uUo&IN+dva(x7fBRBQFKukiXE5j)Fxh&;dG75Q z*HTuPpKbelKp1*`mL{9K^PJt+BaxK(xYy#28*`p8RI_C6m;46sPGy~lO|ra+aPro= zdT05|nN<ssO85=XoaRI(?ruOl!hkj-ylE#;M_8;(hR+=!2>crbya8XT(i2}9-3rYg zRH>Hl<|P!*H-4>PkXk^Y*?p4K=d-S%6!T4;O1}~W+4<kwC6uzdK9nkfH`+D1@7JWF zR*ca_8$^x;Zgo6(%6uHJ5F#E~mP%^t1A=?LEpz@`TLcUL%d++6{+G6f#~bxnzz?d9 zMPcQ6S?gt|U_k6Cjp%~>|JTO7Zv9KYpR+RTA|>9R$M>?%Ogb)ghNv4Y{nVyeV=jxG z$4gO@F*!q!nOW{V8eQ03;qfk%jkvl@BDptJS{|;ML=D#G_M*|JdW;(YA3B8II&krp zz_-7A#D4<R|DCV=kNe|44}Q56(^i*AQUA2s6V(cTpl+61N+I@rFvbSB`v%)7+3;Y! zG6?t1c*Ssh+9L{*w&`DH;ocM9W)L*RF)1cbEbpVs2Rp2fANZq?GGvT05uoU10gpuj z<?KO$oe_qyey4i_4GWp?|Hg<$^W&f5I{y^c`P<w7X1WXw%>ad-Y+h+R-9Q{phjCwm zj7&m;!PwO@PV-3!p~BtOdQ8q0I3UXW^z5uhDrso$^6B%=CcaxPb@SacSq_yamM_9x z?jFw1AWRgq9`6bfRkY)2)}L~m<w(I7QywbYLpztfUZ0oPO{YYnEqCm%^;Vgli#$?6 z-wfXIB$nmr{CS-2%30WP?ciflm>vtkrz@3Hyw7g0_RGbv*k)I&IWkZ@V!^CDEaNWc zc%;&?ETu8L&v&}_@?l&rupK*BrSFKybI7r=KAuYXtw^_EjK_Q2?k3P8#bxlpa}?PK zivgKi=<O2_uA8~p>b?DUa*h{gT*Z`vLN{M`aHwqe1nm?%JaO)qU#ai$bgO@}LR6t| zfib28WUFrKb&3ydG<{T`8$An;bMK%3#N^gon6_DtqBv-26Lo5E$cB!Z(gBMzytF&B z-vqWCwUqRIRKM~ZH;m)8M|sBy+dpiLhfdk7hK62UX)hs5lN4;l8sckw7urtKW#c0Y zerp>+ow}UpqR-QYW_=NWA)A7Si@6tjehvP@=(o`%AGckZ$fp%sAmH+gt!dDzkj&kY zQAVCG*GJ>6Z?@hm@G7_Fh}XU`|0Z25G9t=tNLmifV7R(!t4Y$XXk0BLK?sNdN>UeW z6<(SJ2M4hgafunVfeCwv6Bi%_2cj(k#QBfRAw)P^;%(;Yz<Em2JUI)Nsi`lP+cT&7 z$7y#`W4m4m2ehkx2>Y})C+Jz*Pg?UOiXpWhG`pslpw`<fay)&4g1Htp_JY=TxXTs} z(cB1p(?}mV{FY)tlExz96EY&T!Bjar_c;%320@gl`_ju@6Fs3#cq_?uW6~UzsByVx zhkpB*Ca<P#+w91HgMctI?g5_tpo$=?_*zU)Ck-^U-qGk4rKI(_mO`HDQ6kqjYJ#k+ zuPDoHR}ZUj9Sl|tg3=CCc6i$ND?;r<%}z5{lV&;Y?*z$?015i<bin$zMek9`)-BVV z-K<}_;Ci8wh;TA{wbrdDv88?MqRQm;qG-VnDsMNYqg$ej8Or(RG1h3@Ysx<lj}AG| zwZkVi%N{kwvqP1KsvGGmK6G|wP5wp<)1?_ey#iI(gKWbEQodpmTyLlquW6lQed86P zOH>g-oXAF=cr6c|lrO92e+kXC>R|~;``)`9_{B{%3?5`nBR2s<W~<u>_Gh*Ac8s=7 zEtj@Xl2ttfDy4Mg)14cpj*@3<0_;9DG~xYzP!THM*0Bq9^y-e1x(?R|QQ-cSsyMGa zw2uZc)Zk>*eMxvV?BjRi?u1tKMM=ZjZ8H?C(vn8p6@}W{)V$W`1znImFrd$)iJllo znB$z1l~E8A3Vn6?(jWz0kaS9S{z~y?=hiQ>_G@nk{k`hBhqiSmly8vFtXRq!DM;Yh zian`SCO(E}B3Z<u4ruv~EtgK0X<=XTU`n#~0M977iDvty4ezKiBT+<NaYB2GT26{- z@T>Xm81E2@;I>jL#LTP$L&wU7hsVM=IU9T{56R*OmDEA#XOsL1*`2y;mA%@Go2@PF zm>RKS_~%+S?>p1N8Zs25Oo5AFc<|x|4wai9tCW#r;>i?C^D>?3^#tg9DDpd5)}1{_ zXlFF;2bCnw8xd5eqe~hIayK2TC}VbuCgmUK@gM0H9htS0Cq-MR&uKsLE^sA;YWw<D z<5?=pz!a*$oOMEfu=g%eIcchXgnRF4*o}~+IcH3x+6rLqQ0u^CN~8Or=Pd<4HsnzG zoQjIRY(hYG?=^N@%}EwV$XTu%x-f7KEkCCxS}>A=LG=xHby`Fa=mLIvpWY@80B6$i zYB_-6Rc6?rIdEMF=cUnqR~c}q);GCyMmm%DZILo!!qGz)XGVUTf2x>Uw!ULl==4%j z3`*&d?yVhpc#e<TZm_HVU+leiR8w2KE{@x_6@`rmC?IS>nl$Mhwn~w{DG4orQi2c& zHT2@%7CMOZt{^RtAb}7Q2uLr1ASDC{0qG_5-o0_3^L^)zJI3#h^W8DNbI<tQZ~l?B z29vCnHRqc1edm0i_j&FKh_c212HM<;DQJ2k(t&yA6P7-)G~`&}rh7D8obFuSsPS}q z$6pJ7daz5G6FGdns!M}GcejH$3}tEbxxRGb^Pev})g%(k9^}1=$#yhioPnz5)cfiR z<~>v8N=OrIOb?D(Jm?w?bER|iEt{f?MAx&eiygJh(gT)s@1(0sesD|tpJw|REBbT~ z|G#JeLjMnJk<+x7yWqJw)GwCd;#bdx*7eB!iYErX1XEycObH~-gT*?!OfPg7zt;Vo z!F*E=pfYdpK}3~~m;0;ys{1cRo_}kJfBNS?%r^WlMV^0FpZqJL@V}u^`u9dZXKLgZ zteELy3N6omnW{qYK$Akvl3xxcnf&sZ&87z$_O{_J!do@s9=O*^UUd3sf~V_}1dEX_ z^&N5Dgmd39RCLAL77>5<R;ZYDflM7He37!CYsUk%&4TBYSvE%1-<@u}unSi%i5YXb zF*Jgo_^H~cfb0ITSkFhBv7)k`g`gT-<yH^Tx?3DphTz-mNYks)x_a+*tq`<fm4;a! zu9K0W;cl8}$!eRo|9<qTb-wJ)1U<mYuFj{#+?k-At*8DPFmrT+H0nKl1pF(&>a|^& zXc}Ovst6E!Qx%HJDVa@9KY}E9ZOZx8>T}6G=$Fql>WKokQzj}FY}<5;Lc`o^&-Q-X zlM=0HXp<}w|1yQ++cz98qo^lFe0$dDn_TDuP`N9)=rZ^$-w?{|pr~!eGf^KoeqV-? zlbC};d*5AIhN|6ff10jg)_|(YB3{?$cXh^$Q+1Ua19L?z(uW(QJ|{%u<#cS~lfEtN z6W9-xrSsqcMQU!!o{x5AzfCj`R;}=hQ4jPWD{D%#iNf!$wtI*Ly@Y>=Q+$Wlyx(_c z)a1V8r8Br~2zb{&miEpBC~P{RsH!<t*%o1<BGhz<sh_}fo0RX`mh?>|2ACY?1#FP# zBd~UAkJH8<CpmuHKQVd;d4mOYOGV=oztpPET&ALa)|>7B1a+KS#y>|Na?8e~3%+wJ ze3r}`8Own#r2$qG)6_ytXCkqc+GeEou7FRkbN*4Rj!-1WTLx~>PUP7oJHH5)2fQ7? z8nG|_&OEmd1m4i|5zD`9r}uwnz{)e8TuR?2<Qt#0R*q4>(EoBXG$he_+%4?E4u)d3 z=^A|VIUFCm6P%~o@zHk1N9u%YLdIbB1E4`|+XeAV{w9uA>oc%NQ}EgKTVF>w51G{? z$a}-<qdVIz2UW4BH?E2;iJCinA}fXztOB$~VwT`p$ZxBy07DZg*+JIZW>RVNg$4D9 z^3c#9pD1S$3HKN;c{mM^E^%sYQ-Ehi#}x~@gsxMv;*YY;-NhGBUcFjy?;!5JXA9f$ z-YfQZVo{VFweSUeaIB)OO|mN&>#be^+lJ6N&CE|ue<DG`@2&_JH5@BGYd*Waarxz~ zwcB2G9FX%(_&bsC-D9$lv#c44k52|(mr9bQpxvV2b2PMx8%Yj?%yQWnj_z01F<KH; z=GPp9?<KX;GZM5^=3Ou{xGdMWWjMT8q#z>;o>465uxcZ!LOQ*A1a`E3rdu1rAF?2Y zg{XpAbYkz3rN)9FHf+7yj8?$m^^xV(5Zy~lgSdC1%7*eDLwF%iPrE)XZjNu?8Lpn@ zH*~vOFo{&z#Z7-_I2XVSIIc1<v~<73Qx+$|Wm8;G5iVnjt0e*C=gY|=F)Jg*RQuYU zJPoZ)wzgCRqugNhAbAOU(=3mWzNXU)bw)X~<xDGRl3284q-=f7O`h!Uod{xi3%EAS zW+S)^@mrFn`Mfv_RKu3KMJ-6kdVe@sF6IS;m+=70vW83(6X!|a&R|FR7A5_iWKG_S z=#Et{n&=yCLwS?KwT_ohJ5UdUKwx?AnozCZ5x{Ex%mmXRlA%C_#FuB&r>ky9BrccP zM7yB}4iauADKK9Y?{7O6OL)dX$(O<VMx77h8UyCLK2&3GzmqA@FBhsov0ry<crc;Y z#!=oAVBK2$itB0#EItQN(1*~KvzOGbnvr6SZj?LKbWgmzFfj+76w<CF`S(Myx$?Jn zMZWFXzH;baUFr-|E$qd1Tp>V!TRg-M{G^J!E0CSzSb^KszYaFY*V=|529paf$C#pB zoLvbQqZT3k=DXNYb*6}*>D>m?xI%b*XXI~dAJ=e^8*qW^IfqV%#_eP=Su+3KIrtKH znx5O8f_N#9Oo`szS~V?VYfK#Q@am*T?)V=mS-?@}=+VbSmFr*kadv3n$WF-QC9T+; zBCg=lQHiM}8HWEfLgjB}`P@%N{G{sJk0+&OLVnGFNKPHt@uqBeSA<_C?4JNsJ3@x? zBqLD7K8`x-;lwV5F(bjcEjGxxlai&dPMquBrdF2|#Otb8=UB}k$ylF?Z8H4+27L{a ze#)T{K{&p~^z_G_&a=FYsE~<hx?z6|u7V~U-E}<P<>kEPt(NH9TK+AC(fn*7FnvQW zf(ZBL;fQeh+_yfs@z|>1EOKm<>jEwQ1^p6Io{gl9#)EA8`DN!q1ZWc!j?BMm1R?#X z`(Mh{55e*gnth<eMCD1z!yE2Zr%-bA)}xR+fN)+taxoq0`CniDalR4<Zwbd7=SmJd z<3N5FOPY(Dg}qO-yw1(`Uy)V4lDaDHcE~9JE~OSjnW8#}P?v`(J~L7`?J$uT10!^~ zjOGF*v(6u%yHXy1=+TEx>EmKwE+|hmva+!A{x(#Q+i)tg9#nkq{*R_O|1U|1f61Ev zuVdnBhR6D3(5B-w|J#$OS=XAvMSz{g2XWhU9y&MjHn8;kZ8<rX_!feb(uM4wpWM3D zv2Ernjr{tIgN22iWHDgsW1KUQ3^uqW{b&~m&_`6st{}+3lp=_xX3rc~Z?}urRVEu` zrDbmZ(9ARKCk@}o7ZzBCRh8OZxUi47MEkx0a29NxLs7nNwq2HlSxBzFiN3qvu=b;K zG3gScMeZ2yaL0?U;^frA@#w%Gv|E%z{1R48O9dZFE8v8^xY@oO6g!*CdW2q@sI*SI zVY()`HSDvhO9bigJPTgoM;ZJ%kCX-_#BstWNCLjXi?6omI4ymscj`>y;#9DZkY?rh zvtp?Xt7Z%GbBb|gc9Ys{fMZe}hhteTEq)rSt(N0>Yu+`g=Rs$cYQrU7;dbeti&kMA zDv8D&n6%d!@xCrZrDsB%s{;L|dAm!KdV_n0nyrIMMh8}`IWAn8Ghfc!;B?;sw=5VV zToPO^hS)29rz_;)Nr&b()Ktk1qEhMYMVEH_O&GJJ1=F9tEO2nl`ej0HA=Z=Ho3OSL z0A7$js*3l?^?dV~*5mlJqfb+%*AiZM<s@DJykeqRARgZT?)o@@lEP*bHCfl6VN<*2 zv(FEV2NkLv`#g@W(=y-kTP>GM4|awbPTBt+W*m*0nHWv*uJTru;dRb(b?+cdQ#{%2 zqy@?qkQ}YK%GOJZvT2VR7e6WwNTsaPBRyl4ZhphlUYJk2#v*sbh+V5982{L$0pf&< zX;<cN4Boy2ya%^~`cE{!MBK6dT77ObCD7$t8rLbf@;uRA=WKRFa)Z;pPa;g?_(mfn z;QZOF$>y3G#Jg;#Wnj|7xUFb$b3o(yVp#T|Xrl6<Sm$m9f@2ula4~oJq&<N7t=|!! zhC+|GNV}3c_vv<a+KbK%tLc7@=Yh~$YDSn*D&6f!4$C-Uow@vHLwEQMuad`8enq*q zBCp$~q(&f?St7-AfgpK4lE0L!iIGJGd4Oh9sVr$-4)iTiJWXw5Px-2B94mgOP%7X7 zY2i(s+iGm8O=gzEDgmbDKkxDpDL-fKEDN~ZK72TG%f(ndCqvz{=TerV;j+r6f!ia& z(Npg?j&Bdu^^lLMokyQ$ynJ4h`F<H9mIVG&STO%pma8d^WWw%>EXwcutWtdXPQ5Ev z?Zvd+Ud~`JILGdOY)*m#Yw%nw3;2FaRbUL#(9EzxjST>R8P)V!nQ6&Qz^QVcHE$SW zi4qSK4xVW<UVNDiEY5|<FBao==LN-WVtk_Ev#pw%&MaJD*Mj>Q?>%Ldf@-kX1{8j& zCU-o$%vsGUYT9r@Y>nA&>Y9ajDAVn8)5WhFOqDx0N~ePFrS|1l)S<-+Vkh;&e%a)2 zC0{s*n%=+sh3QH^E4T+TEyZeJ7H~TT&L=VL=`1s7A=@TvhA_8A8`jD83_^Kde0FI* z6=@062ryc*>c$<}_)q&5lS(s(Fxsn0IXy%ZggFV+4%7d3vhVgRcn$&RbQaqtm)MLo zqt=wu1J*-V-Cgxp3$ECHXJE6Q9XKlq!A!`h`h@U(E}xds+0nUP^IDxk)<#!ck3-IQ z`nrwA6ebshSa<^5hC}4$5y=)80?##vb573g$VD$&=9D+u`HdE~*qI?T95n$JA>!pC z!4i10z?bd0=On*0=($M9GR<`=IGqujz<Y)F9mdFVQ6ry;=Xoz*?UN0~$8Daxn|lfc zw$6(sf_LlEcENMaa8OKy#E~(h{~Xb79AZ+QGS>+9bk2a(m>CNJyQ}Ro1x#)4ksoRf zYdNg|*xogeZU6+ti<U~W(tx$X^p8|JCZq;&-<3n-{Vmme!H!S$kh?uTqZuo{Y_0F- zQ101x)BTcfWrzh|d>O4<mZ?)tbr72=n6ZZAmM5*Pvw*fR$f#bPgP@D><UOKE&YD?l zF^}Xs*r#RkXB^(6R98PRyS0n}6S`Ez{rdIdgQPC0<6Omdl=3IP@>sLf7RRC?LXkT{ z0^4Ab^r;ZGoa1a-?HQfXH05|j$F|bLuEFy{K>t{R^$InwSV6+ab(q0)J^zyr^(wBF z##F+&C#{uu2|KD-TQx5)bBWr$F;X0%ig<?wYUezL0M@&^Chr(53r15yN=&7;SIn@N zh)d3tSk_zP_om>q9gmVGT6Jf_LXV_Y=konY+5)JZ-HrcVWOS$Zp**XXOn;o<2SJD2 z_h)n#5EHm@q0@}LJRaC*so{i=q38A3Iz&(EBM`3EKwMCCbaz0-MAwV|Y!2n$?c9Yc zN)c8D&e!T2U#^5dtI&y_KFITIZ?8IBmm1$l-a4JMJ+LKGjzcB(Ll)|4S0tVta<NOe z<cmTf1o2T2R@?ThP<79fAfDMXM4giWm58D5$Aqeh%ej1K&?Zc5g}0o~`0HM+PQ0{h zlN*}pXQLH1g$+@bXQw*tZ@7&e$2adE2>e9Sz)lF9+{oXC=SIGs9F>qc-Z}YY_<7@p zy?X5?<(a4SYh1Hg-wl;K6C@wvGN02dR4sVROPZ6jc7N3UFXg9FyZHQm88ZJ25kolB z%odBVK~IOi&FcWzM-HHu5cEL7e|h=G{c#O{6|phxYWJ^IA#5+wQ37+_W4UGUx#!P= zD4rfR^g!a*LfwxD1hgnUFm2Lk-9H7lu9&0d?~3**i?^xWosk&Qg7sq>b6M-uGX1xs ztg(i^wo-Y1fRqE6Yq<;FJmf6sw&;T&4H5DEU+nXdjCg41b+*O5|8`<%|HVM;zm1IZ zo4UF>k99OMGQzv>3yLI{iRkJIJ&{U?PjL7%Azvf>a3ES9+?DNwGy$07h6auPJ&j7! z1*H(v?rSrkMXn0Dn)CY-04{)gy)_*~-Ka9Xr3xC~i*B17L3GuJ`8CJ|vvQf#Yt>X) z=xa)Ja6N>hy()I|Y@I|=)rD|6*@F3&f88-%0I_Al(2h@rgytk2<}6qgUbY8ysMC|B zl6)^)YQY|K)L-1_<*9qZIQ8pp+cWTp3P}%qZB%hEsZzpOe(v?>)1*r81zG><NSPX+ zg4h&4@FkH&%YtC8{Kme%_4ReBErt0Y&`ipF*ltUr?oWc39q+a_R36zuUW~tw+^T~5 z=EQJ<C3V0|>kaWXJ!+<Um9wyxE2$oc)mcxNc&u1zdL_;21|m8`^7$eCH{aVzJFJVy zpITSykLrd=Y9s8N3!W}KlMb}ZN#x9k>GWP&ocG!A{pxdF-~-sf$)<Qs-Bi%zPvWi4 z4s|yKya1;#@ve-jkD&8>iQ2liw$7=LJORf8kLHcqQ#xuUpV-}lf9$(|^rH9C%<YgT z7-JUi$i?WOqPsb@S^mw0;Wu%k0~H`l5)4+3@r-UYBn<#R;_h>a-vMW2woz%oGu~c0 zWRV55Qf&;d__9{{Qy>JXc)7J#uFcjVOXBWs+Jl$wF9iyfrNi<T1~8MNc`gHG02h7B zebFxJXI}?}3Ur0_c&sLJgR98n(<B~nT<wq8R)4bkSPjQVWijy2f0~i=MIAJseq%RX zDX{6YBD!{r5`MQ<O6T`l{o-B@l;Rt`iJjT1Ys=T!)^(MM&oX7SQQ`>1o+V=SM3go) z877+6J5~XTt?`WBjpSU6S;}(pE2l2bY;`y<FL~_tL((PGtUA}O_Zg4EN#RS7)!v$- zcT0dC_w(sp1=FT7H@xM$O<C-N7XmA`_1>o<Mnqte1MFpRk#=huY<=ChGLLnNmO<<d z18AHt3)8_3Za5Z$R7O?_pH_PnoHr+Yd1jDElQ;V4dr+?|3mt5i^<n!a=L|1QYZXWy zL|TyuA#B(fNq|u)5Twp@CK&vrJ0XaAcsg&BUWy^XKt#r(GG*$~Z~8WO@pDc%d%uxR z3wZCY`6JU+`C&@ynsvE?r_3*VBiA}KJo#R;R_1n!cT~x_!zC?S)p6bXNOIFt<;1LM zrDK!D{p!5qOBR*8w&Lg{MaBX0YpT3g_e`i0=^CF;v~a7VuUbngC_(?TFYN}9%wh8m z9E*Mk-i%R3kz6@$#f2*C+2{|tdYob`>?2r1Sd_+dbEu^zP!jvheMd+(^*22Cgp`ks zcqQNG$ae%Up^UFSe%;=^g&$Amm0l5?<JWAPrLjz0ajGwEIP?6L^!68|I#?=Q!}crY zg!cEWti@az(`J(EIQN3+n%%*cYtNS8u+k;Sy80Ee8aOy{C%IRuL3Ow7t1pGsTr~i! zP<coynz8Ov=rn=o@r|}l_pg5242%9&Wfc1vHS4|7U#+?3wI;9CJcJlsZkpOO@9kl; z0#J&>{DWq`bZ{W8b8R-O^VpFyB|?hd83<v{%%2ZNYd=xj5c8|G@jj}`MhS~ub0)gY zpGL3g$8s4>2l30MqmT}BoYhGXn=-8=)OsLk9PLB0PUmwdGA9{&=gQ<LR5f+A^*xFB z=DeV@$$IVt26@zT8Ei6@|EHzrZdN_BQW)=X^3%pIt`Vx(o$m}QdZ&nS=Hn!tj?cS@ z_L4zn{V=o!dm2eYOC$eN5R?A-7;S`PQg?M!g3cb1M|6CBa@3|Y)(=rcz<Gy>SHkWg z@cMOXG&h(8=f?IQ<Df;Zdcmpoq~^um%aAY%$r%AOlhVTRtE3}IEXuVAGu!U1?kup4 z?e+INjXz5bEm9dHvC-`$To%7-VP4s&;mr;xeRn)zyxFkLNOn814EcPW;oERtvdxWz z&=fGF(Kp6E9wNruV>(6+9kyO7AK8->9yR9d+!OAeW&AK!=&x1_tl8yQd2xC}T&jp~ z|8ih5+Agjiph@45XVH>#l+Yf@Y_ZIR1iFEhvoT8gqXqy&#gLRnpcm`N_Nx{{&c|;6 z+Cr?i4W6y`v}J{OcUz#!lkebMNrj5t;5ljBcLqaa?Z`;b19}d?A+wKa=j_0Jf%`~{ zssaxiz_UU7uNDO(MzzU6-I|)55PG`J2Lof_)5&mxg?lXHv3m);SFJfru33#gLf<vi z@Wkj{D_M?;51zB|v_%Gxd{%wsNalO<V3$V8!I3++U-pj#KlrTgXVXHVYgq{Yh#JKA z8%nXTuuMe$uC)7O_~?G>b_~rXT@ye>jkFbd^|r)}C&+#F;$j0Xuv6maqvUK|SfX(a za}W-}xL3+>Tbm(Q*lD_%;SaqqB?^7`lv(+ZIQZ`ux?$XwjWFSf%j74|qpc)L)#Rn- z7OUd{5-D|fbeWV2uz<+bqA6V)A@zl;<1RpS!TZ>U+fY=vn%sX4+K@|q)4<3}Iw7$1 zjpZ9RrtA;S1$USY+5{AqFk6RTgULoZ-zl!W^Vx0%r9yO4g^k^R&|doy);kDXx=d$f zSDfZ|oLPPTx_kWS3Zc8!GuT31>mA(W>f@-U$rfYd+x>l9jS3BY&|MDYyz)$f@spV} z70Ks>=XS9mZEu>oj_<qRpL$EnFY8-DS&Jmofrvtv@hU?X7Vk_*lnyG{?Ra0d?Wrxv z4+%Y0DF-H^4W)q6>o$b};b8#*^rbk62z<T_KVWB>@}$r4mp(U@9H7fMDd4+ho7$f+ zgwkGiQ>Add>D_y%lV$Ilk^p5RaF7hfRKlZZe<XEHRaA6p)LG;r4Q-EAfK1BJt_l~> z`zrqHQC#cnxy^mG&k&^2VQVj;%{C`Xd}<H+pw2x)pj=rs><^cIi&4=(7W#Efz~y%P zH@n8<eS_u2;w!Vps<ogS+@c<%?so9DkvgM;d@=v2<~bIh=;9D4Td+cX*GPZh-s}=1 z!P)%HoW1c<S%u>-uEI;xM49U>EV4N=;IGKZQHMdPtaiXQc$0`gUs{t=3e-dE&AzpI zw8{_8%xD{<S*Y{&ZOk`CBK=3p;U(X!FZuYh-g=$Zxn&hq5yJCFLXf1An$oWWg6y1v zO1Oks0f8dk3Tm96FMAmXPC$f3-^)egXl3+7^Wjzlq6r>2XQ!07^y}k3cdfu5F+u~P z??Q^Nf@<tzg^s85_jbVC(*%TD1>xe1xuXEeN>ef*tmie7Ps)h}tH6WtN{`Bw2l|D! zsUjtUR6x|m-i`ft<R~IctQ~FV@<rIsfwmgCfXcP-KC_32NEFkv?o)eqd<>;%cU@pO zuZ{j5v_sI#w5TPl5Ww-$XsY+|jFsam!Y%gAc7v-5dvSQ&mtHkSS>wmP`-g|8r>6@{ z+9$@MIX*eWc&`$=Ylq6dTL1fUIo-7j_L;s&eTzcfZUv1qMR)T~Aj+!4+#B?Rw>c5@ zcr+eZu8%zCvW1&_rR<(53!8?FDVLU{Hus4@@QvFiYV&$hEP03#Qe{tdj(dt<kMEVJ zfR!Q#XDhjPu_^I>FBg}D7di!(V)vM{O3Pj1^5lW^9RwAmq2^lA@bC{832Nn@yKG<c zH?Q??$6s~-#RBxVw)kfs|M9fv|5_HH;eSbe|My+p{#UX9{rf;T*Ou^+8lb2%_@>fJ zX(c{vvkOu$_~`^XSZUeoyjo;C>1M#WqBK-LD^X(zV>4>7U1iUrt5E@JAlVW{5HRog z5SBq5eb2mbBY&>+MND-Vh$yb()mSlUSJHoo(b&7zVa#-{Ta0MWGu_Vcva~ljzX{L_ zLRs8xb6VRis03;;idw0zEsylKl_|%!FUF8TRtld2dD2>a(vQoiJot4{rXt!g)UWms zA8yY_JP}%&Y30eo9pScPaGrO_of^=7)oK|ap+w&9i_btRRslO4Au=y5vNrSjCg4)4 zmEtf*MNtJs!Dwwx4pYV9%?7chXSJ4YJjxR9he{Xox@CYS`FvUbI5A#mz&2WLl^aY` zw69;FlJ8^&|CyB8&U8pk8~a#$C8xENE^^LG4b~k;a4J<@_A?q9FUG0Ot`Wee6gG%; zX7sl48*b5p?4(qatV-5gwcr-N2bswuc=5fIePzWb)T87~i)*#-t~x30DRCo+scAM` ztp%R3yFIz5M<O&3(_&_1rKDcsue@@Qu>F-8mRIfVNI^Nt0Fyd$%ba1?L{;q&&7_yM zCCgE`-ATPj;3+-9&XW}sm;|C>7e+E~zG<B4<MpNF&p^H%yiD_NCTc+rxeL_g1#Kkg z!s){!vA5EQ;+-sUuEN!C;3ms4ls;bQT!kFFduwl0+`J=Z>L4h`YuC(n6p20jxb}Lz zm+u<`ucQwli~HHP`KlmHknU%1al<ISY@C*r{C;~^^_5Gy9}DPR#mft+$d}J6Lb4)y z`8lzGd+VEkqG;1Oae`Yff#hZ#ow++PW9!#{o22xZNGn@-fW0`x6*hav2IuQ-^EQVr zF{k&%7Bb$EWnxT=b-rDr+6o_=d!xB9M1r<!@cj|p$E~Gg#QrGQTK#%k>=Q9kx$Fs@ zf9N`x8XLwK1<!&bePcquGYEN#Bf`d(u@<6GK|U3T!j8le+aQve&UN{|>V`D;z+^}@ zuVanmWHu?=H8KMjOvfkBZH_ctSku4vrmcEhMZsY%F0PuKoV=uu^7Rdp?FW{TZQ|Re z1#uO|x>_pI3FCo5^+^+E4kWxKmIP44T8$5vF`Q!@$(poV9hdx-%w=)8wN|^4aO;P< zxYDp1TdD*0f=_BKEtBx27ael@*T`@Jv<O}V6K@!^H6oPh4fe_bw5*4E+Ds^s(NP)Q z{`B|(9rdJ;$g<~-5kI=IB`P>$M8q_OX|#<u-iO_V`|kDB59~XB9XtdKdM6gL;q^#0 zm)yqeBoetna3Alo;?y(`@tMUsV}XR?`z5&5j!M;_0a7G9np~x1tWeoK5~{ZImT$8+ zC6eXni>np#!q%JH+MCQW*u_lCRgSbe1X=!($JW;U#)wLO!E_^x{JU+lTd1Xhg`24l zIY*rpC;ATuyQl7x(Y+LU&I5DMe4MsfS+Jbjw)*_e3;M23cy!J{=Vn<{MI=w&aPY7l zQ!vxRk2PXF1_{%{Ofz$Q&bP#-;^KVg;bU;o!my?LbQwEJx!wS}=|yy$GmFZ0{-0Ko zt3PrajEmB>YTq~KC|L=ve(hMbf{{&IleF%Uyy<F9@YLGYLDU!!jibx3>G2w!wHerP zoLh1FmZx&ZpPIv#%g8qV7juwsaa}S1MyBg84;pCp0s!>IPY%)821F;tjEIXD0k_cw z2<yS-g9dahWhnzqP3_Ul+$5G-`@$QYdy&8T8`#B8Un(UioyVXqx{b+8GDil9@(fI} z$O2RRP&_xTJn8@;Bw&22U~dnzvzYQMA-&=J%!89t7WIo>64@ub(=k+pQu9>@*Bn?^ zM*pxIHMhPvJEJR_+SOafih_HB;+FCk$1hEvH&}`;<ZZ^4H$4>+iItt}XX_Ys$(47Y z?=x1SWzAH8$R+Ax5hh6Je0?y|h3tM(O!0V|I6aT;<dOUGt<rP|pq17(@;0VJEeDT> z;u83z^6&COQao^|ch}cVMDcRonH@sRpUH!0ua|F*^jSapr7YYe`8$Y@7W)w6)M6a6 z<;7Q`vph@;40cGGq?|q)@%qN&hhFyQZ(YCs1{2w`LKI2J!Y0D8paol4z;b2=l{Kvs zD_=K!v~Th(@a!|mQe6PCdnVZ2S?_qI$$PQFf~{jF89}xt@?Byn7w+6q*{8xhbVXfZ z`@rQrs`YSVHyjRM9)^S6^2X~l>ETGOyRtu^>lGHDv!pO(Az2`8nNjYpK=bMD$Ia2} z@AHoPuUj{(_4=RJNfUYVsoP7wa&ytWT$Qk0vTF4p)oF|IS39ej;7So6kpY6grI;O` zXmP9G4xn0ORVOlA@>)Q$J=zlpg~{na*%Fo_dn6w298S`SO@V8Ls=!$xeptS^*CpIO z(|k(#F)F9<N>pU34ye<~@YL7hnv?YH#hmN)W=`|@UkDm6J%jsc%5J;HGN{&3O!(xZ zspaCV(wtrT^dkvTD??ZSa9Eop8CFU#-=+e6-dy0Ra=`>*=<{ZElvuW&-ssQ!O<kW3 zFPFg!eh-@Gy$b>5U&%uth7gE*W3>SDl}*#4B_K)St8KMUuXVbELs)?PO^d(wX4F4O zDKRh<T>f~SKJ~Y*m7ZwNlYic45=h&<Kn}VY-Z-nk>m`~$8@q7pB{<+wQ=9u0ZaZ~7 zK_Q9Gsvsf7*u``SiB9&o0QPGCvi^5&)VeP=*nsP{+5J)uj*6M9f$BU?3d_Z@Rkp0# zPbRM)Umhe^D1Z(#dSglauEt*WuM&7mlwvjr!1u*!`A*(lAd+P&%0SQh(AZ3ObR3?C z?vqH%aN25nPCOTD0kn6y()#RyN%@=j5b6(|xF8T#g}g`2wN}E113nxC&_%#D_(7u; zf#t>C9=4Zo9->JGsE4|$Gm4=D1cZ@|3eh<wD8<=x6%UZmOBkPcsVCy&k^GQn*`Fq9 zUl)#mRLiJ8r`vDg;&EpKr=ykD`GfN8JF0;%heYko?0m`%XX-9qx=t;Lo_DqK;~|jO zYzNYX_b>KMpEPKlpY+OdLk`4>aGvd$p=VsKP{w7fT5VfM2sfW~|B@CaHcG*)v$-e> zfAd*&*hTv%;Bkf#nLCdUF0)s6g+|8SK4SW~XLRnOj;zlvD1<GpZa7*^i)|foZ$rP# z5yNqRS)Xgeq;|%c<5S>T+KErVaVb?D|DEB!hyJiUWeKqze3GZ*8tlG1KE-RYjQaA; zM{Y+$0I_M^<6Y;i=E#_iO?3_H(tuP70k*vA#AR>l>K*!<YrEbv#al=rDr(Um1LLl* zXc*FYoaw|OnTW}P`CgK*ijnrev9SJqZ9~WK*$<oDek>{Z?U*+M!ZID$Ae6mH*U<>+ z2~fRv(ilJv=kTpPn`FdK9Ima_F=m8ox5Z{IbW^gn2>uolCg~BSeQMcT1hB81LXdvC z2ti!0AfH*^(CRxwKWe`||I?TGzwRY<`|?qX!U>DOcZOOB`{H^5yGEnQ=7&huk$qLY zhAY3Jjn@LABQBJjESEf+3fR++J3H05AeSY%7*@&h$>{S4{UYbtk5BCx>0)K*Gib53 zGO3TPV|i)g<2>H-?@#j|C;xc5@_&5ypLO<+$5)xD2?Y713W}_lUE5QEmFOU!+7dT6 ztTiW(KZOEpGso=+54eib_i3Fc1Tcej)FO#Gq7bufmIny#2wcSn63{HReje)!nrnSv z+xlsCq#1~8;F8PctbWJZZFC*L^PM42Tko$|g7;qn0{@K@sQ<47Ged29p&wMWmNt=< zBPXTfmTL`eOLeiEp=xqrFjV!v$FW#N_>~vhfY8{x4GEG}0y!h`Nj+{wn0g<o1W6=| z$g{?WurbMR;<@dGoMWF+F0u@gaNkX*4c_H{wX;PYq>Cdlol>GIUZ$yB8C>*8&wprj zuUh27W=<_9VG?LG-wQ43za<nqYxl9xN-VFH+r||YtEkFs7?o%Goxzu@klZ+HSQ&gq z2ovW%YZOWyC1&5b9H=vxOgfx3Qg1k$?TEIz68;3re$5$GoNS~~pdNtqCfz^cvVLEk zJ%l4=+bu(BY*+<psK-hXf2(7qgR<3<$F>fE*b8lA-&-%w9h;VaN}mk8DP<gw8?M7d zo*xU1Sej<#zfHreKlFKQ^1g*<1lZs{QLAmH<f^HrQ|-Vd_D-!<Prxrmd|)G^(QyKI zM2>8qY;iC4#q_G+*T7t9&#|@s0OC}gkrAwH@#<=xT2Cm@rp&@<5jNJ|zQz2D_q~1a z@`=yT;B#WN)y>p*R+pr69Ar^>$R6RnyRdpesl%Uc;!=z1^O*0{_G|?vK!=X@>*JKk z6|gY523W%9Y*OTloZf-VOZ!9Iv0ofFRatqF`sk@z^BwiiJv&3D7J|to6dj%}C+o@h z$MUd<Kiu(bb}VBx2u{3R%DRPp0AqM>aO$8Eaiw<Q+itHGhX>iH#;EU)R;2NfmJP?- zY;FChJIsokN!yo$5WZ<Q>h|opLlZKaC?@7J<gTYP_lEz})4P*Q<`9DFq^P}U|J^Uk zLddDwg&jx}e}3dK*gfMGBRs#_S1IeFeu=Y+)qL41Zh2u<dfaHoyJ#<=*MrbdlfD1z z0x$nP1oTkcB=iKHrNdanUcUFqG@<@yogjC=N6QfpU&Xkbi;>06z1{Np+1BCDwYM>@ zv!DEyZ5CFK_V>E9d6md`Wl~U@XVTyp+|0at5o5j1RBdQDWr~~Dx2Sp%AJdffWqvxR zse4-2(c5FRUFMIVUp9gJ3R<#*1s20;1NlS4Z7?nCLt;bF0;Si;B(2ibBq0ggZrk4n zzqGrE#+MX<yuUMq&N2n?UXZDO-6rvTb!gd$Ev{qGAN~77Hs7A$JI~XHtuzNPvh69l zD30KPa$9tp*{ymx#ct&}mHUZyo_~gPi5ra8$-6DP_{_C``0=W#Kbhyas94lz2t`)T zX=k_9#$9!-tK&@zpEx)fyz<unbthHo&-wm<nl5kM`~DOgcz;{8Vo^#}Gelr4*JrfR zzs-8M*dcUqD)Q=LG2J}@e=ISZcuReZv)NdG_m%s}9FKm(k^RCi736W85V#?-QGQ5D zWbX3`0fdqk*fQK)x?0;+c+2j{g{78Vi<C}*ET(3@FU$^5bhqPW_0Oy`FpG{Kq*GL# zh2IPi2cb2Wjr_6s%6=(3FeQ#5eZVqxp^J*Fjhf174deZ0S^G=9K`oW?`?WlrBklPf zX7q0SH*cm%j9rwjkr4mgfS1;VtlETv<wnwH+m6Ot^?cv_<ELkMKURh(%Np^-%0B=u zyldG>mf?^z(>9B$%jszg0OJkj#g{dEB`OO7S>8Y3v|(xHx)rR3X|td&(vVs6)T|nV zU7Sx;Tv^mGp?EmA{Mc*%&m7Zlb{Kt&O?$)XG2BJXG26HL4?IKPxMn|*eKh2eL9BMw zr_N$QsUh?nXaDJ)?17^Zs;udXQGV<H<VHTmnP|z=W57bg^Flx1KV~}RY2N9uxaB_z zaN^H1mw+b`Uq{b-bP!M0dA#+lWnmYRVNRR7cM1Vttw78?8QKEz>HV6>UTO0IpVtlL z1;eWwDebJ+fzl0FV7DVV|69V5O0@#AEh{)<0;B4mM=}X67S%$N17SyQtXE^mEI9nm z1$X4Ngv(cMjxmYeu;5C8Zb{8DD!y@5K;!6A@202}Tq>Q(&kWe$TbUQMw{4N)Ts{VT zoTi>2+khNJ1_ktchR<?y&pLS^c}3x3`KiWF=2PH9;mcRW$$!YN-$+Qe)mZ%cu3}+R zC%`&}$4HIQ^Y>Bf0TzI2nsjbR=qbJ1yA17kMab34=%9?e2f_6DATdN+A?l9T!DiCN zaZsTzn8jv~pF6ZRlgI@C@PF-c;pb=1)sw$N8{RAN*NMgFw_ErXU__ks!TZA`Dz9O8 z5QxphmYe!{cRr`2*(@r{#dOEnLc^6}X9auqP3T%pu?BvRE;P7t`<k&z$I`pyC=ZAl zbJeyQ;U=Q{9%&ERQB}raG5d*VEA-7)67c)0=LlCF<KK%yh7yL^PnUOvi+$q{R|qY% zY`FlBexn*<-)oRXXb#PcyhP~<iM&;TF|^AaWW>e4o8_^a)}>=8Zq0R-_Rl@@5vK6_ zT+39Fg@mcuM)s#XVhpTslD@d)0kMq~diiA)uUgEXjpm_y?0jJm@=-$Cqzd+qLhzjp zNO85ck~+RQg~I&`+ZY`1j?4SfZKh`IcG?cgC__f?!?K$5FLTbo6_mKB6A)VY>hO4N z6*C~FEq^BDY?j*aoVvbUZBwm<uc}1`IOyJfL04{Q<N0_>w`@b6!?$N^)f@hxTQ=RF z6P~!vUvuy&@ullr7DxqDRShk-b2<MSn|%W}moqU8rQATv576N@MeZ##mCueW>1zt( zuAUa3HV*l<^4xaC3A!m>6u*1t)$Vn=DSjNt)I<rah)7f39bC#yf6-)rFIISG%e@v% z;59WGCL)TeZcn~m$b)BFj_2)gQC*!zn`UtCs#^iane>IrIzJPh#wFo5<a>0|0LW7` z8xo4bKinl{^Tr&<-Wd_M#(0LCM3z>T`2!hNJ3LYni5pjxKO{MlNp0yLW3&4kly=Q< zdr*+TND&P4Y2RztjT+Z*WkWAZ!o)|W*xvOP=nH+w{k{Br!<z?@(am$1$TfPQ#VUfi zdE=zyWxV5tx_#qx*}Tfc$IXz_H2*;S#5!>wIRa|+85Xl4NNA7uH--mDSmdqd+F5x} z^F4*LvO&3oRF^!wiN(vJ;+)1s?D3iX$W!0H?sO~e<>|BRv!CC6XQ0T%`UUhe@=lf> zd~Jzd3CR<%zwq9=WM8GV@lUfenAxX|x?_R%i17SBIeR&F)X7mJLLhhgMb5>BomIa6 z&d@qW$77j^-*H=rnc4L_F!i;o`1`~B$H_mOBK{v={b!y1ALwVCXN~sdo)HhkFWRM? zJ&CJUF~uFzEudnt)J0f=YcO5iWH;a{VyFn+Fv&y{omdCfQqpfn73|il;T&KHt1Kb) z@m>mgW!)L%Nq~k`6bFuA0BrPa%Wm9u;-#XStNTm&A-z&}|3ahk{=cAALH9Gt`mFN= z{W_icZuWxopiDZmJxRW=yfM~_ZZmRWj%Py!0(2X;;@4s4C=I1KJdv0ak~Xd*gPLBB z-D`{l#EBD*9i1D39I^h{AwnJ?;$z3pl^+QtTh#5ign-vOsWWl=G0T^^6P@J})<&Oj zm{*equFC1w5a&ImU&2K7Pfm)jQrkiZ#ocKnrXCWg{{WiC2OZxIR_FM+geAb!%($}B zwVHBt-$N#0r$j&*?i(B6OtAG$58?{ad>`5xQ(KT7iMg9Mdz@fgj}o?W4(VHOs6kCo zX!@>?xtDYkFwm$(JNFzMyAYkl+`e)=Ve{qk!h#E>7=O~tL$O^G-aayVRhU=!|7=Cc ze9&Ulrs>1-H`3hW3taO?{rI|KPid;xTzLu`23H`#g?M52uCvS|M1r0fFgCcSQ%eqs zQ9VokAiPj^GIRP1QK+^0k+Ntu_qVu2h{v$JBX24MY(SyF_C;W&avqff4@IG-M^tMY z4;3f^axBL~vHM%Am#psd*FQbN9**uURYp9B{EsV_{y$q$b}$hv;uRRI*ErK*9`5DZ zgPT2GoRt)?n!RFq$Ou5G4ODCdQMCk7?khfMm6W%rqkfw@xD_QJh!a>wOIys?-AI0w zSO#~np1eysOV-iXXCrLnqN8@*X2#jb;*zhORs^@yzNPTHnRZC4Ba?6{-t{?N6E%fS z&$d9sXoN8v_^Or1PNRT=U$~I7i99k0&tn;RyO71x-3ToK_iLg3(WYLcE?@V|DedK) zw)#sPm>V)$`MVB3e#j!$ee7sH4A^hD$L+4QN-F$V;nwaN&(g5(-N~=dZpO}k#izrt zVNx{|30xcW1utWB^Y1zT&A`M-eP^)f`OYxyp^^RJQzgP?(=^Q1j{W!6S^9rm4?{Ql z)?*F?j2BE*crQetK)m~l2LhD?`H$BQqSrLeJ~c;N(EiS_nk8g6prI-Gogut(M&ISl zN=UeX#s%qFgD*dBbN*leQ14f9UT(#D&gElHn+#Ue9oIU}e_2Wiwgw4KvvrVjy@sek z)HJN$poxr95m1b{yeJ;L+6|WTFkv$a9kjjazP>;=A7Hv1RbX%Tb7YK*Dy>|2W0?e; z49?s?8T4WMaihPN%NY`f(>iiWzQgC?yuTi-BfQj~I-T5^yV-7~@P5DYlzE`<6EoOq z$Y1L9Bghh&CCTRU&6X*zx-qMGenFxZxVF~g*2@kKll%U95~Ju>Xy|M&i>=BG*sK~e zHi<{TV`zAQd8+|k3IW2CotG4OLy1?Ew;gKWz~Of~C(koKer~OBjNO8Ln9+EKW^;bU z_?NEv49AA%lG_qv@k{YeV$->@z}jlJ^5YfUGDM0~ef9I4c%O)y{{k0Xu<s3<O{<B8 zzJ<PN=bpV=8YL{<CM=zzztYe>K=Z6!_NTxwX0_=yFj2~nL_(j)qraZpLZj?E!^e<j zCT9NR<?GK2d7f?Qv_vE-k#K8<*{9wy1c`WSdtS7^^v`<D)&&sJV2NjZH`3D3ewFT< zf@;g6&`Is*ws(u9<TpO+2Z*-X(n)3uV!-98B=b2#SrY?80KmLQONu3@XQj`_z(~HG zlWHMBGN1>KNHS742U!~2GDlfh8Z#F*qrY|g%9Lr`R`<YV+dUr_&EjqtRAe%P2c9O@ zk`9QXkuD+nc2n5L1~QzUez;q~w8yji<MG`f6g`98%6thHB5}6VZox9{<gL<_%Ulu| z@iLbem|e&Q<ZK(8_BJ1URdO8wn-<rxA}_-EVqqkXg6CKc51a1X@T8^*POp&HWBMF_ zezm{`HW`*;ZKbwFva5ag#7VnBJ^%xfft!&Z{jC|tLlm1@^Ax-~EOnM99=KgoF{16= zH|g%Ttm8U;rXnyk7QdYtuFqG!k}unt`iNkLdt^1!k*Y^v-BeW(tDWrQfR5vV_|eR= z)1R_L3Z#prBm2P$zh2!B*34Dj;(5BMtnl{ePJLX&gFp?whV?;K#b%&Dn$xYFpH^J9 zLj|SAWD9q}Hg_+??Ob&=vEb;X6E5RZuv@8!BMlaI<Q8lfzGvK}aj&G+hFoZ!hs>?4 zR#w|(?NH9#h_GItO?ygqeOzMe+qen#(_(fEdCB3_oxH|XrAI@!p3ju>8}pZ-KwxE6 z@2VJ)n{TZN52iP^-{9rXN<!(`u}WiD4&j)(FpP;VJuj2tTvtM!#svj+^`;w*Z@zVZ zvQ77Fcfb$BH||_%_!)Zs^iRIV>%?oG&f}Z0YHs=GD`qR+(_gnavZYZ$;DP~>c?EF- z@44e4@@fg`cS&q3s&XaS%lTT~z`2$;_o*JpZ(hUVAY!)-%mb}0h56tyA-y;nrf8r# z?WxsRHmS~R8)pI4!U-ZLT{rU!F@u$Nr}kMtVwoGbIy-$Y=iCs6p7zNk7dc?T8i~fp zqlllIou~-CMm^_l)^cNGLBtJjry&#qWMz|4VhtX+6;&6IT!=71saqZ1ZDIB_jd#Q0 zYAg7Ddw+fbYUC{$f6_B7%^8wB7IA&t^89h7t#Acg8PoV@5}u1<8t_ZkEqI?m^Ok0I zd9Z6|YaRHgbsg7D=XA%7&0_rLve0yNuaTUIp?9iDj%u^tx{=+JR$ojhk8cx?B8_M> z6(*q+k@juvU=!zfd-aOyq`igndWG3VfQSFl+xWfa%?C%`!5VIDe)E90Uj4vpAS&Q_ zq*Eme)ZM1|)J&6Fs7jw-Qd}@-JR%kbA<1eQn5op4BX@>&Vgg-yT;3k>`$(T^)|bZE zUQ?RLpfIui(G2#n9JA%DXU7tqtRJ=4h9|f0)$0A^@pDj?Qp0e(Nr=sTgx^6tZ*ZTn zjxi)p;dpba9U?w0Tv=3JROY~M_oE{jG<x^PaxwN{!=ui0wK=*QS4$DE&BfTlNGnCP z6g~f8^yv%H$0X(flPL?9U%GanZ{uR-*MI%Ug>RenGEjf`@l8rcPN#`w$=72pHTN;+ zH`?ns#1i7%&l9@NNYq{>dm?Vx&eKofvR`dZhgJWWd>d`#M626l4DA+!w5#*MMis>R zFGeGA%b8KdSq@;Z1E1jUGqP_uE;`g}^WlW6pqccbF<hh|%Rwd+Ue?XWC*MQtj6W2y z8mtx`6WuMEVw$tR)2g^FQjdlGQ6Gf#yXKZf{<%ZSJyGKIvv=RT4qidXoxeRD{JN!p zvg6yA5Dn1+=my)s+#(<|_EE$Kfw^Bf`MKKJ+2h!S45uooRd0}=D_Nn`JpJO<egi}K z^2)SgSF~L3nBe{5UH0;L9fNO;*Zr6oy${NjFU?M1UShS_#$$Xi007M$BUAf1UYA%= z5KR<}ffxG*kLKr2e*Nu7JO8cxeB=KIf-mRK?8D0Fz9!Wp&C0{G;h3iHfugulU}Rgn zZX1u95;`I4$WN&HuRBo=mQW6m>XKE#eDEJWXn>tor9zZkYR<qd_gL6lw>fHMm7J&u zD&q^*Zqi!CZHt%NA$M=mk3_0+N^Tft{5a<==Vr4_SD>$N0<7ZF3ayKiqLxgS&ikTf zw}=6-M*%HyP+(19UflFnANlQTFdhmpuov(wMTuLyYA94WuDw^6lP+C}*OH{u4wSfg zXNanZ*^u*sP7eFBcpQ3<j&P{;N6!-r00mC&<>P~;l1eD|)HYIso(Fd!lcOVTwTM-F z8I$&+%bw!%+{z;tt_no29aB?QiWEa2zRS-G_$PxF^+I6!$011*55hnvE60B1#*D`l z2)>OcLicNm@6f+0{_{=J+J3})qWK1}waHDKuQwfl9F_?b`lvayS#bcc`X_`rPTCOC zzcC0xn>5APQea_phZA4vQ5kSE=v3&DNuL-7duQe{sgKx)F$_6;rB+)vZnChGdqqc0 z=U)~7=_WBSk1W`(-t}m}Of^~%!HX;JR9ay-a*hw9E%zl(WQWQXDq-yr<u}3o$E~y( zk=Y5#l<lZ5tPWjt=BV3dBWYbg-~N{Q;In)`Bdx3}NNVX9zW~(Ink}S9w5)`Ab2l_J z){Cakc33zSh`YI&9wDxFG0yQY^m;{-^_-o0w|C~qvWUwc?l|53n@By!^Rc6DVCsY` zb#coekXtAnP4XKO;}~2oOJogBbKCV-;M~rpb~hDw_r8YvwAwsewRQaUjI!oFDA8^j ze9ASV3b*L5_~;wi&n#i6&jJfBMP~U-RQa@7WB6U%LQDx--B4}6hVKjylwSO8j{avJ z|C@sb`u`3RZ#n7(d8}t_s3jVUN=*f-3*~HXj{kX{P6cKD14i<L3W^RRp;JMv?bbe% z;*RG)%;k%_3HPauf-t^nl;AkjXrt<$v!bN++<go%$jt&Vwd7VJc_bgcpM1d0^V>hO zk^eW>R(w57gSRx~jG3`E?ZiE@IiGcsmWpKT5ceOJSotsu!9Yh_RY%@s6zWavISVgc zkzaW_Q!ghfqdIr<`McGxVVbn&XNSSX@IC7icLEzFD=AeCv<4w2-eG<p2uIfs%+p>6 zT^xGpp@fXc1_vFt-_BO!PcpWvc)1uSvbz67E@?!UM7ojI<zWRS3~W^aphVKmki^^Z z*^N@w15-0#;^h2#P{{boNQ`pu-gv%ryCDAmtEt#FY0O{0GyFVH04M?4T;yi<O+3sT zf{JU#0!3>_oU`qP+mIeY318e@1p{=(Cxy_KG_J?avbLA2VkUC$l+MKf`BD!IJb>ZO z0mUuEgZYhM)`=<(WjB9N<jLY|lD*)<n{%HOPrF8J(EI9v9}nGiBA!W3EydxwGh6i# zaiRTIj+2TxpaNEeL}Hhv0;+v;VAoJH`C;{ZlvOrcWULv7_-Zw9-TseeQdfCVd3pTW zIt%K>zx56OwFuI-#zD66{Gz)k4R~UnZ(;E|<p<P_;k><v=lHt#*%h<Hp@fbm-j(#r zr$_2^UNyRl*}xZ)_?@BRL4FfU<1sjzT$9*OM-WYx9}J96)$vS58#i6Uvi_CK&(MyI z@#a^GtberQp?4{4wwwUK9ebMKM$(Kgd&HMH1W<y90;E$(MI_WD6NN^ZC=$nID=bz= zw%WjjtXDINr59pr%PAAx(NsEE(W=K0Nd-{R=FX{XJ$)}tasDB@I{1YVF#4};>wkMD z`eMqADRT0<#z(fjz*i@3YlE)wD=IvaU02*;v^-w@DmATOwT*}}q+)^1v31FH^zBbo z36h=Sp6*a_toKm%cZSjtY$uI-H_s(OzR0t-vuu9Az-A1EL08qqF5*$oHUmBlZYwPX zl>}7&kv5klp<~DuL~1I8ex67m2k%V?ndN1E#!Fghu6$fQOnBdN+pap@qBI?>pa1;$ zmi7bF<Du$N|Awa%N48-$b#}F*RfmKp5vkKIeOty^W+#)(dq8|xh*wpkQA1Td=d$xp zV^l`e;GY!X2PSK}9r)B)DciR55c4&Y?cxXOVYA_$KlO_~M{Id9eaw8Hm1aWfB_ldV zk*)Msq+~v6V7q<Y{%UMMDRziX0c7@Lsp)H0sslvc@au1rNS%fDKRVexzL@7=t?*M7 z(gG{PITBA(C>JvkLj2z0aA&xC)Tw4Bqco<>m?^;x;bFAwbzn1+**)%8PZvu6(&4kp zK2w}q-+gzx1!-@hUJA=;g4K1XN>5+w%ZRtQ(JaVI$#uUL<YsdD$^wN2=Y5;qazYor zJW>M!y!|}Ax?b+$Uys+|{LV0D*RlRgffMAn#pxz?Z1N>$IXag=uAnqF#l@)R+o#b% zUp6I!UbzL&>i~0-=CmtPFnyEA<4tJFyG;AGdn9Qvcqh@#QP~9wLig5;#m#uA$#q6Y z&&~@e$nQ>MH^Wds5oX>6!FuJ9hQ~sh<9Z^KwKM=4eM&G*@C?HYkBz*p4X9WtNNuQD zx1dJe;Axu>If!a8iFkQSB4!HsanM)S0S%pA9*&MF7+P+-1%YXq8BkgVwb3jFcJNh` zN{#pfmv;NBfu26k2Q0AS9C?0It1gD61hL}MK9y8$D;g*Zm9xv2kyGfs$oy*N<9<hD zLd5zX10_=${lFFIg@Y{LZ~exr4edPG;!t;vmYCono($ek^if)*iJw?#M9^Gc)qQR> zAeJSDDw!`9h(9=$La$_$WcZiFl!M>)kF_XvFV3eTes}7-Okl540f}=^jlFp_zM&?g z(F=)vJb~+lD<P9}upoT+#s5Lxdq*|3wR@wuw~B5>M5H&R7Xj%Vwgr$bCA3fkq$Ln) z=w&N{bfkCO0-+=Xq$DAsNtZ5!5FiAkcaYxk%Rc)Z=e*~;<9uVBGw!+fj&tW9D=TA- zRpwfAuDRy({0d<}@e8G^cso=MwbBeFeSTgwTQ6C`<Vf1ds)E8Bsh@hhW&7hN)vM^L zcAp5g34dk#A<NP)>k1-*l)Z!u>HKkb*MpYqY_<&XQn1{aJ3@+OagAy|o54#Wi{#Q- z;l<*9zo9`1Z7k9iFrnPKBkg81wyy1OGG#Ex{0L(YIVsxHEC~L3#(i{Rtr~9o2I})K zLjBo6DqJ_ai_>?u?Jkcw{n>QG9qi5xQqt<fus&TUj$<~(9E<@{qmvKMGnR>UZAVa^ zROh5!IkQr(giV*T>^~=NbYZ0$vg@NKnD?YvN~Xu81_}rWowVw={Q!ztl9j6DC98L# zPf?D4m`C7W{nld*OIR)mCf*t*Q{dDJxrrtDk~@(V_9SVSx{(QVaXTG=<g%XMBY&t> zunKf=$ii&8if)urz0QgL?D&A(yWczzRe9?LR86X5&#!dhqjc%uAy>Gb2eIeJBLsd1 zVRln7(>|kjr_be+Q&8($aY-^;!8q~$R2I}jqcab%C5Rxtcx^}{68fmwlBT~x{eIPZ zGilRI0Z0Q~WK&dLrKZjhTT_UzJGpSdw-%E<QseYH6?@H^(3o6=wbUysU^Cj%r@_(h zW>eSk5i%qSP+yAl&4)|)o>C9hCbd1VhCu-}`k|v>8NB|f47P0_#kSf$D?aDE<TbK4 zxNZ9@L*FQHt<*y@T6uf@$*2Ro3i)IFM5#WaLnyW)QU-EGh)1h&=^6kWbaO*@rY*V$ zEn^Boi2~q4Z4P%Hp(m$$)Kd#H!xj$Jg0I&P&qsW~XOV1%J-HW*%`_cE3B5Lj-g!UF zbyu-r!X@@_F(M#O#bg~c11}r>IM=8=kBG3MC$?H3ihKtYx*vkd2!#$RnU$L*@g<Tu z_99sN4BzMaUO!ZuN3%@P9@@Wm8@lS?k%^@XA#%odg#0%*P~Gnx<4NRgzv9U934gzI zT&A`DK`3EIWCJu;8XbS%_{+v^>)C52Ao7TOKCqsYtOAhmG0kxU<|oU3-k-#nBBi`V zDrJ^;hHeLR&T7(ZJHx6#-?@ECX+0F(@B@n2exligRSrCUNhrtOJL%K0`w!GU_81Q~ z$jqu<$LyOl$9igRa`2rm(Ovwc8t)#TG&{TGnj;4_a~9YlDLwb!%KwzSy08GjAT#8{ znn!=^{)^St)P_#`IWr#*#S?ng*?|w^1#0(defQX}S-i+i4Vq!?5c5t|=m26NTj39F z`omD_SEo;q>2ZEP#)8Byr<YVh?PW``GS*eenC;&73*{iNmw!oAmR)(kb`<6*VEx6} zq5gOtgfQJpV!8Dktj@oCLb``Ovlz$4TJ;KHB3Rh$GcCz%5UkE9VNOEMOJ;p4Kfi4A zDZ+0Rqi@oD`B?Jb9>D*$Mt#!UXM$cAN0T<1CnrKPM<|hfjByRcnZBtGM=H1J9cih# zrh%*VjT@3r`q;R(Gjfw!G3mo;%IfXDpq-=N;yv~hNm(>$xMwQ4Z(3Ob`PXnz&gsRP zN3OpCD%M}0F9f;s14oX|-1sHMG@s6)N%?rCxnSFzU>lkdn_7f25}B@X?DrA&lgg0B zadar=*q{3|Z}OWSQPcBhp5TUj!#=V{-KU9Kn{Y0yHrYGz`^=vQEH~c!`&q4tPRa>^ zAfndyKhHe^*e?t#H5d=wF<p;KTh};x*8jJ(>;G2U|J(om=kXLBb5`B*eKz7jOfa<+ zo=1bDmCcLy+!BT2pIAHO*rfQ4H(9qKphE5*n0AWlNCN?hUhJ|LZ1SLmWaWcRonnSC zQhuAkN)u*myQGg`p#oV^g1VV-UQK1=d~3P7Qs}Ak^q%eulfP<8{XgHbifa~N^n{Pe z`uVW>{cV6_dh_Ur7Vjo<O|UR?EW<oM!w7{0TN<T(S}?g)%rB~s%(qr}ParzUG&~qN zcj`rcV;7DOpE2dg86GGGwl26$Ak|&oMJZH$BtGyaYZIisZ?9E;XlS17od}bxjB3M2 zmLlL%2x5C}>upA!v<5k6U$@A9J;`tX)UK|SSntXu>B>EKW}ERyknBsQ_k_RxFv&3e zt&I&569VPGcMm?K0V0$>8sut&G2Pu97))^pV#I*p=?(Sy2X%6P&lUbY;xD-zKA%ff z#7{qXVvwo@2{r<BgL^9%H~YuUf%l(eyz1<iITR4QK!B~R4#AS6$@dagp@!J2yw&pE zDt%KkP~z5O24D5qAL-lCgCA{a+mh(m^S?H6-UPyB)!%ja+zcp9D7Ig;kV#JX@EVoK z((>x$>QrsOa2o*2M^c0!F{Pm>B!-gKGYBeHLhBzoZz%tLU03arPMax8a`dj}WSYoO z&`fOV+S-qrD1ir*?ch!1S^i>6t8lnt^7t{&MG8gRyG65AG%W3u%fG{bf;BmaqCe)Q znAErpD;`pO;=|7l!dZdJat@>&q2q^{+)n>;60WWk<UH&ZOO-uQM1^-rD8C2jIL1HA ztPs;z<pUh8S*Jt1aCC=J)GGoqE%XOB!BDJgwe`9j#8?7B5i<8#%2_FL4p*EH14>c! zpSvK&>b}Mb%hnc}?@i(8v(cfJrQE-r-Ttl;Whrd;?QFJm|84Wo-H!>@lkO5t?;Sc% z9*QP5`LwSBl_{36l^%v3n!m=J*M1Cbk;e)iy*>Z(>Jn>mX8<oK{%h4P`v5$iES=H+ zm>oJQDzUmaRoA?>z>NE`>(?Am5wXsffsUT}+`f7XU6k5@pIpknv`q==q3H8em6XDe zgQB5hx8UL$8)LsFk-@$;>Wy{A*|#K+fdftYajr*rn!6zvMP`G$X~~gYvQS8DJeI)2 z|FTPJ-vYSIRk*2MfnF1Cv#a*q%~CAPIrAN=98#9(B%z&6_ni&Ys!m0CI-tN+yi}JN zdn>pPDWAlZZ4K7C-Fc|K0OP5-H7>$maCh%l&&b^C1F;Q^NAM^mH)}k^4bvD05T&R& zgv@%;`J{{%7!x7EHQQy2?rZDItng^)ulumTD?QZNcQRHz-sr69(&<#iW-lCeBsuu? z1d+7^AWZEN1W0P<L9RMwPVofaw^(W=ha<f7U|s4R`8XAjf2h2Z-ffzd!15)5&7TPp zyBaqhTZ?(y?u=2^;4d33f%?Ejjgdi=FDX9ILYIDe+ZNXk|2O0MF?jh{cioNw%B-u& zN8AU)<|H*Cqi<p?#Y!-4vc8cZU)*IZUhA(9P{PSp8a${N)5=(uOi|#8VR>(AlxX`^ zG2io4^I<Y>Z7kjQLLJi3;5b&2K31?Q|L*XY9p}zSM&D)H^4c~V7GpXICiiaCco51v zt2VMqz6Bs9;~31q@O)9dFCdsnXfT}9b2&+s?neszhvjeJ;Yn^kXFXeGtN0_LpX9=v zcVfyIaIFNsWvrmu(Cgbg*P3N&CNp{_P8)|R5;)Rwl;<~0`izQCSw$xXo23lvu?-g; z2~Xzy=HC!I0~MwCLc3~Tej8Sn|8DxR!<YXpo>iPJjtEcCVMZ_^h=u&{RRYGle5^1l z8=hBN!c9q5adq!lGU>i@->skG=O3sj^r<BHY5?>N6$rW-#!B4&x?A99buvlhKUL`y zQ)f6Y6@F4RQ)?F#hN}as>*?oQha%L~OwX8uma=y~+ujjce;M>Dtc?-`$*~41hS*=| z1gO^?FY>+i5q+Bra>j`~3d>Q+idyPqRW-ZkSA@D}v-Eg^RX?v)N60Z#$n7~Ir__Kk zW-M*ii$1D}Nww7XSjDfJjA0VY2@Wm&Vw33q(yb^p&$?jF;9*+$t$xV09#SznLm}l7 z)9d6J;)<_upzc{nHbMbL$JERL)!4qXb)?0O29Elc7VdnJk1y=z2-BuB7FBKm!C_hF z{Q<$L07Vqkcf-7lNbzm_HI>6J>;@zx^etaFO>6qA2C<p=&R`_qyCQwa-6`s`tLkBF zdCb#&*m=evf-1E|kHzm)RFzf54x=JMbIVMx0zP&_UoV~{4X%pRp%LBHKo6hHr*<s# zCH2$pX&rx(P<^heXC*JYzE`0a%!=b-TO?cHd>TxaRgIPjvWrn1U~_Jt-0uxh?<vW* z48oyRFIENc^GvHnZK4+46aa9+1_PU!$~4yD>hMP2k*w)(EEZfxE=gfhjq1J!n*5DV zX9J~E$ejz&4nP^9T4Ou(`S+(z^M}75O!k1LfQ3Svhh$Oy*A%bn5}PE=Hm_B_kl^v~ zX6pPdJlFVmIQ;@ljH}XWr`ZB1O?iDG1zvvCXi1oQ+tXrVaBbJ|_)1@Y=z*lJzu;(w zT9*v(;ftPh3cXa5wtXx%xI%zkj4T4l>)3LgC76j>clBV+TJ#dRUQA)w^M6w1SZ;5h zU;d=Zmg!fK(MNHJdPE-h1NDnI_<b6K6Rf@J_cEL&SNjNmdfoxA)pw;FIf}9XZLh7r z-*^<)Dm(H*5_^qY^7ey8yn|9%MZ8ZpXry-;aqWGlaqla5Gy<c0y385i8Aqgy*~b%u z)l)5i=KRM~jvoC?Rycf|*U2VPI;r1$!N$)>^Fj4nBaq$gAF?a9pFPIQB)seq^B8rK z>||d<pN#&bX&tePiB3*IRBKViZ@EG2G|_arve^q>YWtGwFT385s^AZ<gW2Z3-CWS8 znTk=l3lJA_q~AUsIA#7eu^KECQlJ30z}h1TrEj!CGTWOwNuuni^qP+|#~Ft*JNeyV zY4KdY)IrTYn^?tqIEd>`ezB{~u@7{6j#nfYGpPI656F2j80MQ;RC0T-gh<RYMTFdL zr?@TB-M4}N<u#3;!M2F%cqwr^@yo2|xOXhlTT4BzLd(F+NgrM~pGgKexVf#aGAv8p zZjlK)gyL6;@Uq#BqDaRn)nIXoLif>V(1qC@annf=ipwcjI~Xy?G|t!Qe7|mXfBUzx zqIV(k7&;T{4q)Qj_Nn+YrkkcHDT*#Ma^pD}%P_3BE<Fp+e{t^9UZ519*H(^wJM3ec z^bO_Aie4+QTvSqA9PhOk5E_gNs#`P}wwg+)J!p0)IXrB9x(xgk;1<t<s&fbCImyc! z#D8+<JUmgHsu%_Gu4+PIA>!eu0?vbnAFHIrY3f<pbn-H(eVgOE$@%VCZh*MGkprNp z6~)jGzO>nr<{&MbH9WfRdYhlWQ%QCTWle|i2k3fi`k=5AlcVcVGq-GYJ|@W4odm{l z=BcUctdw328y>M8wBxD_jSo$Lg}2OJiV_jCtBa?95jp>@yb%yz7mELsnfW6$sb3~~ zN7<Hs;COsYO=U@`;9i(*!+OgtEGgV0a(X-D$d4S^uf}8F*}u2wJ`m{GAd)HA*D~r{ zFmU2ntB{l12<uB*%zzmhyoZ%k{G?i$2%a|he+<aYzOmNSKly|0kC2#!3ir*XTnFZa ztmz83RS_%Rd607rjpqg()M7?^{3PxEXlF{&U8H+qyt%0UWY~bzEYh1;j+xv%W*0Ln ze@-BUIIK*2@^SKc3b2t+)&;5p1qO1>y?=!`viue%`?5eTd2-9x)LyKZeL@RB=N_*! z<~0XFm@y6vsiL&UG6Zx&T-nZ%CxrzVjjt!6oO^?u)3C;6cs}Ch-M^w@|6Hz=__pu_ z9Q51>?0=tlHm|!~cH17b;lY<Ta`x=T<jdnjb+CyI`Bw#jh(Z0Dm>g7U+8Dx&sif(i z5$UXnRBjpdH?{ZgLkhjAk|@SWo~jG4=IIYP<VmcxCjlkm=C!QB%C<MBwqeUmZ=xe# zP4?X_s^>t0>jS!6&Erh(D$M)3>a0!n;-L(_Hq@3un=KI+w8{^&7CaU?)NPuZ8QK%P z|M=&N{_k4<&zo#qjBnJsvJTWf?c6Z^#pY{frU=Nd1d;yf)3SRL$_=1X^)!J$1&zXG zSkD1Nm6|4v)*I(M4<<?oy(Kab5;4BPkb$T%ed(*eap*`Id<a^U8Sw2295ywcC6piw z4h*+X7G76;q15-vPyGMzEF0G?sPe?nK2g8G)2;r!pXQ+bIglLZkdy`ms|loj{Vw(4 z7+*YwTNm-(TrLJq=lGF9aY8!AHFeGFVBPT`==QJy*pgjL-*hQ>D5i-;&wv4elk-YG zlXXF7lO!8_+#JEh>8qw1reN2_fGLsA#^))9>ZxCL<oyWE6g4!B{Vi)~{v@$01rF*Y z46tbCjx0vSS9FKYNHTg-F-R^hwG9<DiHl_ft*OcPGlN$zZ@3A$PSIuPNE2yt(lu|c zNx~()$J=O)-z9(0GB@?NtodpK!$@n?HK0V4KDm7p_Ftvhok?dI;yqRvPJI`wt@C2D z*|Ygj4=X#U!h6Xh*s%}aOF1T8A0GKoIcd;6UuD$coozAmpjLC+V!r3I7N~G@((Jv0 z;=BFG1-T~|^t7X-QcdN+XW5Q9O#EN+ylri_Zzo4-MQuzO3-)HsfppK9yUgbY_;&7l zS0tncJ_@tx@xR&qRX+Kt1-xI#`_1U(XR=FezQu59f^y!RUS)N{#i)~<k$n)P0;z8r z4nWrY0Qjgx^3gk#lo#=(+hw2|*zB7qfYB$}$&ei-4-{wbdzC}8!sQ+$w4*0XYc285 z^NzuwN(bhl0c*<|5~llmVAod&p>FI+<&Im-TK}PNpz+$|mZ}<WO0RNV>h?8FQPv0W zv=>ThdYOYURhqdO7G_GHvp1y%lm-5<B18{a%cXZ&_V?-ADLOdAqTJ1ixHap2=|^Ka zR|)T8FV&qcErH$G```3qEL_Y!YC=;;=YA_(_`aAa+nm0m_a>JRp|83;06BfYlJiG! zqmxfo14RkQqi)e!r#@&g<P(@BsPvxJZV&p2-`ZDXs71&0#8*pF5m7&TIxj@;9kD?Z zym;1^OuD9_(DDFn1IT`T630*ru<*az=E=AFKGCL*czo~9eU|~93UyaaIcze3SIl1{ zAp-G=s%;^goslbXXc4Ph%gpY~7@78US7AbC1I%{o+KtXYg+NzoZPOUE0|)1Xdb-it z2#LN1Rn_#nFx$$;eC^c5GOdv+mQ7JnJHc<PH+9~YfmM$?_BRJyDzgrUzrd^nt`Au~ zs(*_n>Z#=k#!JQqCgXl22uJuoo&AHVG#m!Dn&BD0;FO*gMIAy)-p{aC^g%To<q)+u zL$tj=2NrKdb!G<SR1X?~4)&i}9E`bYYE{O9&CqDmOl$4;O1Ng<wV~5{F76%!TY^xh zrTm8E#Fb9ZdKGu<At+FUCT~QqIIS*~`B*Sx$B^Fec<%)`zfU4JDfN9&7fQ>L7x{I( z9@;YUj7$og`F(>PYQ86kXLF#mF%64M%{lti@rpr#4^E#~1{MSIlg4p&k`VzDW^j}t zpBRi#s1j?8PKW*4GFhYXr2Cpof6aD*xNyt8otq5B>E1Odw_XU97Uh+lm}SoRL~;tw zt(AMDa2SfZ48mq6<hRjN*<c=fC-N^?yG*CRE!Rv(uajkQI=j?`6WxW&r=5bE3=v96 zT6v?0WpBOISF6Bu4H5%7MhFVQ)S!?c_O6xOVUP}-`igy^bpe!PxvP9)B$&<7&a2|F zdws*XqVT!Une6A3HBH^48tOQJ=6yq7e40D(tSM$XJuK+Wgqr$MUgO7wtF%hT?mYu_ zN!-P!!JAW>)~_0)0w168_4=8LWWUaB=fw3?pw3R10@HMX7jnV%fpR+XAr&F8GB~ar z^A!F5CXVgEe2N{gR)j;z@%e<lQR=X9+D-CYQPz<iSK#d*<Ead!dAl_2Pg8Rb$o;{4 z@HdsIu-1ggEVoEQ{f?!14pB?)q3Jtkizi#&A7L<r%v@lBc>&dYNk#nRu}b#+&a9w4 zldSQ>5o<RmVp^n;QN|}n!MQSkO`qt=c2NEs*9TNoa|Xp`<vg-Snh=NTfKE9hb4Jl< z_eSXAOGE#=yFoK{_E`4Rr8GUhwUoqa*<D>gGy2FKv|~f6D0M%aC|b{v@b%GMT#RCW z?(77NDC!yxtv|K;VW61m@Aj^6%7YkCQFJQ5r>&Ywl<*}=(sEQ;j$ytk2FBVH70iSY znQXPs_9f@aM?1`PA!EmW^_F>?9Y^_m0)Lb8sQ!P51kj#XqL?q-aB3$i{-lD~SukQI zvor*1WVWo@ssr`u^5%CeOa+oP19}vS6tZrjtLztm<BK@Z1gP9rhe4mTxq%~r4WtPG z2C%UdgC>NNpW8u*L@UZ!r%XMsb`OW@-&t0-8!^ww%pNm$8r1yNj4wOefm-6jlL3X) zn0M(JzS}&S9ESVqh?2M4R>BFr(>b8Y1bQtsVsm?ec)di|GRGv(TXw}-8<7a2OQ%%> zC^vm_F^G%CZ}UFD8e6hpNJ;FWVI}|x7InkC<@4Nx0hQu<p)XT5>EF`v9$dPUB{?No z2(vV-o|FWGv%VL-0{D4{0mu>}DJIJh7w|Re_B_wz#1y0_&Nm0GF*$}YjVVk(Tew4T zlmPO?Uw-gllI2+G@Z}%h58r&RjH&%IKq{jBl{7zRKG5{>;R?k%aY%ts7+sPz=;T!1 zrwGsft9-N>-w0FEnnQHEvJu7S#q^<O-sP3>Mj3#V63=TNjj!W1X3sb?Mdg-W;IpmX zzlGs$0d>XJEge!<#;2LwoSE_IE_)Bsi+U~d64AsIcd??_;QoarAfXUbM$U^<5A`}z z4b5PxZyZkF;p;^6s7gq~qDwh~`uoYl$H4tAWNuJ{OV_+0Tt*FT-fqTJR+5|fgIIP! z-C@g6=X$Q|+4s(rlH7hw=$|O8@6A1O$wv_i&SXIeEymVgN3(NWu+Jx)t)YIac+_DC zXYQ91(O)G#*SLMUEzTALyfyJ-C-A!VE<pap*Lo`)_(ozoFCiz*LORPTKJrintE2oI z#RX;az`xDIuBrz3mi>N9JLImXEuBL|fEDkY$5g!j^~F9}A&eXt>rV@2u;GtJLHH5X zfUI0YJ*#5lw8c|fjh&{>!HkiNec4~NNL4S$4U8)#?lUDh>p3XblH7F5IH(>#S6#sj z@63u_nyrF8AYU!6e*u5Nor92GaE^z&PT0pDvAe8S?0BHlu=<<5WJ|xXrgU7(1`%`A zvZ6nQwPAYiYX+b=7Ol7yI(aAL82kERG*c8lwyUJ2;hB7SJD%%yNvVmk=;z9?+dfcu z|0RJ|PDv%MZEKK1ZO{}?weQ2Yr_NUg^SG={$((P=FOvNA*oK}<XE(Jg5wxCfc;=_$ zDEfLM=*!rAAIQ*^^@LhIMMy|;p}9)DA<`zNw7}E$*wshPTdhkRQJOyknLOLOy}!7L zoSsYKJ+-Y2x|g_CG?layx3;?MPeM1Jw{uRCw*+?$idVFi;7R{(w_vb;eNm4pg^{-f zSNZyrin+P6z(2GByxlMHkK<7&jyMXX?%e(q7f3$btZI4OjmA(|e5tF7l=GBQ2YuZa z><Thg{1%eiN+HGb$#ygCsl08s_V(ea@n=XRk8AHHB_}6^Coa%^d-R=L-6yd`n+*2N zWh2RECqYuytu;3{wKw=>y)4JpV(m9HyapaIRj60MW3o#zgPT#fee(cY^yk|GuHb@C zR^&cUnuOTjosLZn=?cI^y6o$sY3it)w^{b6$BO=>7aA&BKqXh5a-9YdZPRoZ4?=6Y zu)GA}t8S<O`KTjp=aMxjjNtA2cQ;4=?C*P!S@3_X>3@7jKhhou?1SnleCmRmyB;a> z-Qs}}`37q=pd+!k4xh%V--4qJ6g_xY$Ht^Kd44R>n%RX`u0!4RUT<v!4Z<(-jzf98 zH&5LM?myQ(%oDRKFN}fn`$Q|c1<6>2FJi79_w=xT%xr9Jbw0dAIc93x%k!H>N_IT3 zmQPLr`!HWmVfHyHdt5V?hRZ0c$@H(RYPoEuD~4FM0O|{4q6;QGX!Ly5jivJ1w`l*} zqi_Ak1GYN-FSeIwe&U7gZ5KL!IFWQ5pua6`@%;hLGYXd*@Qw-Dv%$o7@3`5Bj*f1$ zFCyL$>nBwuQs6Ta+7veDgtlo@T9vSG{@PlsE9N;tDr0rOQJ;|_;|Z_vQY-R*8t+U| z**@uMocGu@Hr@%pJuZGgWZqR;_Ojq0=ZZ6)xUx{6Fh1e=WtXOi-GDQ!lgUg&qPjLa zoBHMhRNbpNf?Maj^DP7<s|3>Tto*Irsl$4(JUcenYHKGr`BEa(T6yctk2sU{TJ`UK z0sHu0ZT|mpqxg@z87N%6%CK|iCskHxfV492#-ZV@;u8@#lwCtFt&%)wkgUEQS~OrK z^KMIHvB(d}ZlF^aRo&h<q9wiU2|Gadxmp_K?dSV=55z9NCg=`j2zj+@AffmH)%2c$ zr(dY<(tLtLGqzg2Y3%AzmmGC6W2PhV-nu+0-S#yVHm<1Hah&Xnr~Rma)?ku?cBf%8 zIv^V92p522NbaMHdQd}C6upFr-|U>daD1toatW@;Gd1ztb^T^fqPXk1wkG@V<fW3; zB6H&Xb>6%@G@mYBZ*5~&pEI@A!1i^Lo#l{|{@Nt*&X|`yV@dwHkPdkIqIH9FuHntO z_f9J~;{26)71O83r&9EBxzbZ`f*iyG>qNd!hEF4XJeF!r@an#L0ApP}V+|BTIOBZL zI~-*gphs~12`(9vZPaV9+|va}<E>=~Qo4YAMY5QojJn11LBj%LX6EB1x<{mL^%^jH zE3AOtR2NuGK=@KRx7U3-bVn*0V{J*SN!vt%Z70h2)js+1M}41;tN!y??OpqKUs=`! z9n(j^LPD<ZvJ^rc$DJb-zvSc{O&OZ~`ui`hb~#7{J)^gg<MLbFaO@d`ufxHW<>Y(- zKuW6CX@Y#~iSMJ;B#v~P`%tr9clUFUXi!o4g#>j5fRWDP{<K6;WwGp~Ze9LM`=M)J z(j7vFi6Z`9Qz>#-qlMh+nxs(MGc}cT=6pI(l|wg!znINzMoO&Ps#1N(I@XDB9P2VX z#vQ+oV2F#I6IYkWZ;&wtWmPV52hxt@se3tiFqwG%q<XiH*NATKCq|Vl^@8CEwb7NJ zUT#7~sj*7B89jylSWm3>`>@uE|4EhHpm<Afb?f)KUbMb`MJ)57baNxge5jH!4zzgI zVXnKF#m=dW8~f}6KNQdmJ-Ao1jzl+29tMrfE>}}eFm!&r=EW{MTSYC>=4pHLzTWyy z{P59<JQg5rEHl|Yw>2G2gy%Q~Di@YVXUEU04d>7%B#Iwv!bDfxX^OeGQW~W08_Ig! z2ZK8L7Xf`H!%}Iwi^#kVH#3nD|0h?m^j#==b>2}k-35T@8GTJ3VQX0&g6Y6fB2{O? zFhZ$^ha;rwOhzT^GSa#)eFxkY3x+#o;WNBrvU^pbrT(%jyK3@h0_7$0nnh0B+|Ji* z_i8H5Xqp+DGu2q#U3d2w6{%OsL+^i2npD&|>E{XFaM*Acp<s|`cOXr+v<Bj1e?_<c zwOqX^pJdwaNE_0fu<_QeqUHT;K$vlBSM@QM_{@&U9>=y(K+|QPlCsUV|8g+VP0U^a z%qY5;$pdkjX;I1)8S)#fdW7B@!ldcxRq8MH)(+W}AzDZ9`nLO4lyi!2`~$FmTjR;) z=YgM8SGB@7b2@QKE0IatqaiMK9fvAI_p08$6g57}pR;Wh`bni&J|19wkutB=V$e$C z6nDx6?r@{8l>O_1J1GPJv$nrj(BZk|8Hp&LPOnp3h>${+DP<$Yvkai!<CgD%FN*G8 zu<ou~sFI}&#gt6V1R&Iane>bEyfAWw51L>N(H6HCE(gg~q{mus!yL!le8Y9*#EzuH z!jn~bAV~II^v3h&udnJ_-R5B&_WYLIU&zhF!UwuNU&I6C9f)9zw$L_@b4oCz7^K3K zL~ACEqB5MEeDc?`?@}3)@DdYjw3eP`ao&^jDg!d-MVA(zI8SwM_Bu;wZkwAKxOL0e zZ!XX;-C?gqynAHa*1TS^J>gEyuY<WTvaV%|id?~SmGy7j&wKZ1O8lxqpeU`xy`6sF z3f&5SE;Rku6ZxL&l(5vh2x^ycxCmcpEH5mB>^_Q1L;ixqt-Ee4HvNXB$wPMyF-(}W z%BIwfgBDMI$sS;MR({9&#@o6+u@4m&_cd6QEG_)AHc`krZ3-SF<D1-2VdN-9D`kci z$g_IVE3^><dG4a@!~|Mh)qA^oa1u5&FWU`fN^4WbE)dqV7ewr|7vs|*J38BY%nJ+F zhTA1%bwT<n^&~szi6eB&#=3mJl!3$fRzb|0LyJ_s*I~u6wG*1&k~~COn;^96%$?~D z!z}^*O;!KtKWYC<dod3F64MXe`bo8)5tQfSf2$vBfIa?6g;)FI?24#L!ukbW8s8Ox zy4{j&PUD2?o^OC&qkyz`OE0&7$;`(=EG6w;xOCGEZ|2~;Ejm9b%zLwEtlSziPH0js zIpL_o3g9tiN^Em=r@%x<t^Qn7H&}sE_nc*y5b#lgU8;r?A=XjU{GEe6-|Vi&7Qj`r z0*`tyVQnF6D~v0KMz!KNyxK#T*xlwYD@HfuXk~nw{I;G%S*Q+z?oi7$Ga8!r@Zail z*f~a9#7RUaG?|zSDWsIGsSCJDyV^g5A2Mk+7l*Q8ExO!~hR+<mtFlhD!@Liz;PaQ0 zla{N*3W;NX^W}<M9qBY5q-XY0VB@V->Dd_`Cark8Gu}~DZ=Gf4m4i~4!sprz>d8M3 zZ{;~L+t%Fi|NZ$;Fnv!+^^kR^?S^d&i};#<#f2l6e~dp!#2;T3)S|RKN}C^8{`KO5 zI8-)errUhgJ-*M(Qzs_d_)$x)auuPr##4C7f*n{o4Dqtk5sdMkA<|V?@ow?3I_p$9 zN~nOb=_ydQd&2{tyhYusB&>C+el*!d)Iho3e`oHO<x8jw7ZFf;kfuz3)nOv2*V}#S z-RM+G^e3Gu<pA7Pz9_V}0=7n>wBGzoC7-=|W3TAonlE-{Vp>hC*pxKob-2_0f`BAX zh)8YLatU!gRA32hTL1Q;4YkLD?dtUx#|&z6=eu6q`@>BvD)0Vb<Ehh5x4Pa_5>4H* z*W{MUT24&S>jeMnqgs{EK6L1mO{PH>53kXhZ`csrwt>Meyol+R!y{^|->)nS(Txs) zJi#L|3;j#&<1BlFJWl5sE%87<RfxxfEDDHU#G|uQ{LO->xk^am9pQDB{%UDhl_5?R zXLLsuAnk_BEdO1N>!nzUl5vJjivO)2NTupp%9r_0?MLOOa}jKhH>w`QeUX**9!fS3 zZXyUho>U;Yge1FKMf$&l!a%D<WiK@1fco<}gx|6L#)+Bo-NxoBPpDIN9a0)SYG3v_ zNe*!C^hqVPPcLRJJ=$3U%k++h(~D?s+6yHCgLT|t>H0^%jWso``CZevVAIbVX&ejB z@LqP=17{CNiZSgqu*Y=DEI>#;4=WEJnHB=COjPj5N<*HHS?|Y(X`h~D^>9!4t-`y` zD$pbd5>n=CfWOx3-zb*1x|ifd5}#mh?j6EvDn&cE9VA*P#2PG2@HUGwcQZt2b?~M+ zZcQnC^h-c)m|iX-C{d-En(O<WxWf81i51cw&j&#R`3|gHdB7(eH0fc{D-LY8B>S^~ zS=NhAE5~71$ztDkx5Gj?i(HRSF_%%DnsJY-!NgZh?lh%%>ZE%d&qLW&rCjvV8!<N5 z9%3JB3J-2I1!q+xE+&{=TXehh9x!jjg({?<Ybn}AcjB;M0CG4Ep58P~0=t+g1@9+8 z;X&J;7?`r!OR?Y=tJ69=MZ#pPO=l`u*v#?E(3knfnk;wvB%3jnX3-bW%=vS7%t_Y4 z*p`aVM5xFt;BjN7e&vlPzMJ2~eHm36<vboRE00@nwpK!0yiEg5z2o9zr8wh_uCT~T z?39sy<$|by5=MTUjS0?D=6*-z+SJp(Q<V$As_&v3znx!SGF8N5ROi)Xs?o<&alxk5 zd)H6&Ma65xaf!p)+kzwKna?{$FyzoC!dkj04D8>88aB@F-83);aOEy)#l@GGR8ARG zeL=CA>DkJ-9i*mlN(Q_Y%TWT=Kv;30StS5uvG!eM6W=#$kyU6W$&v&`!CWmzisP%c z0{(UQ|8HFR|2PhG^k1`k{Xx}M?wOf87axX1Xy=Znxl(^fOuY@KNHOy%cL$IDCB-~A z#6*!|p57d@dwh;!s&vle0f|sTw^JAo(KE%yJyOFX^fI%!^}-rP-(sDJ_`V84sGW-0 z{G`hKe~(1RzPxr2fg5iUJK2e=@d(CXyllN*KbqtV%6POm%@qA&DIxdM^HkFVGYhvc zlACtgWkRT{BUszo60gb%^}25`@hozDaH>17@Pa)d3h&_SIvdwvbAqWaQK?2P;LP~n z>S!vp9$gQ=+L<yYThq~W9$L$n(lBGR&!~SO0uXDQEfyklna%WuRNn~*9PC#Ldfrd< z%b!+XFHQusW}>fmozRSaz7_UHcd+uLLzA|NKQYm2oHUr+<*TYw<gF@SKj<Xdlqhv2 zrKe@V=~o#(8D-RJcX!vk>u%w-vqb=|BU=)-j)dNW5$Y6GR+V>w7A{+fjj7#|A#off zc3<nKbY8BpTdcpEY98Qss&zB9<q5t%z)%MNI>*c#d=fkzUY-jlH({&+OiyHfX}YlR z&FGsKe{%WeOzu%9jF)xC*=|J_4{=yQ8>#xU0Uhjq+bCO6klk{DRVVV;bds;GIwIU- zdLJdE!-SEde_DS8`P9ZM#zh5EtCk*G>2@>E%7CrW-O3$Au#6KhQ3nIIvX`UN8IXBu z%-;ul&Dy0Y+4NehS+CcffE8&t_^fcyh{cwlzTf9qo)PhNyZ-eJA@Jy$!a7R~(Pds& z!YayISxR>^Uc=s^&h7P~#_)@vg~wYYUKINnri>DAAO$xc8-hz2+0a41zfzII?eJ8Q zb_HUC;cC!Tv8U~#zqA=h%;(~~sa-*~K=5)>gK^jN>*Hxg^1d=ERt`0qvir?|0rajG zYW2QsDQ7CE??VoPiahBo@qV1O*2R9uB9S)hiKzE5-cyQZ)4Jwx5*DNQdgm6xTP#Oj zPrxmozsUb)NexKA#qA4~Y4=FN;-TIroPTMTyLw2(<+FpE<9E+(#_Id89hwQGbvR9Z zHUrz<A6cYFbnR8sGS7(sJ%Ua}GI=Jn!=}Hi6ZI<}%;(*j<zfrSP8c7g1QIT5qoR9@ zvnJdVc14rK=U+EG6E?u*m;sb??R0xo^)rny<0*#|Km>WSEVPX3H``Mn4$nbm(<~g! z@4ug-bC0Cl*e6r+vO+2?TUQ`)Igp7<!WG3`AT}{a!&?!bZdxW1Bs`u|hhCe23IRb} zccD=$c5Rn&?5=I6v7Yl@&f_x=_ni(2i85O>JxoCjP&+mo4ST<?xG(Lm@Rpx)1p@u} z2RkKsGi}aD583V=u32cNy>9Sa^(eks;8tK6Bz1a}g5{^(cqTGf9d^%~%gO%HrZ*x) zdo#gGXDqs=2BYj757bRka|f9=G<V-XH&4pL;z&WhcV<AUTB~5(v-K@~k^ENF$j&)! z_nw7vr~d}LS5lH*2lLcDg7nQBr?qf*cOxUgvyHUn^}5hZdW#U`PxU>iNIhYo^;AhY zEj2yKvnSCp#YdC3E3YDdOhEJo(YST))>mm<9gG1|pc(sB8acWNV{i{`sns5NV;#on zNneo7^dzBuC{g%;WpS_}f>2Ac)DMpgYPWNLByKkF{n%v62<Y(W>4uV1_w$)Y1?;m^ zeWNCCaKsngWjV296o~XMi_P)+@YzI;krqR@O73nwBWGXhkZpbeDXp$R&M!V+tpLLI z6Jv7n7in%%e$0d74+z@xkBpthhF&&7PS5UpU-V^Ou?;Iwk)1vL)0d)jS(sHkkg?uz z`VrEE?CM7be{({s;UsRWaT;A0)dHk@ymsRZX>HHC$xzi?F5|(otd#j^m~-XnDUS~j z<P%rr!BWd{bVcFUuQWXP?pI#H0pw)vB8$L_Bp7VZ9CIRFB*$31llVl6mbXVMjZsfz zB(JE?y(VU4@Y}ux71bTJgZ=UNgCxyCzoABdu(s~nRVWEG){)-SK7h=cI~}Nfo??d1 zv}!uBbtD3{r&B@~g(jvpVF9erYG2K8HU2TSy>yCA=i;}ctI$fEwx>8(K<ro1hksU2 zZS^rVV`hA;3onhGsx2p{Vi^j>EF3A~vPvjeIoVwZx?dW$af}`7AgcVNig4h_>YWPU zF!>AO_*ePwPt9FQr+aXSPz?k#Vl7q$By_j5Nn+J<H(LAkt%Gx>VVUL$md`}oMcl<3 zI&i&y{$L=oPcL@cqQN^m0cfIb{85^y&ZcxiWZRvfh<_GHdFO}}W)CT@^(rf(0GR2L z(4SP&Q<1;_OJ)AC_&-u~|4z(Nak{G}e{6?&bXHk}6!g<hhkqiSz1|m}oYXv@4?LHf zxU%2a6&}+5lS<_o(065CRi<Ce)uljb$=Lfbb7G)EvQp1X2akOX;>)XgRl{n>S%)-3 z6Sr4Kymm1{?76+el<@*C|HJG@BijWrn6G|hBu~eSqwS7l9bcSzzEshVL)U8co-7Pg zwK;-W$sZgYle1cD!z~W*fGyh3@Kt%(+I;M0xBB5s)6U8IU0x}^5)q)Q-n)b?h3AM` zRvwsiOA{HFq7jfvG#Y6E8i-ds_0iW%usow$?dd-LZ9T+Rbo8!dc5yMyz4%u{x<(rQ zH@XhQ1asBT@#ZHUc8L`^$gxsTbw=Sx=A%?h25?<-UpXM5-Rl#@f^;K$o{4U=B%^f| zf&MYJMe&7k71c3EOg^KN(Le%7E4e<Ay-uzzGSgXw4YE$*8ao&5z&zIB<1jIKHIGl9 zF`s=2-f%_pcv+}r5v_;NAa|vH8MZ-D#$~k-Hz$I@KfBs@NUK&K%oI7lt3ZFOst&rn zWp`sA*<76!)iU%->UQ^opu)_O)PR*o-Yk9T5Zs#Snt;wDSg);PX0X7a;g5)?KYYeF z+jVX7IwsrgcGy`*<aK<k7OP@9XT|M4kGWF9k`0(jLyC}DtqQ27BnO@}*l6)xBIj8= z4K4T@1d%Da%C0h5s9His)LCJz_SB_~0mk2ZrLv<7woi@jdBGRhg`>2e#MW#)#O&v; z6q7%NqzX<r<DeBL5op<RGrg=HTx38l)B`;_W>`2j0feXTV~E=;`m<gpF4OGuV2t-; zGx3#JL9BGYA;52SM8>KxXO}<`IBI~vS7WkEC}G*>>b}bt^AlQrQ*+XMS@7&8J!W`G z-n@KlDee9KuH)E}oI-v-UA!r<R2cT}NWCTD|HkRn4g0@Rdary6eAZ3l*f*%M*(|*! zkANL?&A0P@K99K{!m5^p_((G<t91kM&guc4x1)4YCN17(VYDdlx(kBbfSs`Ms|0`+ ztcu_<Uhu5S>=J+N+JYnjUO(IWM+V%d_jl*4r4PHAYTSwh=9TBq(p?f;3F3Kp{=9cx zD;FLN0iA`VtWH^H5JG|V&BvFdl^lt*nt=>evYbmP8@LQEdsIq%eKg;kOKXBR8LtX~ z0DTD}|0QuUVRZ^NOVe?;)^`X0$$)MVZ|vs%p1*T9OjrLg*34yn)2MU6+eKbCC7yBT zWxR$k&9v(W*-iDu&mT5KYhrl>fZ~(iMe(56YD`e9gL7D@pJrHaj|77rKs{D&@F45B ziE;-!R8`jWrB}Zq3T3+T+Ic+Bp$v_zEgujbbfbe>vIt+`pWD2B&SYF#s?8|AD26&t zgp6sK&~qoHTVv%!)=DVeQ--?6Y@eDF@BH<0D$gt${*f1?Wy^WUwf$z<tFHS{maF4L zNay`}rm{zd>3|IA4=Sp?JL}<R-&GyM>FUhRCidwzGWVraKQgI(S4#LvrEF)L-;_Kv z{yg+s?Kyd@XVtl5N-2l^+nA-9{R<W6KLn?PrTTL;%4%J2M^WESXtoQnKpd|9IVU!i z;EM+}6jxRIZKfIRLr@?A%V3*Bi=Ebz`lLA}?H|h#rklhzLHHOO4S)iycG}{v$1trG z+S@Pl&;ux+nDpvUyq-+Qu*~yI>$%#u0jjK?_*<W(69C3VOTt)hp+SC}dsp2sJ&T^= zUb>WtzL#!)*Hr${e#A+2>YCsbPpMyO>@y&Eg2pv|p@D8mKEmbQ>(2%XLP@hZajcG9 zAi*zo@kX6%bvZ5*jzjlQ2qocM9qYpFAL1)sI}C;OjxpV5yvNWWq)?kqkkLgvhg=CF zRYTmAyrG}m0tg(~&@&D<?I1`ouH|A%gqvi+wHNq_o9%9<(HMugrkl_0>Y(P9B2CiI zjTtNl;i9uE(Y=Bg)@&kOMjdFF#gL&hBxEHyVS$C#*hX6P+ARUGC^>=Lg>3rhLwydp zH{Fx#dDU<CjBgd@f9=u$^6(Q-OqT2PSbVV|3<RgJgEzUHA*sWYa^ux)ITA;k7T8!+ zWUZ43TqqX<@0wkYGo5o*+yWU|2i0}-0}F9W+_A!0muek}Y;@7{avA{pSVRfI3|wi? zZy(D&@HGeivAk5Vyi}oA240fCN2kKJUy$bD|1e-M$9q_$N1&uer{GE91%m*OMR~6L zK}d0$BWh=&Qy1y*E?XR`l*nMeMhe}Bs7YN$>d8mX%|yxooDSq&@qSRq06ilD{<v<P zRM<qYLb0Y>m&gw5k&IQW)QW-ymXh#{@zIqr*l&PkT?0M3-a&w#(p(O@Q;L)WN-9tH zlK*FlGDVW)pCIFGEe>1`uD099;c?Kl<DkGW^gjmTzkeQR^_})Q2s$pFb2;qM*ee?_ zb?k-7$|Ma1CN97Gn7MVj-L~a7Lz?w(m{B2P?0jgyj#v9Ap8$PqEFis$y^`ApEX%cF z7H)%1CEG&YiwchACdRX?u9P{ltj$sCAv61zzs_@==fO`ZbEltFZ+Tk|2kgll`%k-% z)>Ne*&joWX$C$MWGL~Nq?udV<m~ZEsY$%Ie_IQ1qDg7Q*tA0U?nv=arWc%wV_A}v# z+3+3NmVwbeO-t-t{e`va{X8Oqvgw-sg<v<+dL~&=K}29L3zE2e6&Ro1+hY`O*mOE> z6G9xo73DHKYhoyW4S}Icq2e`t>%a|U8tjanT93*7aIFZ>B^-RlpVMF{5|jh@LM234 zMc7N-Bg@I}WIl!zW%WPH4nVlhT)RfV#<^wcZJAcQo|?`v<DOLQVcwr42W0{$XXhA! zB;dvOO`@qa#UO13KiJe<(AGHxR;g;GnPEZhNjqkr#z_Y@?l(V+UGw!?hQm{gw4L?> z-+4cJq>mA78gz%D$50!;ppOfb6yi?riWPa^=r$CeT64p5LkNp$dVp8EmxabyCn*8P zI%KfrfP;@a=R^Msg=-sCO{9t6@eSLFK(+XMnN#6|nYr6){sBJ_@$6pRfuc!Wrb}Ax zVY0gOZVye2d8^Z#mE!`mUqik-0t$5$FkJaXxoLXLCg4}0r7QkU{jxR<Yd+O;mdbWa zpB2((WD^`7ejh&LXR%^mSeH#In*fl8=bg4Ut8MR`ZETZlHVLJUAbNx6q|52eoy)Ik zU7tnIuSs06G#)bjzL#0iLM2;UQXh5V*vI}JJSV@=N0Gshz0TXtH)JQtVr8mA7!&91 z5)%qg0E=sO?9ur|V+~Mj;>~Z4Py3g~XGAU@Rz~G%k9r#_n0C%J&$+i?uGJr~X(@F$ zu({EIaa<08&&J?03$F_gjySA(t$M=dkgR<VFn-ODUMsF5>H)7Ut{?}iM1Ndya>sY< zX8VT7tziX5El~}_l#^Ri&k_Z@G{*Ez*MR}}?2pWn>|sJMI0;ZpL8AT!P`{_~eS64I zzj8`@HCd)eg5yFjJKar8U0>_T+6A~oLcVccA+1?rO4@PPz;40Y%~5a#gAcr=al5Js zRCX|zIUbogOwGj0et*Ah=PLTnuXyTTZ1kVf-JZ$rox7#mF$40hzWMs|=a;=&UFG5K z8804JZvr$>M`f^#!#8E8tXnrB(Njbc`L04sl3jpx!^hWVE?xp@8?!(MI<|==je!!C z_<1bj@31;;J+wQ=FFEoDm3cNxOoCdMs)dyd-fbOEcYde3qSp+y*hB|uSm}Qcz6JR> zucmw3X-jw45H(g<adoiYubC@@FaB$(0SkpLb7!p8>wuylCKj1Oe`w)YR}GqG;-zHZ zXzf*$CB(|CpM>&X3NG9;4CvBRsFt72TGPEWRdJPujuAU}(L5C%{JR5NsDb|J&)%o3 znr)kwD=}t%0((b5%d500Dv!S_8Z3q-h_k!(6dvB`&0kw+ciM8#re|FeN(ARE0NZ0F zHpCO09|rBZ+wDvVvkFUG9Wy;GLjdxQjIjfUmYflPnoxh+K4nzc+qoPJXR<t}d9x}X zww6!ZvTlHK?p3~h=Lz&X!Qx2sj`kj#hijwPUi0mPqWQ$-QDE@x_h`~X)V9cseeJGc z>L!~J(n6!+NFcpAG~LWX8_A}Wh6YWiIZb9<`>4V;^hV?jR|iex@y;Zb4|O(I3-7AZ z4izO<fXlezLE%4_V_@4Kuxa0inD#YPVeqAfsvL8vfETz@_k+~LZs=fNf_Hj;OvS8H zMQ`m3MgJ5u#?KZQdTLE>a4mFLIxtfzj5&7rmdT_h6}{Pyq`7r(@H!{|9aVy;-7VHG zz6AIT0D#K#G08@w)WH*g`-OrelK%mCJEebFp+-{kkH21q|IOt;Z>G)Fz>(q3V}W)t zZ;Jh*GjVTs(OrL(;9V!Jyoo_0W6Pl{hQ%YMV;G~pMjek*{|0Sq|2%!p2I)zxNf(k7 zw37+q#;uTM1}S<^{SAQ~qE;o?%B&$p;ocC%IzsI<oH9XHj!)0}tKMoq3I7`6{huk5 z#$3K47+?4snB^<;Ly=#TpMP!D>%_r`vMJG-PIV!v)Qlu(CV)DA$|irG68WbHG4A#2 zb}X|EoH3~G`_!&NXuYcnE*RvLb2hy7tT6%@Gxo7O(-`sm?;{dBkCxfnCkwSEo-d>J z+-!xN21K@S3${I?CaG9z1|&`+(UQ!Jlhbun*|r#D_QaP1Or67mnW$xMQBiqzmpd0x z&|<3P%5iOhPa6HHMGgvjzWAPtrM;>B-HpZ}>Zvh9L?4>p{#`_z_l4Bw(((^V;kB>X z>H#cQfr5h_ZiS3wb#W6_=Woq%)Hmf18uz;{I!=J2K<-{&zi}ckg0*`ubhVuC2X^AZ zHS5{Zhi?-hx*nW%uV3#3DlnUT`v4)&t7o_dWti8PS?g@x`MNh$N@NO3St&gaThzbl zXAw>2jd~J4^sMQCF|bOqD;iEN0lsm(`RAgGLUFFVA%lC9%tVtLY(?>juXvN<dxm=A zN`ddnF!22~QZDVQUEA~+(0jUG(1qhytC>4_gz>q%HJr6?!6FIv$9EoAYH{5??7Lqh zV|JrezM-Qi>i}<zbuo_%SxM0BA*+1$Wjt=3J=7?gls`Ql^or8AoQrqjCRi}JOyy?i zppxU#;*voTU9>rmBF1QQ3m0q3#Zo|)4DX#+p!@5Zd`|I64^A3nU=B5)MO|O|3q*uK z<m8U+^<_8HWQPjNe)G<4@BK7u<bWf5Y~5|IS+rTD)!|X?dz@-`)Je-#uZlo-KzGGZ zk^+W>?aR7I(d@#H0q6WzMyG3<<H6Yasf4!*^vqhYj3)~b7F-OJ{JOuX0&Y?8PgjWC ze)rr@D)yj|4&Q!lIYBbJZBpl<ABO--!;Hhk9YETb&4h^Tjf$9?CvHkit=z_e9LY{w zp{84^DiQT(Komemc~aWP^Hq?OZ!3XA1Z8Snw6DLukkK<b!4C*?ppMw?$5<`y1dX_E zBJdANuwGH1e5eQ=TN)xrM9pQV{gB{0ok&;BKny7Qu=;{ZgxqlYYF8~iA1Z$~h+H|c zoN3c%1dD_lcTvsoe@Gj2KJrLwwwW5@?MUmo7yAaM^y;;0HDr~=F%37R$c+(j2LP0Q zX?sAKyl$1}a~u;0Z9Fg9cLiQ;lS7@}=J$Im^BqR@J!Uu3>dycXS-?CYq`YPGjT})h zt39&H)ik4qLY`>GScki(eO9POsL%~&9CHqI9@@0_V}pC(a~?%AHLZd4m>+JLzkFzx z*yIID<|nkGt~canM;a2E5Z%a!KGc4u3q<wj+s%D%yGcCyYnx4Q$xWsjPb+`XQH5!? zhgCJmQ0}&logQ6Tec6@F$I?!NNO&vUO$?T><?bz9hwBr6y0Bf-hy1M_xe~sAi1P|S zH^we2hebd$f+c;r#z=8=mG#ZqapuU1vW5h=x`E-t@mRg{HaJ3Vu>z)IH}5CvVt)3& z*n1D4CbxIrAGdqkP!SR7uoVI60@B-7Dbl5c9#E>3Bti%stVjo?w}8?~2uMjnfPhNx zQbK?bdT1f^-n`lSo^$56@16hL`JcJx%(=fgYnYICl3~4Ty^D9P^}OHb^SwSZpF&h| zeiRXiy$&h8?*vAs4gO$n;4m9Q#yQA*h@a*|aqa>*Jm5}@q`P(KoJRD_+8tJW7orRi z1@wO&myK80RyQaUD`@7Cm8p=sT7tdPQ)!_GKH!!YYp1aG4e1`g5d`R4ocrd5{o*bN zH>qIEQ+7|@vo7c~X;}B5r^*Y~91Ucv2h6Itj?``1+pg);3S0e<av0z{3cDP(gX{LG zsxvyu^0cODQ(<UsD%p{Hb;*h&{3^%yF9n?hGc&-GY@frWsyrp|ACOY07A440#IZeg zEy<fr*21HAdMhq>OCOyC<+$5zef;RRZ^q8ixiJo~2W-Boejq|!{rsVM(kFM@vw0TG zvJg{lDkA%rH8)4)pA1fa%rPs5UgT1KpO=?Uk#1*i7b}t}6xKgG`qs0Ke+O7@SDO96 z!&O?hbbfco*je-i>>Zt$acfC}rV^cWr2H1oUagUuJ!YFR?myf$Zr+UaK(C`b&iW+z z-fPfpQL@+j>}g=tjowMd%aZOl8{5=*gT+w3V{#E#1OM8?49C0chZNpJeFN)JtD@k} zfiwxWIBGEeRigh}E{6>jM%K13^>)&od!=!0UeDjZcu@+ftAtanwJLO!EGpsE)d?jT zh3@bzu?h|?W1NV>tG^Zl{~4GPcA}Kw9oKt%5q7a9fArNS2e@PHLCf+s*E^<Y6=*TT zBZzg}yh&|!EyiY=6cQ9PRDd;gIl1{_KN_Y%1y<c?wcYR~1O<&6D_4<HJrrYLBt#ts z5mT9qOJ8@lFzgF0-m5>lJdF6OLI3*le<qbMob4$ZklFV^?W3uZiKDNN`nHu{dS-_m z**yNqkOfhHfAqUrYFgh~+RKGv&xx>?mr`&3WZ05_iSGkv6GQ0ZUMMVQgZPudRY~z6 zD5AWuEb1pitonk=qxuk+TK&!PEZc+@d6y^~OU2d=8dt0b@yUVt)1M4H9kx!_0vejz zvj~|%8^jmHd%*X$W080B=8ymu^Hdv<cqR2D<mduEO~rVFvE{wYt9tb!-Tne8rO;F9 z%(P%xwo+4<Rkrgka5qXxT{-JCb+|AS;8Ug1+}+)xKH<MGlNuJRI4yvZ|5U`N;Nj0H z)*~-rz}n+O#@kXj6Aew-ggae|Ni5kmGTB~`Kisaq3l{G_5O44N?!^7E*HSJr!%*-+ zUAnMUYPQOIo;I@c?-ZsiH}93;<E`PvNrz=ws~G|?%TY;ySTj1y68<vxY+Ky<s8w;r zVELQujLEiW`MdOx_E?dKl#)G<rVPQ^Uf>-XXnen=Q>?#Zvc;a*_-35%N3g~Vk-dvG z+9l9;*rh0ULRtm_0nPN+laZ=ZAl8{_EZipmt%t1hMEt$|66!2cxsdlKNKugCgV3j^ z*!&(8>%;S`uRyTf2hVEq0}<tx;~w0OuxnsAv6yZ&PsIWJ=neqcOEt)u#y2X4FSyRO z{ABp0)LV(`H;6Ezv~czIj+Mc<;q96TVk6zK5J!jD``Vy2>&$Gh+OrKT>#4fybp{iI zV=nk$=Vh!`C#avtpw0_x9>wpZ1(m@d3K7eQk^#=M(+W$f8*8&UM^io}RQYW{9oK6$ z!L0rJrrVH;@G`d?uHV*YveD-Y&#(Oc=eR^H<iBmArAA8+@HqI#z<<<#n$nmP8xCGp zl-M}{$Hb?ZYxng?8IF-vy6n0h;|z5Q2o*y9rE_Q=V4!${VWujdZ~E|eAk|Oa|D}4< zwNz$}R*T~0l6{`FslI!#B9(nqQGhWb#jxAY&7mjXY2zq6|4{o}_sH<#3h_)PK$Mx5 z(kyM>Yh_pT9$uDc*mlvRxD-x&6iP6c=s{qc4;;~A+ZJrXQF%TM)l!PD{vF82^BuwS z^H-~<Tv_Sv+H#1F$++cltL_*Vb&sL6_65bvWfD)=(|b`!2Xew_s4k^S^v3!S8sTm? zZEbwRtacnD4hUVbE(-2TQ1+e%deL13{2slri#vbK7i`(*2aBRm5QdxK*@GsV`;0hc z(HRFNfjI<IY0#w(o1pc}G6xE+C0a5VY;GURn@BXOBbQ=E_5Dz%?>;RKL&)#Hly8#$ z7M|;>OxOVgGd{^^`GbB<&X`JS=S?eYCp4(8s862lopp;}@l=o8G)ZM5O88HTp)%YF z^l#1c4F6=<`x@MN%KyB4uWFHhRC3WJL`~x5S3j;(|L={;LHvzhB91=09@LdLgz)yg z%e-{NMvG6RyRU{u(7kq^ww)0Ae=_u`zdPb>NH<p_G;Z+tQP~ERQ-X&nXALNMWy4Hf zE}YR!-&Z3$phEt;x-;%qgT(v~hiNHo<BtyP#pPm$>Gy~ua;j-%a)GdYYxehY7j>3# zEiY4hhMFK63NH@TpYc*Dh>?{q)kI>xY!AYX10_5>tPz5@hbWbP`rR+>XXB&PZmyHU zZY+_{|3E);`$obdfgQOxM8>K<g+*g91)w#GP!2tv9#kS~`TRDO@(AloxDD+!^i0Z> zOZK=%xx?#fbH=5N$6?IxQsRr@Jt=GI6-+8FH3iQqX;HJZ_bNA4yVYu7AM!npFEk>) z^6Ztb6X!R_)T8ihvH&nLse3T&yQZ<hi9l4YNEFynO8IWn^h|LS6dg`1OlzJ&kQRX) zpK4xB3G_%6>_~A7H8*P->r>>x-TM9EShH52Q7pk0mqZs*_gJN4-GyTt{8HNIvdO*J zP!inqRv+f_K$VP9&<%r3o4Xkx$6L3?5Xh)D$NghdAImQudaLLvxuqgqVjaoeuipN} z`M2DbFXXk?nO=|hH@yhb8j1ET8I=Vn_5jE@GYyXkytjK@V12F!4hV4Opzy``?7|0Z z1qSxE=TmW=jvK60fNC+#)IbU=a<`B!pr@HK^W;PS#^ES#{D+__U-AEm!@;~f8uNKA zZ3F*7Up969SdyvJUtw7NEam7_B-;_cY{b?$>gpOzUOiq5q=j{Bi#xQ`SI&WYxb_yj zDFLga1WF2dbaykd1l=)?GY_B=SpAi(-MUVra~dfp@6Z25O*<3Ou0G7sI29>*Qe}zN z4!Krwau^?bSs}X(Hv?GL{SEOFTCcY+puPZ5W@2otv~}HE+P_uW|MC&dKlTl*^(*~9 zh8;V(yl;POP`(9|?jJ7mFH^TL3KNoDrhj&(%@EJ6kT~C`5B|fW-cY~_m0o704S`#5 zk1D77|74IL0ARvGS2+9c4*}*{P0QiE8dADrB%6uH0&Baz1L&u#o0d`T*@eDFjRzxZ zrsZG<`NETnxEAK#)lAN_s&=4@;sr>rVj6SZ$oM>klD=Z_jQ#u7j*dWkJr4^mMwUu> z{(@bT;(;Z-0ZcWXRje`?mR=D_55TAQs<14McR1jKyi{vOR)qQQoeQ5Ma%|_^+jeQ1 zeR=zy|4C%A+&k3|2QK$cEDR*fW9`t%k;&1C@mAGYf)C<*zJO0vw*V&IJyaip;W7{; z@*8C1r3QadwYd%hNotNy!S{W1i%@dA*QvY<S3Da8#o}F;IgaE$uywTi!${yd3aC)9 zr&-P-SQM>0zKb>1E#+CJNd9`?NL0ZheVy+XNEJcPs7jrx0b@ZN`PAr{>m!C-uexVh z*sBFEIt_~_&;0Oo6pp<AJVQiNK~v5LM>jNDrR~0J(%Im9vLtb9%9h_{z{cTuH_PLy zS;_`U)iPkzlW21*+WviGZ10V*u+}Mxd3M{dG1~<2t=#e$Y6vYVUhaIB0#1eV?+*?b zF_K2uIHmFZiL<0s`Iz3#U-twJ-p{RmcDj8#`Mo1YtWq;<_c!lrOBEKCn1;MPc_2s> zKwaAn7m|Ldp<Yy`leKWL$(_9{5T&~k)5qVtdG}Zu=Ei>4+Q4axsW8W~ry$D>*usH% zae8zumnwmZG)cngAxW@Dc_%V~cfGm_;-FQ~6M=d~S9F1Ip%8O;ulA;-^Av7KOh5R3 z%b>x8W2}_8X*su4l2r@2#mvg}rfn)-PrSVE%*AD+A8hY{dU8o@zi(Obpg-XRerc7H zqb;=AX0TlC@=kdYQP_K~d%Aj9CZV;jp=}nlS(^W`BB|EEQxo00=1xAh^scIq>Cx5e zK8W<L-K(jPFPPBnzC6JDPWjgL?C?(C-+rG^)ip8YZ7umN-tn43y;yVQ#hM^9PT=pS z+a`Hfu(+m(C6{Rl_Hif=%>J8~zD?pa4l_HOvXmryD=^P9g+BJteW9{?_#pGffV3CK zufH~5uB_-;1HQ|G4sRQC0kk4eCpTZOLoVPsB+k8{e(-M-_O_*d2(BP=p3M2gRi)0w zImbJt&7ToJ7Z&L_dc#mTe#ZY~6DO$rGH{<#z|-i)jf#-yM_kP;oO#`E_&G$fn$4tq zXkp8zYww)!VH)O0mGC;aqiDTG(uSfRVn3}-IqjA`^;_6D!rQn82-=lH?MQWOMIhy~ zOhd$cEK6V+b)4<OTw?GRC!BDgT?vO`eO88*qd?tK7B>a6hQ!o#5@r;u0V5MSTC~-` zp60+^+d3_3fmzn?8JO^i+RR^INLb2w)Wpi=BlntbUY54zC-K#jj+>eMGL_5;`ph{! z6faK*)9d7poZDeoWuFPzqI8>j)GnRZQad&Bhr<F}iU*^_@;TM|>e=VG-==fn_#H<p zMJH>Ke4n6n$uoUO5<UPFInns8D2%>ktMhYpe)JZ2SqZoXzI3ZQ?g8{6)Na0ha2|7# zHmWQtLi8T6;#KB*FF3FLd)Vvf<cxQ({YPC#%N&&sX70*q;-4UY^_bjr8~(A@&cFbj zjpdQ^ab?AUy33rY<K>?EE2m!i4$vTn^V0C9xqD&(!#u$)8<EuZ8htjNb_bhsD|B$6 zj;<cr&$pK{>}yef)pdKcKWmXRE<{%L5GAp%ntr9Nv9tppHUSN%H|}xpx-lhAao9ZX z`9Ku-=Doxb4AkNAZf#+Xfn8lKM&R$xlgbRYo9uQJmZWk65#N?CT$#iMh?a~kMS8Y6 z@_4n09bNs#+f&nHHQSwU+)3y{H#8gSAa86`gWcS3%Hl)`=2&2e1STb1x`wovv(6ID zg*93Oxphdq6#wW3Z!DL$6_ir1@u^LdGf4LE#IQ+4#`k=Fsz4|7rMFRX9^9UIaK}#8 zyH2^>uw|eYGx;1g2?x@9<cZa(=v+`Hy+K{8x7PfxKBPLKV^;Yt4@2&^@iwbDa%5R0 zKgHz^Sk@vR31}KW3wEqS)t*u_J*>@t<Ul9i1hN$WWZ-~;MZD$I0ze_@wQo})s^O~9 zk$v~F@;DQ84Vfgrxe7j$R#*&<jNQFEfe>pMxXNDpg5X1!jFgOD=VkF?v3VgA9T*+S z`39oUzSEi(o*vdRzpIgSxfOg;IuB4ytuqPLV{iSk&t}My(4JbMgpKt8U90T!01*eM zt5=vS5A7GlONQ#=fo9&^jW1;8_&B$Zhm*d&SadrUZ^%e#adp7HQ^sAc;teXFgSw9X z0>ZAebRha}JspdZbGG?V8(Hr0YH^?LI}S~T?kpphxHl5x6s%L`#sin05Qa(PCM(2> zQ<aq2x7lr*C5vH0n4xqfs7q6Lla$5BPFn;<oI_F%g}ZNS1)gtFz48h%w}SI?@>l=S z8yrz)BpfOnSD0KM8>B#=W>q>%(o&)5vTbA1|!Ie)G<#;~}}6W$xXs65?1bx!mAS z@xuR7q!d!6dZmfc6Jbk6a}ixKXwh<<Mkarh<24J*`P6(kM$+O1f~;#}Lt9_1#INpn zfN)-EQIa-Iq(UKULV7Ng)=jRn>)i#k9%B~9I$dL<Va9;YA~9sS!n(V$;bds~Uj5+p zzf2*|{2czbVEsR-9-Bebh!|hwLhBZS@tO6W9p&fhRpXfG1kUl^>#%^@gqwd=_7n1f zTE52&uM`P3U;hxA+z-IwKRQ-Q=7F~^S$-?no0c?Anl6WB91qe1r;OExUcPZ<JmO1= zgq(-4C;gsVVsx1*AO6dJ>jen>*X0M!-l|?7L~>(A1vo5vENePo$JBQsrJl$jN!>AF ztupt-p%krlFH7rnG)4J2e6a6e$hyv83>t^TUM;&``M-~czlO(|?zrL;Q~#|2(t}P< z8tUHnpyy7^2|e4PvCaZo2fia+)&kBEpWw{k1J9S2B7G>L^R8@Ks5E&x$(PL^X&xus z^sLMQ>^?ZOyO6oHmsUnDBq;Wt4k<GKNPShe?BPsX{SxvZ4R4yJg2q$HpoqE4Su!7o zlu}@FC520mb(mONMTI`hcC%|XX_+@TFkW|xc9zJEx20R1OVDl%vfJ>u!%q%&wu;d7 zoN(U;gn7vCuKzNuwb*|$Am{1QfSjHmBNoG`{SvjZa>lz3-t^DUHH=N-CTxzc7j2dB z#J^D=m0&vB4!%xYGWxt1tg**O7bZMYf5ZQBw}++NjW3stj_<YDD5z@kRc*YU^M=D) z@adnGoH=$AnNTu6ld&uAT{U3nkUpM_0Xl%0-=<~N?#bfyBq}(o-<yw_kJ<Z0!je{2 z=_=WjOxB4iUy2MTrZ}od&8;j-&Tp$so>HYYVXWdpxo@E<lMN#z`NQ0i5WN1;sT=On zt3PY{*YZoz_{b95kWdUaJyS&QP+_gEbcB@c)e3D;$ov9{X*lotxVW~mN`GSkx;z?5 z5i6i@<Gd#%toMuhMe4jPJ3J(e1(#@IGwXXG)Aucd1A~<!am4acfigm;M`ntv=i2+l zDM)_!=iO5;Kla+UQzmeggYbAfmbbkEUlWrpQzE!2$_#;_(w#ZHr7CNC%}q$FK=$$M zX6t^@euL_&ofJb-jeS3%-$>XYKo3a!$&fR#sX}Ttl|e!aP|jw_IzEZO-&m|z6D!Qj zb&t$+%#tvvg}Lrl)+2wunA3rG1JxyECa13$w%oR3PI*K_#RI$McAtiBom`zH34IP7 z9#CK4>YHw8XDXPNIhyA?SmslEK}tMex}wNmrYI2Qcn=qITC;0EC)FL+HUD8#t^1xz z-Y>BEaji+mq2o-k0?olyb2y>^B)WwzS(A^O5b=TVj9V_LiQR7yIc3y#Qwt~JT{1*) z+K(Jo9F_=CTZJ%0g#k;>5J85^J5*!}a!E?%^0Xk=yBa++yXI#&{o*ng;cOFvZ;@hb z-ECZ27xr3(2BhGYQZhQf?b2;~`$-h2R{n$JZB#C>(<H^5XzlKTwbxYku&Hy?9h_Jl z-1VSZupYA1s^Jd0!Yxp(_7=IqIIMcbfcdWT*a9iXU0u^=*JLsd|M@N=XarX@-83{K zX`G##sa_mMitF86%y?=|Pxp;3HAD}sED+jf*5`Qhd-UTBhR7RFZuU7@-HFzNc<+{4 z6T5Dc@nWm;1;o(R-TOzJ`$8-3Q_keGxspfEzH>WInDXR{qHl^e8?adLYgkhxz2(G= z&020ASRV$Kku$1rQhd$+t+Q;pUeSfZZ4Qfb_inlos=}ktGZO(G-2|i-9!B8kv94Z; za_bUtRMYMNCC^tbhS(HJU5@t!)n{vs=zE+eZd|vzAComuT^p%Y>HN#EmLXUV(}kp1 z=GG>!0`*o6t7+;9UVAH>Gfh!(_77gDfz}h>r|gs<GUadIqZ_e1ZEK0ZpO@9ThGeN& znEMdGv@TX>nKAz>%`Y$d8<)fm^wZIuJI+$FgDPk`|3eh5sISqwyz1U+%4%xxV$GE; zgv~HF2z$e^oqW_`sm8sg@4i?%8&|u0N&M6z`RQnqZA|E+xE>cPiCc-ypAq?1YB8P& z`4&<2`~4oKfVMZ&DC@~3?KpcUA$D&67jNLQO)E|_#Z{eJd`#eMJ;t!ymBDf?&fak} z`fk*!1;DSYrB=}fy*wy&M2GjB`C-fW)sX3d^&Fzy+yiGu1=ihPK+21bW?K=G=}!a< z(bm<2SquH3XTyWVOu8#n?pX+sSJlaML<S4;I%a`eyYmRw*rr!Lmz+{*X9@S<i&$|U z1jn)kEU%e3dvXW>cpl=tQKEhuwO@Rt%r?_R@@(iB*_Exf5Yo&}mnkw-4vKpADS#sv zXN0;X&&Go(W2=!Zdk7chOP*#Cr=;i4N90#UMEVX7cZm7jjzb550yut;wmPRvYy#dG zDgYIhQEF*`5^q6~wUR=Fd(2YSbgki^YDov7sb|u~!lm{CQO}g)oIYNEBD0==G6`an zxp=SV`GIALpa&`N>d51Y7rFE-W>JU8NgEH{0kleUx1m?Vl_MeV47`#zN8Ed|y<CxQ z4_snLf^*Bo3o|qw_e_PRtNGOhcV(4d%JZ3a83ZR<;4PXb`TdTEO??xtJ;L>d&VBnm zDz;g}@x{leqH^QP^7Cbr=bqF0_<cb}#&oMI=|w^K)8AmK{Gq`c%8$2C=Nj3dv5m2( z#i*syrN}8xS3WQBqa3@^=6t>3tpknw&RzEJW>VTPfS@}9t1i)XrZ~CmXW(Y!m;PM| zVrXV{TlW&YYRo7Crztm|o}KY@+gov~nMNKwisc4=+dY*(%&oSoDig|C%6i>Wvm4^@ zWiz4A)@WvZz>hx^6b0m^2&{dGz|Dw@n+%Z;V09*Wk1gvo56cLAG6-Lz=S}0eNH4me z?^=ab`I9qxtGT0>+ibJTGs+8GDpCW>ulO4%EVx6J@4fada9G%~4cy&GH@ufQOdLzD ztf39~K4T^nOgzh<tM7`+&lOYN9)C7-&r+uaKtzrjy(L24-tiMksk@n1T=cR$-Mjb# zyT17)Hn!H>v<Hr9;~Jiqf4yUBmaf_K@KKePnuv&O#?6tpTFl)xg;B!vEcgsxlQEN| zf-4%`-3!VT7urW$>Yp@xH_%CY4{J-Tn|uw91^oiAj`EtLT3s%ePlsIZv5?gSWHxKa z)nYrGtZu{>13eVlw}FpU&9gZ#6c@OG0!Uck7+So!2e`nAptGY&I$4cIPe4kqc8q%~ z)#SD%W`{M;zP;~D<?B5l;GPY<3v0Ex`-WG!J4Eq)`38@7ZR{{&<;0O%k2(@~o@Z%p zXo3QbnZB(ED@tl5aFP*@L`a76QsGWl71BWtTD>i#DN%JIcE=?k{;Pz`!_B-v&)-xt zy!SNbKS<6xVq3Lhs^|4?&l6-+Dvm(kPvgC<luLtmCd8A+@`&!OxV&^ml1-;qnu<|3 zq#vmPlj&L9YKrF%BpQLCNG$j2r|skII0a(+anp|cmLyBc6r0raogXbl=!PZaIFuo$ zOa1d_%hDjpPOESDW@(`^Fb4C$iI$f&uy+^hvTQ)l8#Q>TO{Ys2q*KJUT7NRw9S5X? zW`q$ik0lSwi7uK62~tUgR35p7q>fqxLAzu_5}0m2K0pN*1i4v<c9cK)$?(VjA5k)K zlm2MIJMOagC6*5g?{A&S>U#9msfOmY@^L)+!h+c5^TRJbD4tfJM-n#{TRBG^4S_f8 zfXX5GRsQ&1fo&tcdfUkvs{X7O`(>VE&FFD-2L0yjUSWrqLfY%y?_DCR(ASwlug34S zykL7LxBuX675HRXoTya*m11FSHO0Uyq{b$`X!sTIODBXR91Fw*mj^EI&EhUCi>p!G z3@HsPaB(TWz_Hz3V&kaY<VcZgBQ=NRkR^?Cx$k^a9cHl$7RZ~Km;(VR8BTty$_}#s zL^~3OXatiUnwsrZK#iK-mwe~_RDU=Ie<1HbGJPuGD;n{&qJhO?xzJRkYqoZh+oVM7 z<PM)*>+O!x#NYkH$^;6Ap1%zzjzpQE1!Fldkd?C|)RmyAmlch#><fTr%p9uGhX<aa zAIiq9>tgWCQgpscIW(cdB{D<o*$l<ZI<gFhKoZM=xMTj9tGr9#d)o_`w8czIYkref zUXhHFDh*1O2E`B!>m6HlZzf3TJKr$Yys_CygG*&BT+4VHUn61EAb-{T@FROKSNUgW z>2MS2)REj|_l_(^*Gg0HH60~HuIFGw*Y(Q7;!0o_(r8L0<Vd{+J<}<<C?R<uas5R@ zM21V9pLG97AZBOWKt`1rAd}QnD(BNXCemzOmL9QYdu~Sbo$Z~WHa9YeC)b_C3{Y3G zjjzC}f`uRkP~q6bo6Chz>xI0vyx4Y6<zTl^*v^$c(hM%UsNG>#uyj`K>PA-PzJ7)h zrlAe)IbJF2T(OV5b*EIPXZ^=syB*CeArHq0Lc1UWO=hFx?f5oEi(Cy~P<iZRSTto# zT_Pf|;Y}ojgUbYOkD{rjOp*scalG6-9S4MI=<TZi>d*YChU?9u_(caXQhH<=bQtGd zOa^o=c=nEV%9$EMZ!~MQj4;iV&Hd}T_^;o8B&O~pwLa<U+E;6v=WO=RmW-S~_VnP( z-s0)Is4hv~nG74JHDbT7`85R9fxpl5eXMYp57@-a*H@C0yONwImu31~jw?sAdJHB^ zD4pJ2CdEZf1B2!-w>|M|LjQSa6NVe;xy!r*+mOJho-K9b85Ufs9<MtkHZR~}>4uqc z<Ggx~4n8GKYdlbCL7ZKy-LWs{@#7hJQ8RX>XrI$xjxr}bw0%aKP4mUP0fv?t{7zek zyT>I}S*ktHsit_Z6P5;_pA3R%L$3P!a^G5aLreQ|6H{BZE(3Ss9Vhs$2}1ht0&C07 z+upZk{Lmlb{4<zlv+v~j-OZ<Gc!D!(MX_`Wy0e)?VKG9sgmk6mMZn*#!ru;9X;imi zJDGPiwJOFl1)|v6m^B;z7c~3Q^?5_@NVpZ)%cHnG_O&`IAKxAFsznf@2&@_}Y6EQW zsg)q;mU^Pt8h?A6IoL@a4KE7b+QUm{@6a9-ia;F(hrHW$7KKC(r_?b?&rU^;_H;om zp#)q;-)g3B3}sjicDC$e4#0xZK=#{`!tMeD41ienG=|O-BpzspS4l`Rca1OkS{FGf zSYt~JClG#hW{*4ncIy8@2mi%2l*E4v%lva{C>iMK%Ed1qgpbZIl`9`U1(Egvz0YxM zqj%uzaTBwL<(@t5;(=R6F0^-!x6AlHIt`1V1SIn=-qkrI+uU(HqSge!hP}LQcq>E@ zs}|zzWv=-8Qb}3JU{d(uBbCXiM-gPJ;pn2m;Z`0^k>RVWM$i2t(CaINAQ1Z3JDyR{ zJK4GI1-wO&w7@deRC(PNiP~nm?P&WLQhO9X_)J3kO$c<etwBq$R?e<yGF%t-lOeyO zKU&2hI-I)#_FBhotSt4_2&cXOqXt)J6|{to+hcNoY-A18Juaw$#Z6$S4i_>!P(rfl zK=hAvh88KT=?7XlvbY3=x_R3BJm^ndUihZ=!_Q)|dzKa|Q<EbWXcu_954N7Y_%=_H z(Dx?f(`tEt+HNDqxKWC#kcQQ20}J_@kMkjJ-Kd&}a45q|oK=q8Y|CGaRwaH9%Do!X zXrXp-_ib&XmgCs5tCyPPHk{eDcHii4RR!6{tO|AUCgzIm*<W0ZP?A2e-4`0Wx_rVB z@38@=s}cr$G_$GGs{QA+?2$RY9z7u2=Sls`=@~{;k%NV5e_!m{fllQ-S4M8TsFt_- zu~6c5`fmo6zuVK`;Rr1YW}%&jg~qg@_j_l8E0&c0yGj40u2R^UUcA6W4ErNiTcNJZ zDjh}}+ogJ5#)7@-!G&u2^U~jw-l8BJF=%MWlAoJn$+?}PKoWA)IcSJt7}pBe;qZ4+ zm1K#m;%U5(E6O<38n2zFb{JUoM;C#oN2?&oP{zYgdp=x(Bjz_}jzr*<lDBRZvJU?c zHSe@T3MooB5H1P3`=WU9U>wdsNr_yR$>x1qF^{NzN6JtTv1?TbT}WA<vUp%ync0t3 ztHpwqwv^NRfUQpVERlO`UCZLe!rU{&bqix5=8enJ9kvF#Hp?TsUKMGj*U=5bo@9Vr zpV*cko4#@Tw4(_zJ0!ULhE+P!Ze_uw=iTM0f0;#?->WYl<Qy9mZTZNt?jS=&jF8Ch zo$Oh!=t0DC40hEoh0aPVIbPOwoQmJodwY7q_bd9)bTMR-S+(sa!!WziRK(;-l?HW8 zdok=M!y4h(&2ya`4{4^SL)k|DC4Xmdv~5xNnAJ3KD^RZBtlB1kf*^;`8M&T%LT@px zLlw$2yt{I`?()F$C?p)TLt8URAsb|FTQ$vy6If8b-KHGS77~EA=B%;W2L_hTOA*0{ z)iH#0XVkpww-TVT>S5l*){2aE@!#gfGwVz$wGMOz__-@9>Pbo|GQVfUKV3@U!ALbq z#)8EIpcz2F*zkqeF$MojJ#Mn*YD{S6zP6r~bFY;o8I#oK$P&b4?px$4?;bL*MC<pK zMzA8hKG%*Ms#}yRw%WeeE+HD;<w_3VFOa??Xg+2ge#6-sN5`6QG1<?J$lM*4FFB2L zn5b<N9tUnGF)I0q8pJg)@l`H#Z*ZTKY#$vMg{YyZJVpkPbaF!`8KfXT)F724hwLpQ zDvz~x2`jgWm)85LR#_uD#{%{gP-4E-a?Njb@zllnTd?ul;l2x~^hv+4#}(|N`yjNI z543fyyAQm>CJ(dit-mf^KNiBT9<DnXZC81qn#NcEli?9|w`0*BT^)bWy0s6fJi8PS zb9xYd8W>JTt_e*EmXFv3T^eo&>U3}_q~O$!o?lp<O?N(W8-sV|O`_%Q+UxH2YpxoS zN_6*v2u05h_Tu`Sh^*Wi&jhn?&f>t=>4`unp7(^h7+jXCK2fXMG#qQbUq{!o%W4=2 zbpkl6CKb3^+Ab+Te1$ZvhWa-Y0TDR3T**R2Rv{R`QwwS_<&s4^Kz)d>@r;3CI|@4z ze$^iXzW4I$3r;-XPQCZuzp!oOi-br*N6-aguSIxfnycWz5m?v6dOyvk-y|A?J^>*t z0-x;uaipNoKbs)As3JS*R>J~Say|R5taP<swbVsO#G^6G6G4^&H}9@=w^pCFPw`zp z=A4Qvl%uF}6uNZ=1XZ``sqBJig>gHkvKBmu%@KT#(L|E1&{9#PIa{m}sw#L`OX=fi zD6MD6BN-e_<}6O={4A4J+yei2k19eIrLtTeli+LCB?OnpPMEAU`)ycM$iO?60`hzU z_a;YaW4Yr#71$ii;)e3=vsF8G)ntE(N2R`}XCpjmekszm>UX|FOG72^wz_1PFWb9A zrsuhoo$&2QXM{kA=UOfbGwD1$3BsBt%K|j5hxA*FyEmj*I1EPs+M$PP<8jmGJ?WJ4 z2d7$dW1>oU%{$(qcNTC4eLHbq<011vtH{}da~5>2RkO2MU6bpTto(yY2{vTX0{^Ne zr>QH154@w2qLhZnUY2hw4{A?AvKlMx3JK5e9N74UO(e+i`?eX;SH{(IM56|arn{ZO z$Gbol`HOj#MIHqpE<Hu)N89QNq?-~-!Z=|qHMxxq1Y*O0lZ@|ETX*B&b{32(1?B1s z`$4^C4*aTm6-bM8*TqQxtT!S`zUNGoz}KH8y4_8W2uJ1T7Vu~1IlhO?=5rvbv`gWi z3b6SIi}8#Upf2gpD12#JT2@hDiUtFNf(7xYa4!7GRW{Xjw6gr-W>?heoV*3M%TsRL zvqYW8nz{YE9w-Ms=@b9x<7GkS-yG_>KA4ZENJy;l+<A@%W6wm)NjlqGBb^RIf~>yS zV>^wjkg;EgCyKS3UJ&qhUrPX>`wHpxQcpA@sm^%wobvC%i2<WDWONJWMbZS*JFQQJ z21zAV6_jh~4`TF#;>DI+V+IR$zW{W-o1cRFBQwoQ(hGgt-ZoD8V?)!iC|imYzE`Xd z$p+x9JTN;=SnSAKP*`aD)ydW|piya0MCWUJ;Xs+O`%bH(JXEJxjJ1ce90rbi1xcDu zxt(j+Ukcov)Vmua!FHZ=zY|^NCq>0hcB+U$eQ8UCDh|^=iRA62ZNHkx@5hl1JLENr zBC7lRCX!;B+2x0BaNy*V44&UBcfA*U>DlQYgo~Z{TEa<y!ZJ88UL4otr+=)Q=eZwy z%Xiz|c))r-J|*;VCkJSHF&BndLM|j0WApIMhR>Z0<;y<26#kz5^j`8Kk+&1p4^Zpt zgB(F@a;naXSx=v=ZR{d@jcHg(YP<ZCL_z?pj9V#Sx}Pg8<d$!@y9M1_F()BZr<XA; zP!#SSXnio<qc8Jkf5dW_olBs~=Pf95wEdQEGwZLdv^}8H_qcc<&fLADRa@TUv8C8j zkM(B|C@u#Q?UI_CQ8rv!uxF*Wm?go+!MU%52K&iSt0sC?E*tyO(g}Eu!M>|;I~>%G z7QE)5x(LOBX%Bq91|vZ*A#1lSu7qqF3O)5LGrmdrUKP;FeCJJooLFH+TcVw_uXI1{ zxGUeP$|S}5L_k!H@2qdVzIB~`ixei9XN^&yYr6&SE~E(WdHv%&efSxjvPrjNn&he8 zUCCEx_bm7eUB_`R6SdlPZ_{>JQO=X9C;nB(Hw8g3=U|Ui^OY16lQkYQ_b||Ge6#mn zWgg13QdJFKn(b*bw@4!Nj`}@`%wjmFWM?PD7xfXIofP-(UAWV{uC)V@`h29gX8!TS z^y~r0`Ka9fM8OCl*fIjOTL@2~bMcc3+;0oI-klIV+ry{B#f)_<Y3@x_^7bee5}h{- zy74`TIWjY|e*{^5y*AD{Q?U)K1#!Rs#vD_;<15<Y7$H}SB+FY1=K73|_75UEXNnTh z3&)d80kZxPeI`R5fO&WE-xiO&l{4z(xKi-`id=~h+vOIPkF5%cubt)Z4J)0hwxz&A zg+4g37xb^++ek8*yfP<uIq_zf!oxVTtPeQn5<3g2-Ic+Pr*2Vht3|<wd&hD2M-Vt- zqhg<Yc{|$o3n6e&_i4>;#Sr_|TcxlG!OoFm$i;77`}Ou5VQzZJkd80m;hy~oY+@+l zUDS3}LnU2svIh(y)Yf()5VdGzdPWi4Ohdz&>z0~AJ+5hpv4HL3VTyxU*c=AwIV&3% zSL%DK?nM~qOkK_ettgSo$B$fuD*~LVl|*XH4>h_mN#Pr;ID64qKQl};J95OWcYM2k zur?&9+fUrsTj@Eek7RMXM%$)bd$`)vM&%`es}OS^jt#o%KVd&#Q0R3o6;VLTo6WRO zm=D~@*AubWX@*qlKe)kygQd0E75VnO$1w5{g1cDMbPj}igg5cw<Ut!t#v*kq-m5#Z zZyt!VRM6TmRLeEhM6WI90B%R{gZ^K^<`0H!)!{H6`0NU*5?dnh%lv~XpEaYN003m& z?JEDppew2>K3N-eTR|(kYsS!$$?oNJQPFN?6n#PV>LB@8tKWXj^@nz){g3X$VB4Pz zuU6%cH^M@FceP(WW8Qn%x8-Ng!+Xs4-a79Y*j5rqg1QNz6S5mp`Z0<u<IuYW%P$K8 zqTT%7eG^?>IiPsxl@)|~lc;Nanfq(IW?lx(=DhXt7b@T!-+S~I`)jNU=LMm0DG*T9 zz2SvW^l}NpjRcNP<WT>-E)y+rV|{GSwtqK(hb_k-q7E)MD}I<MgR=;XNQ)c=n61IW zU&GHRy@v7UOEk|ttW>!(^A67WxEk`INx9C;GeTZ9&ZLfw7*AiVy>m)bvKdcpFOPE` z2eRo~J}#OpP!*)pzE_53_2O#F7NfBzh$*0{6sPiepfR}C6&=$!Fy7L;vV^!>k)>%i zl8dT35_*+o_`;PgU6aUA64lqTR{<6Z7Uygt<Obap3uVfM>40ZBN#NIsv@EHm#<xLC zGrI*bZS(o;vd(F=n8dERy69))V=3fW7mnHYu@iR(_T&gbj_iWpnGwWEsLNx&vVxZ! zlg$&&0Ql%=&scoGNocf>O-xDnWb3&<{<d8Gr=cG+TnkAp-C3o4t;E})zjQ;Nd6drZ zbYBI&cdjsSsaV=i1&$$lwG?OEKcO%sbQ=0g=Np<HV#dlSlP++Ph&v)G7vU=MDJ?Rl z$h(lEPsgx8^|oB7X*+L3CZLzlkGmh0nEsRDH~Gtzrs8J0onvU5hee7~XIZi_@eh;} zo*!JipfXyeEav8j(@V16k>hUQV>K+4kS<4?1s*<AE9f#sxq?(C8W*wIx!a}NcKp)W zh-Jm*GTj&PzAb`L9HK%Bwkh`EzgM~+xL()O)R$}WZNAO~E{c0=^SeN)fs(yzmNiuj zAI!Q~m&iF1SW-s!flygVnkgZB3#R*sFbyaz;y&D~d{8d$)hY+{3lFmDF=)SVei5lL zXtKTLEQR1G55f2+VVez8^I$_Lv4+*o-KTKAnE2wYwt~Jt;}DEee+xup|4UFoukXKO z9{(N2`F|@iWv%TIXw1X4QyPT57W}4rPpnEAfEt-783;1aInOrgaOqB>4m>*6qg0@$ z7i3+Hp*q(qgDaPXVe~8$JD=y>K%1qAxZ}2tteRfIZr`oFtcgyg23Xi~!`oPo0mm>! z3wHE5V|ULxiaCuCaF4mdTy%!KHIy|cC91IgRbcdQOBQz>mlo2``jl;q7_$~9U<ihc zjPI8!093$uTUn^>=O_pnS2^U&y+vK}X)Ad72&Fu@8>si;$Wc0(BB=-sa>{Y359<@z zd^ql{eFyD6M?>c+7G1xN;xRDpS!_3IFPi}yh|*<3Ri4u>fVPMhLZG6Oqj@(t;vnRz zIZc!2KCK*1{zdM|-|qDPQ3wCUDYrlVEqwpas;XpQIF|nCmFTs0TQDz8ujTQlJgW;G zTCtOD4elsq1jfH(%tOxmP0A6`Dg<j|9ooYrr3i|how-abm^2_qoaoqgy{^|xPXz|S zmD1|sYjH76lr=04wkh48)+Nlr7qok~7GaXSw`4dO+{GTfy;@c-R?|}l9gDxsOjGtL zKb)*LK8k%dnP>=PjaXgYtoJrQN>eQYC;w!y*^5&5DplTmzF4a5XOT3A+PfEINESWC zuH6Wowe*|o@3)LwEf?;vS$(<-ueCUVOx!(b{j%1Pms`O@wlht@j(_`G4ceLx%C+@H z0ubEWG2bQookst>J<g^^!MLbqKUjdF?j-blHEp1g8oHsqDjObZ!1LD$WhFPvGr5rp zUJjqk#E*MiJ*F?Yn8^f+qG(7r?;uw9Cj;uJg|B9q=it7NIe#6p^WW2eXX{304JmMi z9alp&&y^6b?_jxSimNQGJ;;O^j!;=d#q*M5aH#0b&}BIXULEAG;}stqD9R8W8;OEp zAl=DG=Gg|@a-*iKh1sC2Ht0L0_I6}iM4w>R;_E^AqSo~#U^7oijRL4GB(YNZSY0L{ zY5pMYORKB5)t)}4HRO7Kb7|GQNUcB8zkT~!C3O`A(h&unL_ML<iN$%$fcpe9Q=Zdp z6>F>pDKagFZ1uP9&OiC9pDO=7?f!rN!bvv;TKf>c@{Ni|z7UP@@@_{t(45O>=gSk4 zpQ0m0;v+c(L}MC)IABYXFzi9lz}i5gDrwZPS0<v-{BXIe>5dJSr#R#r(-o$8&5C!g zqGI2M#XM}SsJOOb-KyD!uEN%gMxWF9y+8M+FR`+D1vB>Yi$i*P)<RG=t^4EDzuuM4 zusfcX(^r_yV=v_&J+rsQ&g37~){A|Pq~~Waa2|PtE(Ac<b#r?2ebp||^YUxd*ZSA> z><iSw$r~)=FHfGmJH0^1>yhpo;`2iz>`zbZTT}Y3jO-rkhF)-PPk;4iHRm_-k^W1T z=R8KxoqalrQLf(Rqp-*tt*Z{+)bZgRvD#+$0S+5C8@G@Nfnn3CI%_i6+S4Mihm_Rq zK9(zzbx>G)cXYD1W-_JwC_rN)GpQeVqc?zPZahsupc-~$)(#5iME<PkAIpokB}{o+ zO=>}%jimiIO#200%J#(DF>`{cE?Fj9R@U-`l%(GFCM%_g*e?709Z~brJiyH6C8Qp> zG;ElpLG|V13v6~bGVsU<HL^{Uu*{tw8MRkYRFB^gUta3}C6vn&<}p+?-Zgz<k9pM` zP+kJq)l6@Z!TV%tlM<Xwbed#3orjGU#G-mYui7VS5QqZt-=oY24vVh5Yi-5cgh}kl z)DgdB`K96XFs`B%aPC!x9prpD#{q!wkSR$?)U|c~&;b%#dw{SKF&;FAIL<pdNY6|A zj}I$Ka<|<IZ_k^UboZ+UqNB)qE5>SvB7y}!8A|bC!Ln0rH@W>5PuX59uxXuryRRbn zArtE!h3v99@0%f980|v@c2W@z8FzE(dEg}x5k1FMajH!DHF{sW4n-eYXYL<iJvHw) zH-qc+ySoWeH|U;o-QCR^kIXmDhI1b*Cnus}UksWlx9pe-U($5p{xB*p8SN1a!Bkgt zhISxYwH5|YD-FpF(q~GCW_*h?&^o_TZD=P#E3Z$OCs<xYWsdXAc$3K&KP^WUBe}eV zk&h<|eO+DBGEh?`X?-HOVEbi{Tw2tOTl_-s*<IDe@n8G%6>I<s<DSk^E?Kio8YfvR zi0w8xv;GFbj9K?JRhba(P}Uc>o&)nL$E>=*Ptev02pSxDfo!XHJp-pPPS>stGw~Qa zdf4DpD|a`hId@<%5{KEzRC0C5w(GM9v^R27m5r&3A7Cq+XqhZStlHv$7815)CB5{w z2p4+#Io(5%Zl9R7pg49S`R?npFTQRS4pDAsO{p7$`kMC#nJaH+I67%)Eyi{+ayq}F z55j$7hN}90@(`0P8Kr1kR6&mB?w1F&N(UDCsD1xBQCn3PoN@)O6%ZWGV@DCM+%YzA zuM9Awp$8a?3@K2nM&A~?yQA=y(R*%DtY&*>agU{9HX|%~QAd~`?lU%0WqUG}Cj==J z+K;RtDdmj#n`xdZ<5(-kb%nJc<i<)Y8J3{H84GU+3b_#yukb)*n3iP!ZI%w%;D(<r z%LncUm!KsrNsz+4Oyb<8GS48S-2Oss6pF7bqZc<@emB@%Q*Q$cZE$5yP-{0XC{d3a zPS@>dd+6EqB*dY^lEBE}biV?>TodV@<BN`GevJ=bszusvY;Fbf?0Wbu;^-*z0ope% zY4v1ETG_?eo_VWQgZSy1_p;pc_WYfdxU`iZu2+$+&Hz7Qc|{3ImXjIOY{@1G2s72~ zawEZpKF{BF&nk(Tw-a=b>!nyK+AML-Wu`jU&79Zhx%d%k|Ix$^@37#7iqo+wSa(8M z-6bk=%dk<umL%MZ@Sm+bSRy`ANYt#aop3O&MC*@^^>1jZlu4uXg2|0`+pcQA5*!3w zO}hV#?uGsuC}tUjTfqt+A}DF6+vI>%pmL>a_02NR!E62f0fxrX813INwtF|CnoE*U zRzgws!T0$UY(WJC9KQO48=1E7Qm40EAS~AUwsf!G;XX7q+TXIzdUXs}r{_OiW5-uk zVR@O0p`~J+|5A%1*TY$bIDsoXakG}&kCav9K7RP(B|fIrdJp7^cX(XjOn>rd^1cvJ zSTc-&A^;j1ba;rMipnc3sF)<vNKNVPm7JN8RY;h#aojU+Pi^t{aqShQ?{87ExoSF! z6<t<mokkR^Ch!6Y4PA}MM?JCzGAMnDnF?KXZHjxc8gxi+s?~~-@FBoC?KGO~e-rpy z<x`)V{hou8{R8QSlG1V7yqMd2qETJK(c(ISZj(;;Ns6T)@(>z76z?{%Lb4oyB0C)N ztRrKpVow_`7l{Aa)ZtECok2y5<YVHUK^yU+Yf7Vw`q5$BQ85OIH%YPF-nu7}Sq0vm zt(f+C%P)2T`k;4pttTl)50tW-;i&nWTg;$@Tvx_gHPNEvZ-jD4CYCypRrGz!@U{a? zQVV70T(qHI#oD`3qu+JDqvE*hT8Cq%-fX(Lunf<KS?GqOST0K7me6hP`k3T6AGn*h z$0tOjJtzoNTP>T<|nEy+T1DPw-<VCJFwXJ5=I#3Ao;4k0R5u0M<@E&I)60&>&NK z*IbM@YYE-S4r6EX#`|7IFJaOy$^vcIhP&eF<$#*8Et)`yHBCVrl)!~VmE)|R4Ch1M zQx3&fCN1tO%wG8huEhIN_^ZnD>u!3yvb_;Vi)lX3EZgMzgo{ZwqUx(3H%2p3w|L`7 zdvCZ4+@P&u+=Y?!M8tT_FN*4toF>0bIa)Ar7o0Bp1@5bqDy5dwa0C54)XjsN!P9<5 zrvg65L^-OV=+cTGP+Qpm<sF<INtXIj)rRt19Tmu0FbQ?M)t-vhE63k4vyMq8=%L)- zTqNQQK-4`50p$zLx$l3=;N~Kh!<0j<^B#_VgZiZruX(~NaT}@?5JJhfd%Rwh#yo)9 zOyi;EjZQMMil=;mS<nQbS(mOq;&oZ|ULe}yT|Z|vIq^bkYFEi)$y}46e2;-uoXOj} zxT3*L@KaoPZbL?PN`pUC`N}empqG29ceX&O+f8v*cLV22tEgv!bGk&#NfXg}J5@?^ z&?xk)h+Z<GR&LL7E@I{&10z_6HcLi%t{I!NF~-COb1#q62G#0RS7yJquz^S6HvMpw z)5b;QGlEB|t^XXGC9j@$;uBB*l`icSaj*Pr2dhNOgA~>z<9NRNSvQh^KfL?9rO(NH zH2tzVs^m0{FyvD7L`B&^yq5=e`@R^(sGZ-?X)P2D%X;egy#Mfe+xd+o1DGa&0PNgg zx5_0T=@vY7SkX?GjOT@}<{}7h`cxS|YwNpsMf`i&Wm13Or5=lo<k^*8V=3kvEp_Px z06?D(C&(U6kF8?HxZHkeaoJyZhz(J?W9g-CRWm#$ULV$v(-znT0UZ^@V8y6FNm8?+ zU_Z4qj&3VglkcK1VSMBaHe3*?*80hCeUcj5&eYF7oyw>PX4=rxoM2i97iYM#$mlOA zZ*L6(WB~Q7GQ4z$yM8HF)5s#lT&40es`0h_n#+#+fcvxC@0?Y#Tz?E1(I;_0VDR(8 z$Ub4L^85x|MwK^|*=OCF$yr~6+!1G_jTkebQP4Bi5~Q2ihRHbXTI3mHx4X8tY}o1= zlHM$L7#8_KU?(X+vn8sKj$2G<QnPLI%&G;DiZ%cc0Hy#K!E6BlAe!~i%?dFtuAa2i zC2qB=t(;^zI-tQoiutcndz;@$!xz3HtNZ8F_>bkEMkLC>@WA(6*>I2pXWHr@(NeIh zjb=h|`|XPq_e<&bxmc1O*yLmSjo?HPVOVv6sNDkSxpyI=Bx@->a*c&qd6GrfCu+&- z-j4R_VerNoRsxzH6q0;EjgT|TH8)mv&+@tRYjB{2IVm&{BLITbP1a%PHqa?j3K8^$ zdKou;lgYmJw_RqyKmV@x|JLsB(umKsDGNrwh2I0e&K@D7$Ml|mTRMG)40j(Xon&~` z&OXJCk^#<lrk&m;A897OkIZ{4=(c}%fTSFoSmf$ly;8>!NV{R3A(EC}1WA9>bEBJ( zrPX1j{<kQ>hwZ<1_kI5i;fDWP9smCoFX3{u*<P5s`YCY0)N(y1DotaMRRU1>=**{` zAeD5+Rh(Yku+vbhMD{@^5++t)Yo20bN5iKawOuNoKqAUY;xE^?)bjgif7}J8Si>=+ z&h(#@fiAJiBn(L$15Y7=s#gjyBwb&Vq?5NSiS*pY|CAyUwm5piqUx=tLJe-5)2VFR zsk0O6xVQoX?1zZjWzeZd|7$rJS*dd4?5TR#vSR*=U3+S(sJm|=GWql81rQ$XNryK) zj1^44plefrGd3a0c)EpY{mhG<(LzFJp)8n0jHxqbC2CEa`WUY4I+J>Dxl?3&d|Ctg z%}u8Xg{bTu<F$i1r_!(VTF?CK|F=NpKda98A3K+uL}gjG*!g9@c-8*nfF`?LdtPfe zBOV-lg>`ZF_{uTwDZguDTx=4wbr%rIzJF_`&pO;ihvOgr#J|43(8RYB+;=KCcu>oA z>5$OKDnuYmJ6|^ZgZ>2~$!1Tv>*X7>Qy726y7rO4x1S85@o%h8gtyh!BC=<HGEgrI zt!qF|M{{8`{_Tf!;??r$eT+Z24Lf7H{z!uE*!5?TDs#ws-1}_p8lKDKbxwfDCIQ?) z8UkYk62Flg-7Vp}6KJ090+<`j6WfG2+}$hD0~hujicN3aT#g*Ba}kcg&Cn3LdzHC< zu2_j-C_5Dk@B;xjoHd~`Q$uC&>=Wa)fL#uh*<Y3Y!^=6gJFOezt-rXkbWPpzF16v0 z31Iv%Yjwwzqy6Gyzzs={TP!kH1m6}fJ#M1`aIznO$^!spBxraz86`R|=m3pP(AQXj z_nzqvlsviPqIf6u7PUmizdc^w$|4vX-do%jTgieIsmr7QnnCXx6`l_4c~}>fq|Je( zy2Nyc#NyD{5XQ1tfvD)<Y_A+On-E^l!EIR-$P>Rh*kJjdC&FXgf$73mFI&j@CaH+| z4fbLFhzG5XmaVGS2PS4MYZNY+m*(a=X4<R?zV%7e?F?<HzC{;GSeNvcxJE?8<as~# z5BQ(0RcIMX{ro@Jd+)d=vu%A`M@Pnrh=7QIf`D|9-bbZKml8@KpkP2sLJu7*Bfa;I zf&@rNkdlNJus|rGNDUAI(jlQp@A%8iJ-_prGw0m<`OdxP-h0lu^Zt?SoxIs^c3o?) zz1H)XG59AG@nz2V=GPh|`tUk^u21e;vba0jPL$FfQLi3y8w8G>eOlpy^b)PzJ!_ny zhmd*Qu9bpMGwM*0+2SsY7{qld;+O3?Qg78@VSuhLaQCiYOhcURJ@YWh)j-!`9HUKx z`>TZu_wZdeU$3Rt$Cx{;T|tW`J3w!&=~7<wJ6}W4n!!vJPU6nq@e$dEbxzw*IDwH{ zemDc?6G*TTC>Retjo#u02T5OBGW<m0YiHDIxsgJ-HaQo|`O@9zIMGTD^1eZG=A6as z=Tu2pq@k-vJ>N)KZ&UtFNAJy;_B9=kj5I*O+pFen!X+MoXp*xAp)ku+mS3TSGPBDo z5Gjac#@5zaKLxQx*2_+D|FBsA(rQM@hB+Pxii^;hoN0V4Iqf&E7J8i4v)}c~?_R4P z^Y3>>B?kztlCzA<!XR5kIuLm75-klus*{wY)qpP>tATaFjPPjakMyQKzAi3Q?MhIA zI%@)xl51Trj9xKn0Gm(W;n(I<jA~WT?q|vTcxN7y4)#^sY#r7S+7g`7loc?zKquhB zSz4u*Syh_iOVaZ|%hEl1?kR@Zg5DjX^k&ddyb(#c#z}96>{TBXqGh$``vzU`Icxhq zm=dhQD9&A%FTeB>(U!Lal9JfITIcSVib0xi4s8lMdt^lcMtTiP{70KxV-d1`!CIZ1 zUIU?Ib&$B!-X4by!<;H``~mQW)&0;b4YGYjVWr%%AGbqpSU6lV&d`NxBukz?hh%MD z$9~-zgC06z612Q{%6*5LFJeC4($VLqbSjQImA`zi?*oT|#+lOE7PjBa3gg3vHR<eq zcx4%d%U?s_lZG{L@yL?88bK!~amhBl`nK#rr{n^n$!6r<8k2!619C*%^Hphn!bZbm zQ=(N=n?UORW*Acpy%<TPYo=_#!Q$4Up{ol7nKQg5^XQi`{he&u#8Bu*g23(QeHOxc zw4^|+I};s5DDaxSPV^HAv882&sO)E%PFq4i`Ob#5a5*itvZ6(@affc7LVp+Fep8b! zSTXy2*oMs>9hX<j`hK60{hB)$G!Z37k;pOJ=CGTC02pMn3&Sa=?cELwV|!{0j8$4G zQ)xq}RvS)F=p-veL5D?VS7}Nm5WA-|{Lbr7Q@1gFOg47n^Tnau8^_N^P7Y1m$yo(l zB}}G&c>m+4mK%2FJLylKHeGE|C){>QDan6vdMHtgtOLO&7YaVGw|9^y3-R#CXv{wS z`b#~3^>X|>eO|gZ;QeulsetS0&f*h0*4)Wo-AjWRh}#E%pQ$8s#X~B(y4mU|yJMT= zv+1$G<|sdKD>+kkrE8{rol=P;iq=&w%`h7~C)IeAu9FZ#U%jgO(hk{FLx}t5F8tE6 zCz#?xN+m-+T(a4>FNenN-LTu=<i2{vT{+IP3Hc@YtjW=wZ`xPwkS+v_i!J0yb@xi& z*ZUUvM`0tY94Bcp&**<x!nJYWYvWFq%`6pMfU;V(3P$Ih(RUvB`Mcj-bXIMd5VdZr zxHyGz@!d-<<%dvG#M-?8PCziXHVKaT@i+JXPh@|;9%Jh+W|s{vW5b{A&1+*yb#OAX z@raPoyiB-`F7FiAQgpFKPXKC@u{iPs1sp)34w5~lBraRy!f?9!7^I}y966&7hR<0< z#_U46G0EK=tkisDioS)JwfmR;{G5hE$rV5N&0nnlC%*OmS(EwKJ#zh3H~({~GO96r zmMz-vC9Rv$rv6$T#)^qpVyWK8+n&s6*0Z=0@F1^gd^=g2th2l-R*{o4GD!32v#lG1 zj>7Fs2bfIeI;DFwx{kc*fJP4Fc7f<oc;r0Xv#Yiu?g9z`*)GWo>6E?kA2}WXDtp&< z1XsIb;BR)>uraxji)HnB31Z@?fF;*91C27K?8*}}-P)Z!s_(~unzrd%`hyovh44l8 zS(xnaV9Rde>724$c!FioN@mSSYMr*cV4yo}!Mr!Vm>)sRMlG;MFWDAY4+eibHn(mN zG+8R;4J$HjymOu&H1gnn@+k9g{HQjqt>qlf7#zH><eZw$#h=w-EExltcB#9SM|elG zv9)Nr1MmUjv){9NIs=yVGT&**m48h2t9gbA&NVw>qWiP6?*|nlx-Xx8;Z8f<w@$rc zlWS^#WBu5(kxT=-$601pV9{dg3F-H1S30t|67_SEEpEQG&6d9_TiTB@_88V4ny45Y z&BU4);w<$*UH~WxIB8qFq+OhjkSubM(Q2kg@t%j^WVwnz`<^`Nr(|)Q8vstRLd=YJ z(SGp+JGl)f@1=Y}VP2t$iZjZ-g}1Wo+XlBUnAZ09R&0u4N7nKq(Ey~H?tpT!Z$_k@ z0`^{N(ET9cz&yFcydH{xG_A(WrpIpD4^+8|FdxYD@yikxD3y-A7ZY=(z<SaLo7y3Q z!}~<WJfe9Ux!cgJ%vMD|9m!NJDRF;MiEdip<gIXya=$!Wt~;0Fo2_oFmvvd+m<iCn z5J`>E=10s5=9YZ4zA`U%=8FS2++F7DPDsfh8RXds9d!VCVkILTvkP2im?T+Xi6lQX zxqD{YKoDka(I~T}I~zCWu<p0(l0<NaP>OjL4%(@WDNmafpJu_f4Nsl_eDosANdTOa zJ5&AY@WR*$H!cy!BbjB3z60JOp#laqfPQqj2^}bcMO{{+l05_pABc!V<kw4gl+>uk z?|8OsW%dDgxX$!hGiY|X%OcXV_1x2(>=axG<HecC=zRKtyrZ>v&-op}HPsmS*e+X% zf!bBGiiR~6v!z7=;PzmWbmX&NP5j>^f4JmvRFU4!?ia!^bnwYMj=6bNX*?#zZhg$I zW<p?QzoG7HT@G$*2eiE1?E@LI`m`n^V%4o;I!a2ltf=vbt~=E5TO3cdl*}lpYqzS= zw{QYn-th-Ibsxo~;ivy+;7os0rDMN8HutwB{QdL4AI2?s5oS>pV?X@Hc1!rU_!Avs z3P#Zw(Ej=JI(BRXD^y5&qmiU#38d(Vt%^3}j4cUzkGaeFFZMaj7+=LfXarDkB(1<T zL_q)+aA#@mBE}<gw$@H*9x3>h+GpDBU%Y*=cE|M5&o%wl_h;Gn$1eVlUHo4S{(oQk z(S)hpqb*h;7grgRdI+^>M4*tJ2S+QN_X280-R+cUJv0u5ih|=UgSyMD2KfY8J8cG% zhPKu}GcF<S?4SWx2DSVp(xTkD3|~<x0S>2a*8A6?GcW`RC&{7&(392xXt<T6PR_gc zpC}9sh+hkMV|K%1xI=xa5WdB5W-GeNt59Gn1Mq!m^iQVlrsn#i_AkK{o`KUQ6BWgT zr^9ya7P4K!mar;27hA{a)ha>|qJSi~qxd=1WfY?@DBvKuq>^`(SjH_216j+gub+!w z_;!pq8Vs;9<86UuIR-iyYtQJVXw@cYP0M@e+HacPtH3nSCOxXi*TcXOe79D;MRh-g zXj<jV>oB(iS6mN{wiCL>_%n-4=X8J_dZX8uPI5|v*hH=JvqHNpOKe-^?mFMf7k*vg zT_bG>P%QDL`?it2F-t}D&L*+fuJ?RTQ2?=aTJjWxiCGES-jcn`A(T%<SEOL160{VZ zy-6UTC8TPptp0oJz0|#jfrgV=B{8a>2qN-%ts8^2{LST>#IiST3&DHE#mR%-XZ>Th zZWbsmfXC2;Kp0|cEU~wgq(9x&_F7IDzN7WF^l1!JXp?PKF8{QlQ*)Fzr4d$(GlUK> z0levu+2I*0(nE)WFM5WYR?U&AOB1L*X#mKZPTI=U;DoT};gMf&(?M%N(GHtj-DHTh z&vNujzNa60m%lFEKULwD&VO;30$r(Sk&vr9jI-Su8*A#dXiim3_fM%>cNIeAQ1{KZ zRD(m8lX|5rCb&7bkv$_a-p)lDkCE_F&=6VPc2xqUaW$hod&y$P6`<#>Hu`b2K=7dP zQ}+{@t4*YW9d<Qa2@YF#SsvQ~$s>U4lhK@AfHjIqg84E94hv~L2Rq9eeUF<n%7N+X zcm-D4K7|=e+fNnnpp~p37J5^QT!X++JV02Vj79~mlS59(F@E3@m--%k_A9UEV=w#X zmHi{-YR1f_D5*|j3It6LN6hqI0nrcl_<5YsB_jt&xYS@u-ww4ZHG_V(HH91pc;*^r zccCO|BYEt-pVG0$J=@d6?PL1~(3<n12bXub34N}CQT;_N%PDmIF)n2(?erji^KGZ? z>%W?EfBxXRli8X``#WI`c7(0Fw+C%LeXUm&{4!;Jz?inOgYb*pE>WWEmUQhx+^23G zPoty6Uc*GOt`QS(Qm*4U#FV)@2eVX5AG+Gh4<`wD%vj8onE<{lI2MWTiP6=~wEr;{ z$3NHTPl?|z5Pw_3-#`Bk?iJksXEFW97WE&_+WwEbMg5yX+SlFh*qpfPp0Qh6i8bE? zF+HcyGRYsdxb9z~q$|)d+=pKlx@ID7y`MYX((pF>zBjiBs+?I5{F+*uE4_#Yk}v=N z5r2!bIejbsGUcNf_11*~r?Q$*ra_0EcToYkw3wG{{mg}gTYJ*-*{TY`RIw0)sop!E zdki}kt}HEL0mY{7yutyjuH}VmBKKyX$Tm4R5luPcl3&V|kOM48YU-AC?OT~q>dmy> z;&$;G%(k0jFyqR{1D$zKCxcVnqrxlN<@91>2G)#zkZPZRf?7gTKejr01#4kOtx_V) z@i&!0v7`B>a?Y1Cs~Yk9QA0C}tWylJx-uNE{EZM&0&Ls0PVPP>GZI%ad7L8Vl|%r{ zQZ!>E(FQS4k04>>Vt~aVtW#%WJ5PMzNRzU@D!^X!bXcZ1#}YPYZ-p5xf*R)*GJz}z z01v;W2G#eQFg7&M_sS>$t7xctev~*ev<zNS@xeyn5isAU6iY#1eoV=Yu_A~_VSuxZ zcfI~T7oGV=QqxP|xRkflg2Ma&KDIGs(R*h&+o}<%k7AbUleBMUb#d0H0!G5^L$0~u z!s-Pk(7Y*qz7g3{`d$_V3L-s?B?a<bunuREG%0xom1@Z9xj_7E<dC|@uDpWBUN9@X zvHr>&-}gEG9g~Nr`~}Vll*ev8P0RaXO|*<!;lf@f*(nnZEb^@Foh4%M1}zP3aXqKs zugVk7t%kfm&+)Radh~l~<F`->9#jW&mnWE80xW+%AL2nrWOQW;BSaSKpi5G8zxm0j zaGe9O&k{vd%RI|xI(H*J_32$60KoQroFXgQGq*ef;0QaL5=2B^fuxPb>5g+3^i&x- zrML&Vc$^;pWKza$VmGU7-Sdf%uskyY^*Q2>QG1#h>jL(HVNe?yja8}{^Wr_`n72}) zY?^jE=K&4CO{DiIu5hv*LxpD|;S``u^jf#V)2#B`1++qu9buo1T5h|{L&%K8+(Hz? zOZhEkm?fA^Y#lyGUf$je(0;=;mX}20-MAloCNOTw5!awjHJ;km-ZC50Y~LdOM6=%O zwJ-k<%tCa_vCW_{`+afoFZ<l-&P<cO4FXxK<)y*&09d7)2aP_YU^Y+e(fC>X*zWRD z-P!bDjpnF~xps2q8WCnDW|$UI+^w9oMzr^omi5y~6C{di=jSo%=vjO_)>E-vpZD(l z>@PA-f}LUSlk5Q#-?w8}XV&?Zd{)&)!__xo%tPBs+6||F#2765M1-6yI-nLkp77by zi9R}1Jt>_jJ|9%Z^iIEeh+fDE*8M}9v)_(IV2+@0pu#{mOAB@3>)Tnp`QMPD2(|); z4c*PwopsdOw_^$XMDD>Q-@Kaw<pX9D8z_J0zdG^z8)f{xKl-lNIwr42lEgdJg(DuR zWr>7XVkQIQb6Ws5VZE3I)L(ZKBPEt7lTb>Q60vT6#J3pX=YcJ9a;gDd<${sPrp+d` z8@GBLg`F)+z+-&4zB)>wSY4L@BPbJMg|IVS!ut|2Odv1F${Za?#U4~Y$%;0%BI!Eh zuz*!Kflk9K0IqMxay7JnIcnwpm**_~%kKQ=G9LeLorC|X&3@+&`e)&Myt(^9$QSUO z<|^~?18?Vh9Srt{6L~MpT{ko98Rdhx_mdtqzIO~!s@b3iacdu<Mj7`LG+U}SQG}vC zMx7vxDr-uZznB-^y)&i&^a=N7w1{wCPimZWez084h3xl9TPC<0R1U-%k;@6U5J}mu zyp~sQ4X9ZZQVeITq>ls^C%4QjC&gccylpsT4fh@FV--kBPtWMt0b+`g>{bC7V-~}g za63_dXS}J`aFkC#-lb79z$b{{5+Oa`?!}Jw6i~oH4HOL*Y1(G0K=yHX+uw?Y<DFDi zs0AePr;h^Oa5BGFI^sCj<jo0s?~o-V$@sovi#^tS5L<4;@@d#UouKnW--VC222u07 z2tmsAEkqATedZ4c+WL06@DSq%{fll~XzqO;DenVVMxO%iUAoY!T)ncdi!w;bRzmu5 z*-)LS01K+D%?e@LiPATc4@l{8Zg4MY$xVLmSp3=QSd*ax!^^HHTnWx;+Ny?wKg!)B zav=&<K?J79_*V`r2*RBg9dx+>kmV<Ipv5+v%5uW1<Sr{cNQa~5!`l#vS(eD>ks3oA z3)hHy-?LW4maW+A%fj}*9eWonxMk|D`M&GsVS>5!Nw*6F`@rwAt|}ZD!<NjDGh(AT zek3H+7|E{bco-MC%(4*6?jGW!=h$9c#wk5{t1Htsd;p$KeB!dS;y1>vRR%&P?A>Vm zUPW`YiagG<DY&{{7$CgDI}-r@=v@}%C~5weU{1dpcl6|Qfq#0ss=utzv40W!?jJNA zzwOt*U;dv<K>ZVL9sldnDea8|cUlr5h@0(F^^<~91*pJJ0WCLUGF#9MceH-0e46u0 zj(Ybc_KcKUJAj5XY3wWtLc(h?z%+n1jMUe7W$<gQ*@mXzhlM&5J2$p!pZrCV)3$*+ zjLvI0AZ4cK4v@BlXBQ+P_#@ysS}_*Gd*qh`ppW}pv&&~nDuZKAN1}xa3eypSc#{rY zu!KohkQ5{$d%Kv3#Dx0P!uUB6-m$Vb(j0~t*ROf9wG=QHE<d?BUP8elgo9k5Z7-!9 z{g)}?{*Vlemik~rQ&Piz(9YM&S619#R8N)Hi%pmcjWNC)QDp?swvoB1k+)*|H9P^{ z`gG<}T|FN$fL^U2qP7Gca&8{a7S{*V=!)opA@FY{*mxpu6$K8cJPjWQ7^g_}F$0X5 zm?eBhakmEPP;ZYuQWwK`9Ll#%pY(}3L{AM?Td-ze$2x|Fux2-|4o1i%IwCiz`VUtr zg0^SSFZB9qr>!6Gf|W1K2eEvNbC|2B_;&2f2J|YP{k_Y1U;nbPcK%Ya*iQh7u>9Ie zL}d9;8yuzME^Vv_utM<EUGb;pjb5oYjh+;a+>^5AnUTwp^%qmW?2rs<vWm;plc*>z zx968ccw~gb1x)J_&hX^@==y>7Uy@bgG{NXMX=z`B;yR?mSCwp-J9mZ#Rh4HIb1wzk z)X^Hx){sM7UyZE<Zo??AI#hXWn>*HLAf0~TI^nci#KwMy+|FHarF>>qeIYS<CbiJe zAgmBx`t8{KaKM<s&?C=ZmY6HiFApDQ9sQ6<k3E%+^7839%ROGa^Z8T6Vn8mR&B@om zqHV>d#uvs%-p22~*6s5VLW1*NT<v7rP$7j630S$%3ppMYbW}!%aBLd+c1+e-l+$T0 za%$6S$H>#V^lz+Uzu&I-HwyXtestVKT%&tFgO;#5XF2oj7>{16Dr#g^<$-}6qU_TG zaAWYVbqa>%7I4;sK}aU6xb3@3TWa++mc|%qE7W;LMaUA;76J0V>?oCjLG@RxTp}+} zmV47cbIf7rP8l>n0tp+d2aklK=}|lDbbr!Hu`&0vW`byExMWvkMcxIJw97UkE~J~6 z&;I9XGJgBl$1nbMcm8vUtABv~l&NKJ$A@*1zQXUiB(7Np@N51sZH?}_v;QT3Ogn(% zlbr-Aj$I&GcchaK{rJSyJuoVkQ&7k7ehU^yp}WAtiRuGPkz{!X-In)REX*=k&)S!L zb|tbG<i8z*yK7pxj9#qaHw&LI?^9Yg=`!tbg*<|0s1eG2tm00^n+<BKneR1x=dmcX z$J9PZv1MebB`>&CM=R4<x&=A-VFpe?-;P;;aUM|#y<H^j)5FJ(xqJ3<@38yz9H_ky z;RJrJJU*Q4>+mI&<IukBM3;@`(e#k`*Q++&VnM3=ml~aYP8>}et}ZJ(yO(Ty>K%s| zG#4%i_A1^OP>d>U<hsqizgil~WoGFB?2~<8A$z+_JPFL5KAWDa$0U1v4m4V-Hg(z6 zv_BP_VlCh6GY+mYt~1a)>ImZac=Y|gh_BX1PR=W(GBRDsAE(@^>!c{~TZnoY4kp_f z<Ve+w$AIVMPLnQ^v3!Ih!rL=%M9I)rN<V!Pr};?YS_)Bm0zF*kR0H?U7qh~Fqz$t- zFdCypK`d$=8h$dtI{E%y8>7#<b~F2QXcU#H)6EVX3T@@)n+vx$MRLez`j|gmr}NI8 zhu%-o!azT~is^%xELv|oMVx2xBo9d0T;XbSeX^X;bMU~rFH=X)vc+}@pcl2-BA`12 zZ_JgDb;PxM$oUJQmxj^KU5@aY{23|)T-h|wCFYC$G(J&yMMUKSk`)nw4$pBUrSIm{ z+M_@LDQd>L#+PT9rRMaQjb0s0&RTcO(F5h$WrGQ(v*&X_USh|8dc9<3cy;|d+nJB? zzEu#ap@N)S4qDv(`f^0!+*>n?kn_T><u{LBR==9mc`<s|-TS96+^1~CK>6}k)<TXy z^CNp3>w+4sH2l<NE?eMotWq)|<UxdECiQ^rQ!e|03a8tP<?LQ#r0xb5r8cLRWhjYM zS6as@P}`-EnTU4D@VMuaIcZ_eSZingRK4%}^=TvOGRrk-A;aWhjZ#Q0`9Oi<>eFmg z@&-aluHC0ow@vxPH3;v-_XH2Q?Q2<9Mx!GTT^9z;+^eH2X>z{lNK<=hKj%tlv$U?d zk7JkQ)Cc_&ZfT*u=&;Ye{zwdSijUKR3wd=}7o2P9EjWm_gGjZnT1VtEW;_nM#pIr5 zyFSz|-^jBS>mF{S$hsyzOb6wUaSm_o$iGU8;Pu>L7x>&&3SCeDupFF4f=QOcz=N^{ z?R<Aj0i}}g9qX>!<r2=W3Z49z2ftqC{xbcC-|b(v$A4GuAKdTu{{qy}ue$c1OVs~w z?@U9ajkLUy?|SvonFjHE38utfm<F-8G9$*de_<NzrP2Avs)||Ab8!VhZ)A>~_4PLP zy1)wlo*Y~O!Rj$H3a>iQ;wAQLI>rqn)d|h+eCArtj_fxZUkmd_Sq)=E0AP@Ms}O3l z&d%<ERerAifk$cp-GrywIHTvusN02UNX4}Rv(Tyvdv*?At?X$vE%lM<`)S^xAN)QP zOKkPY&Dyrrf~NTd(x-lqZSw3MJdCO}y)abz>Lqlh?7E2$KnxB1YAPYMmVOnxwU7tO zJ?h$zwn2|l$K!&W_1GJ$iuk?jxyGiBK7ZWW!n7t8+O8e2(n%%(U7~mE!kApC13KCF z4K&SXiPoA*dUadcpb2!OlM%Mh0#v&+@H2&5thdR4o?(t;w#@2>ng6oUICVf(T{W*! zs>^!(N{h9TC(ove#2iPPlFOR9#;UMZmCI_KfY}{H)!qJlQ4l(jr7*3GV!AJKi0>~m znQ%S5!|@)%;TfuQr}>K)EcTNnBBI$=C_lOcDKtC4VqgF;;~&+vz@Y%`#YLu(i16@{ zrznoXjWPZl=6q4>CR;H8GwV{*KsKS%F?^Uw7a&gu>e1DmlVBEKCj{|!G!$g)jg-B( zYV9NF)Hx!ucG#Kl#^n_5eHIFW7~AG0@+EGbJU>{4BJvFG)usFAU<zc;ASu{}qMdKY z4ln8I?TNbugwrHneeBSaER-;vbRFoH(-n0G$V}DLg-6ob{hJZ_LUH|pC%2R=^PjeS z?X9kZ$!tj178xm$paf&H;4D9l5Hk~pv#-4dHXiL1HfttuM5VhH?3T1~xM~>fd;Tzx z_Ibwy7Y25GaP5?9hw!`UE92f<76M6z_S?PvsjinlcrEx*eSWIHJ;88R3Uw%3<nEho zo!Ue~!4CIRD0I@lVUkBpW)U3`hLXTU2Z!O^6pQV-a-Qu~0mBOnbdYrvtasV?a*wX3 zx&#w<9&|I$NbBY$y_3v(mksrs64Zr7^=>BWkC<mV7J&tAe}2({6bfn^g_*gGfBw}f z^xNdg)AAt}^w6jJ#+Qr1k4rTpCU<gO354?96^YTWNo$AWpdC;bc|TBWJ7BI3yD0W} zmxEQzAx{|UOcWiqs?h))6)0`F5=ApQ`YAJFRz)Hhp~ygGQE7*7$25pzYr&sR{2RGJ z(-Usmx$&=RX-C7QmIV#r=0}H`gwSgScB898JAB^_sMd_}9bC#=N92UP8Xp#u+}}93 zIQX>j%~rj}2ZgCe^uK-1a%D46{D_~lTbuEeW~OAujV$_@l)3rycfYxQ|B>Nu3ixlx z{{FxmRhXj4h(@K$=kfrSXK59DGwmZeC5V})PyNWQ5K9&#+UEkTw<r{}FwHl0Tz>_Y zT)QHdtqgO-c$CCgVmGJ6`qjOAaE&?4b;=pA^>AQ~o+n5m*9(xm<L!uaz?%dd`LPS% z{<*3le?;^C5zYG_p6wq;%XH-p1k4?8m9}3XrNjD2@;W-h1``?mC!tz#TD(DNmSAd& z7S1gaN;W;(yTDu+MTc286kco?0qL8V0ctVD8Ic7UleR+92=bYt6_sZPC10TJxicYm zmo=tq5kX+l6r!(dd4<20^WtF^M>25Kk}H>Z**j+1g$28x<j9_B>5sZ>0U&o*HG~h_ z_eOgoH`dIlwsy5KtF*B-K18#LK0cz|4<BqwXWf3AfOdd!`W6f*n&^0~%`~XgK3r$? zoZrn3(3q|;<4;-21qmmUNWcvFw<~y<cZS8XN}Y~~h2VhG#AWB$tyqNMj9cF?ZoPC~ zUcdHeHC-wt26)h2g}-t7)FlebE=G`b^KJ5z)N0Ztre29<L*I{gUv{>YT1oo1O$GEr z7Yg81V7`-p_n-~9zjkCWrBGMye0n>N&z$PXnsJ)6FPGO<J+<C`^LvPKTStN8wvo3A z`^%;J$^pv_`zy6oKf?~BpqznQMqz#9<tm%ms^vv5%%jy!dTe9P>j3~J%~E}O(xVx4 zIFNiE9?1;)t7IA~R_ZBw?#hTMr8*OdWTOMAWOsBJC#%6`10Eh3%8xnXWG>4jO^#I& z<-f093zN1x5&gx@!;cRk3dZ1xSr5as9K?qRZ?sF7nlb7xO*io1906OO!Mt3#{lkk5 z;yaD-qvw;@EG3=^btb7U0id0RITAW%8WFjgqS2Ma2#~QCT0}Y7hXsF;y_gwbpm$}N zS<hcpqiYD4)-Bx<CEuK$8;~GPXQC900E!nC<-bX^Pc)xhrG9v4mgxhzm=ZGyeb*W& zS3DvJiS#de>XOdl;tDA-#gsSM^A}>rgHi=)7)Jn8T_4-kdf(NsmQ&eCeYYtsTZx_G z%o+u!9Lp>IPPql=!-|AW9fz4D^&|j(>Sp|O^LEH1H=F0c6EA#keR%33UB`-b)`g&J zVkyL=96)!dM@)Z{Mr-XUc;8;x{YP>~rM)BT7X~utSRL(dos<0jSqx!yzTc&S=!(BJ zPgv?PBxermklYHzK_4-Q$nl_UQz|{e3tfu_psYFul$I$>mkB0|p)GRt&;BDR@?%o? zrVHWWc8Bj+EB{sEPB2^8jM6n{?&oWV-;S{uNQ`X?M2#<2RyHqh2m9b*A7^<}%WcOj zJY;5L_Sb7X>bG5}YeeWG9oevdWO~^OskBLrtmhP!qFZ#;yT{j#{*b$WYW?3YcdumY zq|dQCH?Q2=C|XkkXN;tfM)UO&nkB-8OFeaZ^~r3=Y5=rQ6t%VEV`07RkHL;scc`<W zCYJh`QBEB_@>{b|N|{4|&{VLc=Mq?w&|F)Lm@!TTkg|QHZxy*V>h6y@M*JHs{2#%m z|HwER|J$2j`VeMl8XaArG;zHdS<75cQ3z&G)>f_~OI#bqh`kuD-6Z!TAuC^9w(f*? z-`grv8?;Di7rnfzcBz1XcBx2ZFP#*dpblc>ed>%S!p{6c&vp6BT$*NXS@zkf3u{w8 zr?+N<x~y}^FGNcNXP*Z#SXIKPRX}k3t|h~j;FDb~jN>&L*6fYZbEgreT2}e(_0KiP z5FiB~ZGGvm9cmq3z{J_mzkie`q_AX-)9q8ES>}>lN$+=^i`WW`ySnV|*<Kp$NNSg} zA*3fi)DyXCdaC^3RTogk9f)}0zvn2m@;=bNM<;OEC@&onBw~2QM-Vh#w589o&m-45 z!FX)Lm1TP)#mkLbeWIk&^|alrDO6ojTHQAT?p-cDC*Nd+fb>Z)Ln8&`a|`l!j(=D@ zmEGi)8m%k|FPG)7MU(o>^xc_Ks&i7OZV?r1h4K)YZvyq1HkKzD4LJQke$5co6VLgs zQ&KWuF0*O+i<F<15>2ozyIlbS>P7H6HbfLpJN>-CHlNy)WjbhM$@nF$oXwrZ8I-+G zDgJsNZwQTYPr1GS<m112YyP|I{U4jGf46D=zF++Q#r}VCll4ci<sXnq|K;)iufu@z zo2K~vrxm{`;J+dJ`~BgMM>N&Mx~JA#Z-{G$+|;nhDFFqw-yFVXeC0)LixmFmQn`QK zD^se`$hd2mcgl(n(h@?9ZZh;A<Dy6?43>5>=Rxh4Mz(w^(6Tc)l|f@A7fS>k9YG!p z@@si%6bakk=*G{c$N%D^!T9ZuxUhd<yUjm<_W1uWCH~M&{vR6Y?{UjNwr(=;=Lpk3 zfFS+=g7{C4_dj%#|764cXMXmNuA2=0c}4lZ5VL+pXmgdyJ{Sjgxa}G@Fj^gN*W5Y7 zwIcs{TjBFHyG$HQ0gI({r?*bYZl^Gxgvj>y$zG8$slF4RFmI+UtZIpJtNrM428Xl3 zBt3&p-r(W26)pcdEOl5}WO?|^CRD7E6S%#F9J*=%S!)@#FCX#E?qbZfQ@x!lb=QBJ zt(6_gEzU;EcF_Cugee!2PqLV*gi$^Q;jw}cN=jkXm#_T*mOgzt{dJItr2jO*SW$WQ zY#hj|w%FZF@5@2R=lZu>48@yuY^&AQeCwB{;D%ItBTpm0v(rIA8B~!d{)E+8{%fLR zu+4y_RmIf7R7(hUx9oISjR^@PKcKw3kxZ%4b!uANPCYUIxIYY)XRPA*e!`+i>@CQ> z(NM;*e3yl%FK*N-vV8e=R?5Q`=}&&eo!8s%so2?f;*g3^r-{0LTXL%cv=AX(=*TKY zU~Mj)%*};q(A!~25?BM9@pI_i+Pb&TpYylER-+}p9W(3rc5D)&n)T*g8On0iC<tWD z`ml)(Om^&i5T?<y9=F41FlVI5eKMrNihFy0hp((R@BZ>m#IowqyN@9!>3)GrnF7|m zs%qkN#NDzf9f#1xfM7n=lXs?d-~T*2Pweyp>b*)&NG}3s9NuO(OV$Xx)HaRsGDygK zFFX6Ef^4N7&!MVNRShebXoABO6ci^aBaF9SYPXk$7_#UG_JJ<Dtjt-t677TP^L;zp zpQ0ljlxWCXU#SD8<Ng`j2YntaKR@WdcKr*1<NvB5&W!o1le<fBj8f3k#MmF!jvqA) z?C2(%+wi<o+muNh5^TAV+<u*Wa-{RgmPUC8|J0C$5_O1O&BagSNO->a(!KWGX4ks! zHMo{Mp_}ppibe8q0Z-o9WF-?Y%#~QULoI-2v*{S}GLKpH?y0`lZupkmAi<h|`lF|T zZwOsz{C(fBBv+A^*n^k5xzmA(UC0WYZd^yf18{D~y5-wDg4&&ax>LaE4v8_+?vod} zKt6s^RV$xBv89OK4&3cQXp_3v++~6xHb_ir6rDYrF*e_FZI8COGo!LO5D4qPR=YXd zO5V*@VTr0Rj?FeIPrUG!bm${-dxrDm<kpof#jBZXm-Oq>fITn4skJ#|p+{w>U*gnA z0A&$Pr9G<!yno3+1X+3BAL5*T4arK{(U8t@5XZutk4H>>-G#Lzy=p11Ik!&dopb8- z6!(jrG<>(ybZPf;rgmLTc7W+38DMi>ShQl~;pYJfY27|{jes<QI|r=Y-u+j7@IRFN z-2oHF_si+W!O~gwucC%ZPvR5A#Z3E`^vs0s-|r#^I1M4vtY2N#<AXSRi_|q?_k04X z3Q2xV6SPV_WQwj61y{xn%NIt+;1A|=h8Kyr?0W<4&Y26*>-nWcpOAW%%G84K_0~3v zXY}fy_`emKaKXYma$)#Hf8|dB91rq)<vAN;-ojg^X0_L1;v3jp>|AneST58jMfK=K zp9=f{{_?iWh?@V>r{Bj?41iD`al_3v50z1U44%g>T`OdV?Hk<a2;<Ifnwyib%H_Ft zf{$Q-v-}|R3@E>Y@3F&;Tok7$6Mu7aL^b%v)x(PL(!^A<zmtVG&M2kuDeOUddY7zp zcN-_?4T<X?d2YNMws15<*%k2eW}^4*Y1~~~z&`o#lD`cxGewF8V5AcD$z?|SC6FqV zvo@gGe{4f@p^mf9;N^}!HaE^uZ?iHG-Z!oL5msT*oN+Mf><oManFfwdb$oEz0rFi6 zbN99s+iNLHC`=9tN~WdP9pHx%3gN?Cj9o(`xVD}&s88*IcI)4m5xnO@2G&(~vJ7VD zU4&_-2PS!DX0MVZ<bNJLHW1g*715*9#=HHoEg!fS(-;o-R8Bi@6n)-r;0cJM)3Dvn z`@qz=Zy!ObitC{xHjE>8dWR?KxW*$4KAfvz{>4-07@;Q8omW1r{@w;e`&7_0k_f2X zcQvdXN;P1B#FW_jkp268?xYM94pfX^Ak)ZWg`%}tvh$T;O_m4&;8HsL&Ri50NgivD zpyZC$S#;Q;DF6z_1f0Us(f!h>78bCniJu#?$NV*@!m+^dj-YX2g7uBHqQu(|-FKD7 zx#h;|eF9~qMJ9+3N<+;|oUi36#l1{|b)~=tRV+roj~O%+@=fJ09Kg+${3v)D86?_O z6hPp)f4w({KOOqR4-rD2v^%Lov3Fg52ygS3hHjM`T{6#=6l+UPVOP*{J+8B4_R)yA zk0+M^L%X*1IiCiXZ-s0N&$!NBXS4fkF=kNZrJpifgB8M_&R7KLpe5_;esCMRTM#WP zKzujv@*;!<R9c}oV<{S^-73^OO%bq*64R(MBD)qk{z(4uPu=HXTrvmL=kQ8xG`}-* zM$rT4<EB2#d__#L<el#UT3bE!V*ObQWR7BP+v*QL3<%BLgxJcIZgpS6)MA$DepvT| zH>IW-ugjHx2)?_rEJBk}j0>hk`&>&TUG3F5*9l|3hR`-pYL-}#iM>tnmX5PeO08;{ zq15KPa9z*$xuGtOGOpN%GUh4>d5UK!%}-3jsdF-65mV>|$C^s38}Q@jkz2V1_E@Ix zPlP_W`$W1Kc4U|ab`s^iA-5}>GqN1RTHp`NgpFpVR4Y(_u9BmQ4n*rbTZ`zoV|BK+ z8C~rQ6aftEt;@AYqD)*yJgHh_3)m&N9!f!9bl{of=?CCd^RPskWzgQkGq;__bv#SP zR>R|4rHZuR9524((SFxk>5t`&xBQOhj&+PBzSQKWRDoz>1(;7mKhg5N(LUg7a>daK zjB5I3BaKt}PQ7w!=VPQosN2iOs{sVJ4^`NZS9<!hY*SqR<V&TwfFh4Y@rzw{t6Py| z4=U>Fmg8Y7$kNcZBBHPP>}#4{TG=*#<EJe&qC?{FIa=nFDo4s=Ke+JCF&pkSiCx&1 zLR@lGymQbzn&RbJwCU)bW`woTamCV}vdqyK7jCT<!B07D$7X&zb}Dg(L5xG<(WI-@ z2YtSnN151NLiG5LxZ#Y#X#Vki{*;(_b=uP_*b9{6UK$iu6@<PzR_&f|*&9LwA>Mo* zRU{Tjp(R=f+onba!l`{q6$9_6cDNq(Ui^7{8o}VP#I~PhKp-^%`Nju^>k%>@du>to z7H6?6?CmvJX*}Y;E9z7I^(L?c<GY*Hs!^6TDVj5udA`C|phHX#O=r$iZX_0n4PO@5 z3Z@zWD=kcnAIfVDzU;j|?W4!#p}xwfy=rW=VscaJG8eTJdp~hzwT9a}U`ui|C7&r? zaBSHAw)s{gV9q}W333h2NkNGg-Y*Jb+{1kI_MHsunh6TOM^pZQ+PX}@lWTj=7%tYE z2)`1+dj8P*dQ1zR92I`8h{ZQY(7%7h@@Ctb>DEvR&gx2Ty|S_AQ9|H-l2QUmp^TB- z=ZE86J%62cwG(dtdNRHFNoI?iLsXZn&-ak!{&<%a;Onub<)Sc?(GuXnCiZ#H(KYC< zwVpd;<Y+?9%Qyo6E(76^vu@VCIPC(c*{-+F#(au>`loAlxa0zy;i}l&3N$jZuL&=; zgc?@{KHqrury2RHw|`L#yps%0v~z4QXQh3E#l;{v0KEmf5&tCvE4POLjySNl^HA=0 zNYt2!YkdN<K3U%5uP_^`IOAiYPjkhROWHHxk@*N1;L<M)eN*`UsF!}@`dyD9XmNXz zVgfjVXk=$OvwSgMaPhohf>q@r;~njiw@JXd02Tw$o0*)`868r-gJ~cWVc?cCn`5Js zn5JupKd^m1Qz#SswLIlRh=Cdr4z4ymo9N9?HsAIX8d~D_CeiU2rA=Ed)^65y^X4sL zi{<rGZ?4Fs*_r#!$rufkMnBoYf;|1WbNd!JcDrxr&y!WS!0FC@nu028)X<W@Ay0nQ z&HpXQ-w!kRKZ?une=Pci3wD&!t=pZRy77v7x@2`@gnFb-<c(P#G}H@}Nk{KPxGI+J z6!t(fAtSfRz8er4DoC^}*k7Kyd>PRzXtXpI+gPT_YX;C?VVK=vvK5_CSgi%p(Xy-; za$NapB=|ZzOX5bhbyhVXiT+DfFQo9HcC7<fv8m4ug@wuLWTz`>5A;RJqo~BLNii(K z!Z}KG{jK;KY*)y?7Pq4+ABIDj)-T7sTDbUh@Y&xOj!dDd)ZM%Ty`pt58J10Cu#f=~ z`LX><HvQh?Wmw#@51oYbWXS<l)9y>$md?wgL++E9J>&VHaVBLtlKbElgD>IZhm~ry z5zTpe?D)#SfuqY;N}Ov`(U(xGh=22t54oz1i%ofEkB_n{-AGD@`|v^1%(H%aG%Fy6 z?{qaHmTI7Gq+nC9X_QG2SWyv!8k~VQ`;^iRF9Z~Vr=&a6IX@=nfEKgs(v3?tV6V|* z>Cv6b@dk5o0ukgDW0h~mGNJcg|8?C|j!~PxT6l}>JoDr|T&}xv#?@aSNPFkT$JnbL zipOUh1iay~9UcvOsI;l-BbPmO<Zht-l3CefNQR@G9I0fqt0Dn<aS7F579@;c?hbzA zG<1Yl<^t!HN5xW)zu|1vQi5=O$T#Xs0ra&*nNyHnCFVj#2$9-Uy7uI_(tp9*Uqfk` zn%2k9VX#&f?y*PWovivP8QMtkjRhk{W;}-Y-&?CsEkc6^b$j{*S<NrBMB@fzZxy<f zx_o+4ifJab%cx)9^GV3@@!dx&NH=@ylcHMM@nktgmjEqi_99l~bsQf&A^D}H>67B? zmC{xMrFVubq~}&#gOaUzSlX8^H$=(Q{J3ieXEezLt9xO_C>DFznVp}klbzX~3_d5- z?wd6|+J)*xH$M=Kk;tr=xe3{<A}kIimcA}GjT&piq{^-nMLjj!M4ow6>TjOkcw75k zwyoxLADN{;TX(XT{bm#Exi#w(S`Xf}LSOlL%DVpmCVxA|)Lo$$A#o`mqpfYt#mavs zE)y|Ed<f#Re5lg003rEgo0lnHT+kYf0^Fx{sm~alf3>^78o$0xF$2b45@fdde?A zM0$P6HEC*}<s>y!Il+$WtU{ZwOR74sEFkpxMi{88!D8jOOf2q8BZGIK_1c{E7l%0c z^5kq?tj&4U$ef4v-A5N)+_E8Lc`LGu1EWjL)A_nlo|pU>r<sppeZG;h4E#85{vZji zv(&J_u4$f3B-qhK5W#NU-B0?WWZ53<uu~h!7l5;<w~u?#1k<ZtR7Ug;GsM?0?-67R zmq8*~UMbe^mvjZJ$nwUY>ykLN<eE9z(0<3?xM@|_ldQnEZlr5EgL>j@qN;s+OT?Wy zJW9o&Y`pjG@y%@UPGQ|Agq@(|8hZB{^z6*pA5lg7$~dNr_@21?>E#JvWn!-{4Bm*5 zX_`Quk7z4*W&$UiX9aOwGf#@DS68IqNaMxVI;hTr_cKQ=Xw4sD^D;9%L6uYJ1ESnx z#&-n{w@)!!*ri%F#wRLFDPn~MEqb8^m))bWSOUosJZ9lKpZqi6G8iwMag=}O;PW%P zj!|B=<|--v$E~bZOzF>k&{kUZS2b$v1vC?fubP|MBy?lqF%`E53M-dv$6-hxTWQqg z!skxevS~SfzEgc1B|iNA@id58@pf+f`_*%mk+@I1Z|@ATb383Yx=eJbGZ$k`13!$o zWTQBo99t2+`}M#9AscNQ%lkH8TT0`kaUlhij-!H%(b+opwwN2KOXh)>j3kde<_yDu z!wJ-|hg)rvTDADMk*UII^{ZkvI)U0C2iGOXk!yPsD;9AN?ju?_nMw7h`}b-%+n(t? zx!}jtp_Iirm=0%*F$GVhNW&`!)6wsJM1R7!8npoZhGm5b`U*yKT9&5K@!GMup-l^w zBpZb3bE<pz2A*~|?j8}WXe0KVWIpDL=0v$=cV8Uh_^v<r33Tf1#+13JR)uuzhZNs2 zKIx1*HIoKhHw(Ey0cIj87vlHsf_&GHvXb`7!mSkFPi(o$$W|%2Y<RD`^~!shVw%^i zA_h4_2Nh3;0qRP}?HzV62Q=L%a5a1HJOcp{eN5$`lt(+_C&nAn(wNHocU{|2jwpHK zHxj9ivm602q6IqxXK@lJrxEm9kFcS}4sLFOhtyiQ`Aww1DgTNv05!(B%xg80g%o8h zz;j-}9N?&h?fQ0)ExR<&TN*p-%BafpGd&zSr_YzvtkLbF*(0G>5%EKb;LW#rvV{7R zq(a<SUOJYBYM`2?6q|o4Hv4?KOFZJ+F+MsE>uxd2iw(Y`XVzwcuA{;H(r&CbsjhwZ zV-NLrNZF2}#8*?ovj{s$uRabx-_VrKjpg71V0FuylIKk=L=xnNvkavX&1+=bPP~oX zV69jt3qLic%Q+J&bMDg%+?)En95*zXhgwcan>rIIK}^?|`hN;m30019Vap0Qf7ir{ zqLIFT5O+2<{%)PZFu0q$O|CFdo#uW2(EmogTFb6woqWiEV&Y=@5~?wF$;2JysG17z zh4==2$cAr&mkvuzU3=X<UD^qipO@ZDi=c3oS{tvJclS$cZf`KTQR)b^D%cCL%vyER zWlK5jW^y$YpT=KtHop+ZUm+~uO^;YFv4mnVg^oiE*$iTvp^BgPd!J1<coN{En+-qB zh|I#<9WcwPP8ZEpWXt?m-pzRhuf4ZRM|%2RcCWUWmt{9Gv7!0S159GI@K@h<V%ivb zazM$2%A&EEF_-UVVLfkWYY_^E9+ZOxxCM@<K$I~t(-H>h53bK-!9Cu2pgDvgTV``C zWe#9U%Im;y$38{K=V?au%5=+RB-XmexqZs;Oh||GQw=A#?(&w(!0!w25~3+)-LCpA ziC04&ReQhEZd0g{N`wUV<#x3fJyh6TKnAh`8R^t}NYyb~`)kF+UY{=&3q`BPCK~rC z-mTmrbRFQg*L5x8Uc22b@XP_X-THZ3B?Gpm^<Ww4xNg7Lxu5dVmiJaZF2lyj6Fzn0 z$`ssVPsY}va!;jQOHXSHX!}h2os~`YxyoP*mo9twilE1gJh;Tfcw)g3sk$d)y`A*G zh1`9H=&!FVS<(^AO=$yx<AD3|ftpe2?GSzW6q=rczY5j#{^N-a48lx4-Y?QnXj&qI zVo3vYG~PX{WHzwWcswMru5F+n@O2A+j%|r%jN+KMca)mV(4i2&u4?LD$&I}mdvkN8 z@_c97?TQh~OUHUJnNLz{A7Ch*pkcU)j*p038TR+-(2^?GHdHLDr4V>F%rUY8A<iFT zDa;_?yRCEY-IP>KzYGOek*YUf0?)r(>EPlBonjIkO}1B!wsS}2U!NEn4x$Qb^sII= zYqyVklLk|_DBdJfOc@YiUy_L!7tK~v19K$yh5xoo|NHa5pS*;-jx!a)Yk_@gj*on= zGkj@n2BP0T;87)|w1mT=B1^pI4d3>f4&sc6^*XLaK6Tn4pKN`uI;oKw69S6tznbR6 zQ#(%{@1h$6JL>$JM6KX8==5#{q4q$9s)5Qegz~pzO3^95sHdv`7eWNzuAJW^>^;E$ z=pDU0Jt=#9M-+=`kj~Yj3D(DTE4@ERbv++9xvQHjP_pH!aJy|z1;`*7W7Cm8ppmwl zJA)X_ccLFfY;hmAMd@HjEV>Tem1Bj{Y!Ym|3W5=F*84Qo0mB9FAZO^=pq|^V>yhad zJ;4h$i6MO5bLd&+p!H1?e~=B3{9@com*ZfvK$LAcWmjO$Ah#}kbG!R5e;Qq7Q)@Pz z*QVmXY)2Yb1!xuyY@(_~x79v0b_w12w_<PZ(rV&t0uKRPX=a1iFE|SGsc*;Riizs` zg~3_}N&jNc3|j9NCT+Z}$!m!zBIu3xM*VarlMJ!bo?7>5UW|c`1v8E4bF}?9lU_Nj z@;ZrWb=aO)rMWcO?$w9_J$A>qhR(*6Cg7v!Jx>NSw~LWboC^nOS4)~m`lWsB{@X*b z*EIbNudz+#R!?1sSkU<x>c0*o)HrqBzdj7?S++>l(Q5P*R!*J0lfe1o^@5p-=of&= zs9FnFNPMBQ(}VoT({EF9p(MHnBP(2IUA0}brtR3&qhD%FFMC}72oa})q*=OIE=Rl! z$u?<8joQ{eNZJ*%QTCCbt>hsJdZ~MZqpbV+kH+U%*q=6fm9?oR25yeFlr;qZ<xj!+ zhrNwAkF?fFo?H#PdkAH*G8E*4Yc2ozBX`3;6)VsU>hRy6qZV(}HehhyH_WHY?lx-x z#VNvT2Ge=}T8~^w-3=I^^%{MFmO$!iK<_V{bwXLMh=zTzoIa|slwZA5GHbLZArV|S zctGp8!=Xf$6ENG^mMVC1AV%!R(n<@5A?7{X)P4-e)6`-;P^#L@nrGD6Ojpf+n<V~; zAN0gLSTJ5$?__S*)I(#jUT3FNX}$hzOEWYx#1?@@g_|Qb3+cE$%Y{`%kb$yB&=Z33 zZMf{suxEb~C*R#}Ikb_aqjOgsK|?<_U|gHEHobi<?lZ^JZ;;*^JnUK<|B|Ab^I$QM z>8Q;uWW3-@YNK`#W8I`c^|xbtpH3ezanP~BpXLNSIK0?+xYrmXn#)nXw3B>rk(eO) z%R|mNrx#t4Ob=)h*XV!kFs5CPu`I)Ga-brfe1#2-qzVM#P@0~CARx$6^y^Xs9#1tQ z(_s>$<O0=e^S#l-k#=IfbxwHvVsXy!5)qS4P*@rOkpUVOhE^Rr(!xa!jV1wOL7~oo zKh@}0Zw&7_%^S{&73N*M@FWCJvOBINuHI5Gt{<F#pf=6*dDejQ$i-riv32vEh_&Y| z4llipSXGpc{XU+|LhZDubo2GWCo$`ru8zuDbZ=PCMT}yJkh7|4d$%d)U(eXt=kMH~ zc``B0-mWQsXjG54AvVT&Bw?d=#AMex2fteJLMQ_wwZu9_u|h|(cGv@j2#aRqj%>S* zUzsz<PNkk=s!h$)<$f_AU5HFDuVs0pIN7I?CV+B;$(n?KdV`~><js~)h8T1KXws%6 zD2^Z5V7L&!k|tT<n)oQY_93HF<VZvu59fqzWyO$LmKMAa$EAI*)Hxv81%HN@QcDL3 zXS`>i!_)fH9;ajf4h<@4A66OUp5IEljdaDGue@(rDkCc0S)KDPCqZUPrlapl!5N#q z_Lx9b#yx>&3@WvjPAghn&P6M1U^&S)>vK~|Mge7FW(Ib<*SN0I_`<@s)a9Q{2S1#c zec4J8OqL;{;<4HY74IN!Lm)t#wDlcBD_0T-T64OeF+4D5PE%;lD{yop*z7IW<KVK9 z>OoYu^~4pfdGFk*){m2JBO#Y<g#DnVllnvCm5ROMW!mS8Js3!vVXir_tPYmGTeaoa zn0ZQbk+<777_n|se7vP2s&j99PkgU!8gDZb96+)*dw&!*#PIq;-)`1H2TZjyX(+EF zY>3Nd9k3NZ9e*?~8DiI~(iN2HKXv%SmcXK2r+-UlFm^3iAZk75i?B|YxYPECJT-60 zCb%%}QOKRB1}D`LyP=R`<ut!=RpWi3ts8q}5*K{wYoKf1*ATn06MXYO$w3=6&*@2- zse{?qIQ(T{nc72zOI9GkQ_KC=EFc3lENG_%K1WD@;eehFbaAmZrPys7)i<kuC?b~D zIa2R5<J+0iryQLqI(oCBe8prYYxw4HgP!6tz5qG(mZLh~$%ssSu`oVNX&C8OH7jD< zM|dsmbFV4RaJ~MHgb!9ZHTFjJ(dm#+@2&$F;CU;m{;7xYKI32XzGHAaWGudt9vo+w z$n^iQ_ug@BY+1S}J`Om7Z48)f0|t{#&Tt$6n`n|q0&H>;m>>~EI1c1wlE`3#$p{$% z5=aP)$=M`<5E(>}$T|CRx=+t<rtf=idS-6V{k`d~KdMUFsx7V3uC>-)d#&&5rgPci zpKDpq$};UGKG%@0plR-dppW=XsH2fjvNtcAQa|w9&xsFATvO>Bcp<U&ra)UVxvo<P zNg676c~TclZ%T1gFU-67q>~Q}bsj^G1~&7lU&72I`@UwSp1%D!w&SMBw%a^YCE49u znisw7cNF{MrRjl&NU~mw(Zj4$6eR&y6$p0HZ_EP{O$`)jCS`286Iwkqs+?JeN<wMJ z>I}J=q;1|A6)t&4ihv6_hwcbrNWyiMNFtvp9+&yaciE4vN0d6?iC>2Na64M#7jW>s z*~>2qpdEQ(LfHJlmITnGuGul}<1m+oyekGbs*kEVNedqH3l5;lnAy+XwA>I$duuH6 z#B%W>$-CvGb;jE0oU@XNN5acD*jN^w1eO6F>qttpeni`xM;V)}3Uz|ck0(d3MOl3> zy5?>A0?b4_L^t4cc^%b0Go5@ofmNSg3iL(K1QJNY9CC9Ywd<1-uRH1#mR<R+kYxDy z)BB_8q1Oll2k)+vvU7^1<(lA~pAhCM*ujD_J<O5o!Rog|%8!ycC84O<W5QIOL$MER zA!KBo*g|(JQ|ozGya(SyyU|8FQFX;pn22+?yL4pZ=n1YZA0wH9s#n&yv;JiNlkX33 zSm&$5L_eJjwwc`o$nc}rt;>;*oo;0EUPYHOizj~D%{Qv|r6N(6u7Xs`hW(ayR@l+y zeulMQo_-NFlynRz3Yj5q9Ic$DDDU|59ecZcl6$%Y-X>!c{8@wNRqLZ_%yHj&_2{;? z?bS!O?$7Q5$&#q=ZkDu-#j91@ozIWMFW#xI?iZ~^hk^{;)eU6KhV%=gaca1`6StQA z3+|)bpibKUWE_2)x{O{D4E*(xwz!A8Ojq{_y2PW$l^~;0*j|-Ew2fYihwNM^8XY|X zT^ruc+!w?+9{(!icDiToK|MM3uN3+pr<ZTLv%^z5*bib^2p1Ynf@r_59~Zojwq94V zte+{Gm!J5u0X>01d~g$MJ$q#%z$Op8pjoG|>R4ZWptrD5)=H*@31~dq?O|Fv@QkR+ zJ`1O7^gb^?qkggG=+yGR6RY){K^9=ghH?jOSohLvVX3`2>!BN^l7YHx*XahzJi&MZ zw9LhcXO_O-VK<M=NJunwz7V$q@vbowb0H*nWge*L!S&1<-b{_?hJJ5hPT!9xE-<x| z@?20{%KXt_*jeELB8Fw)d?zRWt!rQK7x&%wAIe4ldrd`xIuA6Ky!b$P%l?6P$%KF^ z<dMjTu@HU|G`Nf*!V$WrXG{EN!1?N@ZU1KSvnL~SznSBCV}X=eo6A5nj=S28MY8R9 zw8laMqFc4|;rm_9Yu?ECM;L_3Xk*rol37eAdw>K<wHsJ?`q*hKlMUyo+U*bm9bRXg zNvVO97R5Mj_G;i_B7Gvn(;TDgYF9u0m3!XshYK$FKg`Ykzc86tga!0)XiytXrIvN} zU~J!*(q0+%fvIKMi3fI<`zq_tR42-}ABX4<eLZ>d<-r$4OFDLB-FX8>4}>Qs-h0vv zgh+GfOESDO;DK|@K<muaYR*`Rr&)_w93eAVd~2#OA?qwgo7rBohkJKNWKkLwuk&8- z_yb;C3qd;vFKq3Xn#OG$SeT@1eZht;epz!j<Tga@lwnY2wpDqssb<ss<|VYMU->Ou z{E(+P^8jw}o&BT#U6uYl-uX`eJfEiv_hg+F^1&@yB%VHxs*pc3l8G;nGWntx!7+}0 zFNjt<-dEv+c~y0jG!%h}H2{j3%oLWhQ>%!v0>e$xc$LPwiB-#MwrBaxt^uX_J|k#D zdSJ0f2WBhwQr?}Fy`^kux9FdVwmJSGFfU3tKI7J{*DPZLdwx<u_wHWZuD2POQESv^ zr-k=MZ$2U9|345H{XQBlnkkBiyvt_YA9do0gE|lv%Q}wQ4{pyK4%d|{!B4uXhBxSL z9VoNw7#S)tJRi%<`1Ox5bh(jZ$G`WKXW#(Ca`kYio}PDTXxjF=_V4Y(M6*5l&Y*V& zr(mw~b+w}h4QE;IvF}Vz__meS!m`eS+m!3P>(AUy2|3^uuI(p3srJaH5-1<nR`iVi z`cvU&e<C}g`oC1s$ieM-q(6T|d3!w4m)0X$+tWIB{CqB?V0eRO&bYBEse4yAqig+G zPqM2rXT{ozSeKRJnzRb!PrGau;HF1$L7jPvbYW}{P6T2uyk?TBp5gyGYIL>Bqol$G zc8Sj2UCh0<OyBF73w=Mix{GyAC(g87^hVq&H$2>1FAs`41JIy_2fngMHyX&V_X?y9 zR6D<Bff~C<F&gyz^-XMuY3un`U3@w7f~Fno5Yd-?YG|J%o~43ro#hleqqu8}imT0- zIA2OS-X7f*i`A{I#C|Zan;^GJ=>EDGB;-fye&p=+CUPmV$ZFb(*DL0BFVAdGTbfmZ zEXNQ_tW*I1-YZ)gA`oXXj<L6yBg`ce)UHU{%Hg{E;HH(xZwGXF(pthGlDV+-<O>T# zT0o_15`d>IP<h$k*_m>-0>bmQ#rBI^JJ*!S0DDH;*t1?op>T$N=v}W3%yQWo39qg) zf43AlR7_%6+f7{{w>#A}WN9{$ENr|Hq0f_;(R8=NhS^H;!_|0Ug^rqwDfaiomM^)P z_i7UDT@q~s2Wu5q2XPjg<l(M!JC@pYAI6_Zd%vu;EJm0q=0)3J-Hf%Y2}=2WBXceC z2{N&rZ_?L%%h)t)zV$sdekCJZnp)Rx?BnliPj2fmGl~VM9?I;b1lSIHesYEO;&R~! zeGTKE8FPJy3kb8_rBGfWp|GbeA=TXR3Dp;7S&1wTn?_fNcjbwzs&aa}lzTgHX4IRC zXM~)p&+YKm7B@|`Oy<v%*L^Q%72`2xl1?Ff6}#OBdkh<HX_ti4!i`tT+<0>rJXR7Q z@}f=#n8z8ya^I0!6sZ04!g0fwwStb{>q7m5W`Z=>@&?SeDP8qDYEuUkVU?BLjYaX) z4k^{PCYG6Ak7ZNYaUd@(BZBzV+EuFEEUD_M8V}}_D{1^;A%Hd_Ks11lJ)Q~H{UhTV zR^KH?!9F!1b=3YgQ#Qvqg+7l}^2tS5M?Q76hXW`t*mkJZ+C)#c)E~Or0VHrcn+UMv z<UN(B&#fP-6DhI0e1JezI4A+zRX5K^C`8SR+#7SbPR(G=k~~Gk3*74!%>=*K6bUEM zehmN>Zy4vhKdcO~i`e~aU@U4EeDl?qy!eu!m)@kg@tYpW`7w*kZ>FFgg*t-h?Ub0t z?6?*#@hC1^LWmq@-*+z8&f0j+I0H{_+kTHE6{g_KJwqASRbA<ODH({JnY4^i^+J-p zTLQo6`Skplz*<{O8{6NSy_q`8ecmYC#2;CMxn0BaDZH68u4Z(_T4amq_Angm0@trg zs<AkmKk4-IW-?p$4bAuJfZoDIN6Pe8qv~BcotGb=+P;zQlZ;8aX>pbOF`hC@!*{=! z_W+tX^e8}i?YUz)09n7@%>hi^H$Bb4=@+m)(c(kt5Y!gAI@*WzbRxw}&4`tHirHoG z=s#>26i>I?Fkv!Iy7MN25iqw{<)%}CB<p?htSC`?aSGb3DEmpJx$5bt<sLid|7O;W zEPend_3rZAh*ke~-0B;RlsbjZmCLrb$O<kLuWN?qemPFJt?fu2x`XW?f)i<5ml(V# z)AcXmeL13~MrmWvnO=i2h{)Y$uU-0zE$BUN>9YGUTMut%7ycJtB-g}!m{ffadxu)= za=E@FZ3&xK;&M*;uZhv7RqbgY)M?|5k1PZ{6N-f8;njAzcgo>KAEys!ZX~Ui9s&1Y zj*2lV3o<<gt-G$q6rQje)iwG~q>WkWP_xs9^dM^2iMm}W<d{aBy4NCK7jxi!dvt-L zA?KC*m5vhVT;{CMp74_pZp<bmCqkn-@m+Kd-rUTkco2EC1maWgf9qFgNjamobQei9 zEx2S81p`%7Q?Qb&9IVrn=lD$~ZAZA6iyMbcZRE~Ns|H5B{^tcAot9QF%)qX7WHWXA z+XX}uP5fz6>o1R@(t+;u#vp-UJ6S^lO5^;M>grUP2_rrXr_|LYFwl<1gSQQCoD$Nu zcN@@zEz-kH>^Pf-4(<8LD!Tc_FAD<9N`jPTt#`CVAJ_y}*PgM3qQs=s@y)lPfz+j< zBZA6muQ&Un+;GJScRZnqAU$H4!)hmg(vy|ir!!JvQ@tGEJ*MjEP_AI|3Yf*ycphD{ zV7EY;;4{)EgqVwaIEpAI+iW^nENx*|ki^8g@H{K60hK%7zbXP1S%k_f51yfQ0~4^R zvCIc&IcA*T%!L&78j0PSh<3=e`rAvOxYFHAf<v=WB4VBXwm4tr9a;meYL7Dxn5r5h zDS6t^f-1)RzH0Zh#Zs(<BSMrHKKvnR?B)^2dmr{EyJF}AuZ*J1rGm&+nP5SeJOStG ze8IWFDy7ZgiK-#^G%+jqG!|9Aq-^)1R;tI1uC6Bg>$K5t86%=mHn$pfVnn&8D-Oo= zP5cfd3i3H@^t4>+^tl4x^CDhqNi9~|B$@Y3`C|v=zx<?<I=HxWdEGf1QxCM>0>18- zoE7P&6Zb8D<m2d*om$r0?csv$nC`EL_DHq7Pb)UAp-^F{07bxy_R3I|pG=Pgn?-Ba z=-a>gcQ7b(H;D@d+TZCoE4JB{kH~J>ynBYt`w<CpJ7^W%jEkjzY(rVINK4kMM^dL` z-&16a`Rb#j(M}`3kzi?+em+#z^8OSGhKo-fPs_S$#v3`bEHy8g&ucfcsgNUVC&K-% zK^oY3g+<skGZG6pT3O?@k~UDJ_c>p*6>#m_DcxdsD)R)3^->JCd%gbh<&bzmJLYD) zLyGq6lt3fqQBxsrU1an~@6)oR7_;J>YeZWSZA$4`tS`Xz59jD#AKvo*kKvj*XXwft zc$8f%-SqU_0o%YA?5%CF$=Cx;DJ(yN@dv7}(D+{q{x9d}HZ7Iv-fBDf>m9J|XLUuP z<WATX{Dm3i#x1V65BEX$S!I4w9YZIxV}MN~OEm4-7yPe$J#k{V!TBeWmVfEz?|1Sa zPu>k&hL}`F+Yvrn?FyU|vC-&Es*=|??D+9x3pFu{;?EoYteWt`%ye8sctfZzb7F-L zJmD_mw>;oP(q~44C@toN5tLlFAUR$LRBUD8W|c?UJjPmKv4n4(JOJqRE8IKY6a&2a zUE-hr060#6+w_G)dX2_vLnLbGh0-$*`zK4(uD7Zn?&&%%QzHsp5k^GtE<l*>e#UDd z0q_z5j2|V?yTVcU$^u&fQ=6P2Vy23u&btRKPWf5IRvc{Ql+gYsPqas1$0xJJt_WSP z#ggT^{kAhFNYX$Lt@T3G@rISRX|%sQ87BlF6G2HB3Ovtan_WO~hu@t9+IxAlrMCuW zs=sg8E&*5=JSt#w1H(j=iy*=r<)3wNrjyTB0Q$5ksaBaCh632i;zT&KYWXB$_f>Jk zVn#`L_*#p$yQq9V56i2W&A%GhzreGSlN)qm{6UhmZMaI8Z6n)&x#Mv60Ov{LY{2Qf zDP=!A>^M7?x1>1x8n>%<&%Hl7xbQmmu<i^Bo6hlg{6=tq(_};fnY@k+;r;ys&MWYv zOj3OVe~?_<$UfIe{M1jXdbI|jz{Eoi?<O7hpHw>`bo-prKdD^$<aW=<wStazf|$(| zq^*e?eEav4|9BYh4vT7Y+dtY1vxqMGwYN6O*9mP2B1@ayZl78yuM*Tgax;yY*TYnv zg(jwn0Z`~*9$Me-gyGG8B={M{yy8v^a04;~g%Wh-D~QR?vQc1SF&0%Eh0Li*U3W6l z?hP#5t3A4oFaATM|Br(}^03jT3fJPb9gDM!wIg=~hi_`mj9%;4+D${g4;z}T46#{Y znDrYb3A}JTA%;chgDsL~?zKJFZJ!eP2@G;Ka_AYo1MA0jzaYO?*vMZJXD>A`;A0{N zwjN0~*>4?*U+28-2W8Z~BnbTKULm>1`f*NvC`)Vu<bmnDx2oEitTh|#qL)}Lc)!m% zx2$CGptUsAe3symZsY|D539}f1?_yMYkk=^caNy(7-{8G$&nrpzV&`u%a*M#FUDNf zYiV}ab+CqCrabr6@}HBk|6ioN$vvZJCYq?Y#V(D!5`sMC2%bLBp=NHK@~;nS*6;Gh zy_nfM5?tPZ;wCfK%)i!zkxGrxFko~|Zs74M5TQtvt3?vAN)x)0QZ@3){Jn~PIS6VE zE!m(x&%NXN|3>!bUy8>hPWF@y+`>Z6Z^{?EfN(9^)^lv8fFOnzBA-FIFTb7@(1R<y zFMa7xA*Y6rMolStR?o-H7&;)XZc$UlWFxcjm8uuD#oGL0okf#qR1zS<A^(<BXO& zqcA*mO+m8>l-j|%olXhp*WidVJu6F7uAZ6h;6MZDB+)!ESQJ|S@OqsT-t<9hJt(Mu z7(20ySO#R)%u<JEVv=M$P)CIUhPl42joMnWDCJoH!r5I?3cT17qFA<zzm-6`Y@CFi z4CvW#XwTbZfb>bM)+HIj6XA(#`lw0&X7hB^A;u|etufI^%UrXmE?>0fum92mk!;If z3nZ2J{9}%F>{QLz0%O^g7_VizA}&-@7IDWktU;%WYrU<)RxVzlHofnZE{p_LUAy$h z>iS>z_J98Me;haHzZJmt9|3~wZ?T4#O2&y;gN=HF1(rr1`<s5V0Ov4iCYskNHp2WL z{DFS-<=hEc+@&USiKPk62~N$C26&&7nRaQ{_>$r@Z;zZakheR!OhY1cqMG*dNk2eU zhsoen75@T#JK154i8TF(7AW4c+{By$Ip3!dMO%0q8S<i>S4`}8k4wsZ)>&!-o<~LF zxCcDUvde0o_S8;2#2O>-ZuaZ|AtPr*5kV*O)aP8oX{@({bVho@^iioc{^*)Q%Vu=? z;1&}|0LAN}$txUiVL>U~$fr%y>g#Z~QtZYpch(81FpQRs!3*gy85GP=vWeWZye9fg zzkXV~3e__O19h;Slu1c}`oy_sa)Cj{E$+S4-?wPwZJ<T|;T29*BaX|<CY0fuT4~a4 z898{xOVLMy>UbD&6yCYJpHj>vgYW7QC&ILJIwn#x6;eHPqEhC6n?*m6slmwJf_PBQ z&0A_abvT<t^MJ442zfpnLWz{WV5S($u+|;v=jw=Dv5HAhC-W>_b5s$um(&-v(ASYj zeWq!fq2pUouKg(kzw|n7R<58#f28hLcV7Nv+X#wwKBo1C>A4;b;kCmH!s4AmCb3n1 zFsa%kd>=P2S0OwJLv%HKA$bRaWeYgILEloxVr$;}IW2NXUlustyJT{e!HI)AG`y{x z;Lv^?7%2K-@XoTpF7o5n%gt!L045<io@PVB^OomGi{_8!ENd@p5U3+zcvYTrQA$ci zfnUDnzf}=eQGOPd7nNi;DhHK0cl#>(%#-#KHXk(aAOfrc%#Ko>5i>kon}G^hWySu2 zaW(QXzx{Fj|KO6Oe|v}i-B*`ydz>OuI+%Qes7H<)jbrJWHxwqLqpi0ltZSxuNk?_q zb!;Yjci((<uh$zi0&Lur5(M@t0mg=5X2=?kDC~)<@A4$fOgyy++X1Z6HgPh%v+rl> z)O#A8jGH?Nq5jjt&AG5PWjs^;RJh1Vg)v$!;AZ*BVQlnunXJ~D8N+q;i^V~nwHo^m zlot%;X|L5If%bb#`}a%xf}XDUM85;Kd^;24E_#x@Z+WbR*aD07;mdr=l#O(Pc_qoe zx1DYDfa!v@n!{ZGXOB4I#^p51Ii3og@z*3aIwOlW0<M9WgMZ_gKUz7%HmIYV0n$4M z>`j`QfnY>!Vi|_Kt49Ro$vc~#exvUhGuNmw>D5AKY*^=h2;}2<PiaRR+ntat%V+xA zDtl_%SPFE^to*%O5?>6u&i3Z&y-8Za0ft2->rmrU2lT{FBgfEh1GgAO6>)>RC#P<f zzc{UF_Q2}}7C`3*q~CdFv=T=vQe=#Te8)R(C>F1S(o;5vGeBFc39$qhRUh&b(mn7~ zwS*F9)%E?O{Nem4V5EJWDV*b8^LLagt{D1o>0uZ;Nn-2irL$j|(Hnr1rh$G_)W=j0 zAiV4x`?$;;h#t!|*?eCELgO}wGz9!CZ05AEA&q?9iD}MDk{i@EYFI*H|2(5tB%$5m zBUOzGi^%7(Hxu&+C%~Q$EBl!B^Ls|720i>#Eg88+e!Vvv`K{e+;oXO~W3;w53!FK# zVhRv96%A{_{G=8E?u4D>Ad?Fp?I!Cz)J<$rS&nI2L%kiE`Y>PLTlhqBWWOsXmji{h z#0@O9w3}f7#5;eI4#vwbw6d;~2x4`6GQt+onOM^<#b8J0HhU=ux*YfNaqcsR8LcZK zuLUQ`Ru8egECr3%6UWM8PL#mE`DAwr-ROq1gl=-h$PQfJGqrnesk(L(1?LexKqaat z+>NokT;;zj4f`exFT&c)j9P+(%MHjmS96eQP*h0;kXXZHc(tflAlk`WDdw*|8YPW| z;U9e6IuVv!^>l<dSgU1jYi#iM1+$U{VYx$*p!1;|KdEA&TN|Az>1_82;#0A2r8wYE z8ovA)=;+Tw@$b3+kF)d8j>mLL#g!5z1TC6hJy;I+^*|LkIn|glvqOkPK(hg6`(eMM zfU{YV?ZgB00Cqf27~8{3Yn}!I7Fz>Wa6X+?x6HjjYYWd-d+p3?XBf)#fy0{ine?_w zY^F|xHAD8ZTs>9wKdo_b{QL(%Li}6&nTtSPE(FDQ@Vt@{A6!g087D0zUrI;cU<e`A zadZYcTd&0F3uJdb>{z(rVQyOh^0c;VKjY>y&nG>gt7<ecxwPx{2<FE=Xr$;@z4=5w z$s@^j=hgyDN1DtyNW(QEqBHKBC$p0Vwk2G%*Vp^um&=s_o29+&L+%wSh1|k=KP!7| z{enSzsF9=6LhMrKm<&`$aN0)j%}yfSsIZ~yxVT46$C$63@8|E5`C#i}w-b#Y*PhvK z-H@i$J1MF-jNg=;fz*CXA|3#q#xB+}9i{U@+sw7TxW6!tg0L{U7Dw<}d+$K{v?tl5 zKzFb;uEnb#aez+q2W%^+$A$ULq9`2l2;!MLtlkyMUU4^Qpf^lt)<wH$be{GpWz70M zyb5(BV79sJM8hkntKBR>2<UYN3lJ<OM)fMQM2%B2cFy=Ycptdc#B!x$IdUN@Q#<`w zL=I}V3+xj0AjaNK<{EZO;k~{4Q}<6plH+nM8%dr_dB_0sR4u>}9Q43H2R1QN#AOs0 zO)lO>^?Xdt1Zvu|4Z6i@+yICX-GZbY4<)7fca;rYpk~u4fcsz8GXyU6>@viWx4vg- zSXWd)-L9+jh>BlmWNZXjlX5M;znF86rH@I#F;u<D0j(9o9=2#Jr3=HjOr@Gy+#fZf zAil4U{p?8x3))Jyb2v8dOS+0F4!}wJcIg65cy@|{;c_#0P$O@AIZ#NwOF+Fq^dtF8 zVP#YR3{UKja7FHoy!VdlzBz2YtYWaO#j<C(sUev*&zq1rj(E~`sYqj^t*y05tqunB z?-Aw~N>63t<70e?jE#x4iC(o(^55uQl6L6M^(xafG{6w)&gy@_j_QEQ8;pmgKIJ<a zXTgxw&a!%$Z-FK3f&qGCK}SdmqUVv6Ds4p-s@v&c7d2w6^xc|aS}I=Wkw21J(3y3~ z=GZ1($^Dm;Lm^iFX!+fdJP?KwaH#+F$~Wc(HxSPIGZ+$pk($>YzJ_P6r%&mw=&GWa z@OF!inQ_>a9E5udP7|JY$f`t2xYkivJ|WS1nJ@x4U`o=G?jW`$%fo4bB{u>J;C(~6 zRAYd;Ju4Uz);?|eAhAI_;v+1qL;*?5kyzYC=&q`xEC%agBK2UCrv2oXN@;)S)_(?- z{-&VPzhjC1M<Ik5nuTQ7Es&!(Zhi|?^I8&a3b>A*J=MQa)=|>DEmY~mKxKq2shcFS zW{;1C<{B{~37P`DbHWcP&RcG7)&b}aM<pgT^+T8iyX=gTP#htK1k>J66f{jl!3R|^ zyS^rtOhT|<nzVf)X7lnrVvbMU%-h$76<ss8>c0)AbHuqFid!E5PzRw)^BKxfO<>o8 zCG@9C>sq8|5^L-nknARqZk?)WxUpu&|0P6qby%Mc?26g#8?c4z>1pk(@Kq9ww8YV9 z#ljB<<mDAe_9SpSV$SF#3n$v%REU_`t=fB*UL-w`{&;=>GaEfx#y3vq%@XT!Fs81B z(yiR8ZXpjz$Hc`U=Ux2`;u3sDQT^kfmHQ=fDGnX-MUzUG`~>Y$3vvBX_PGV>85%5Q z0`vpJVLh|_qtW~np1yry=Xf6jWKsX2ok`-eT}w4ZB5r5#s0BWr?2UC)@0V@1vhz$M z_kQnWfVXrT`@2=0aP){YYSt4o6}QF<2CU;Rqc?Iq%alk7Jv;tKyEwF3%kl|Fe3w#_ zN9mKEliecbmi-R~#Yr`$LTiLTsOgg(d0|^~wv$uKZ6JU7vy}pyI`0Nq!XTgAN>4hr zp1sf1zQll`+C9-d)QPmDDbOrzWmS$ql*Tj+!&>quRA3IR^f7+eYCkC)!{&{lHzk+4 z%@kuCE767}mCZy?aW{1Dbvn2vd1&Y!(e)bFVo|4-cdww+M|ajo^E59$kWcdt>o3_H zav3^lEhKzNgh+ORY^hefd&)Bm=YcEVJ)iSU0*VAYyeFmyBcZ9*O(s!VMfq|oiaJ5H zTPnazlM~IgZMZ>vk#M~8ryOTaB!oYr-O?$XKOWY<J*cH2V0Pzhr%p5lRKock80tSU zYrDmdd9>usl^@3jEhz;0G0klBuO~o_E=D9roS`!5d9<iYZf|)<SxD=R68+Q(w!7xq z9sNn?|5}MBTCq@6UHH;PyQn?M{<HTDF{=Y_o1}!#?sef1ys~B>opU;$y$*+UcFi-W zgL%8;1swjk@s)};bbn_s@<T@HIMFgjAz(7)w0+!9p1{#<^h;E0MHqTNs9dm$m5y^O zo{2_;_R`)^s&yojIf+eXZPMGXXEOl(Luu*{eR6)TE+F8SjKTf9P5BMQR3;bjp@Ppo zP#BD<y*-P_*;|)6GdcTv^~$U@;pP2o2}+mu>0TcW3NrtZ3ia=(rT+uX|8YJ9D|cb* z3|j;v?pl9#`z@HglaZxIxRlzRmV0I8-6AjKT`bC`4Kax*G;w;|7CKJG6Fp`{?^vKi z(VE&-CF0K(h^bfzE_1mg`T*2hmDtO|K+Y*i(l#-&aGx5?$*emOU-Ql9=Ko!`^FRL) z;C=rFKUse&rtml!+BlKrkDUX`SKYNa+|sbwo$4K^I}(0fUUBW^w;k-^kn&;{i{RG7 z7{H;KnJcDKK;0bVJdy9BSO++fTJY*kN6){h0l?{u+<19qqQ#MN#_J2}&ayF52dg4W zS=merg1*%4Scs}Zzjp1%a^%rd`5}vjB)eIjl(?*qFi4_*^f1COPPf9#1<quVIUZ74 zQlhZC5dUz=8kevn{N5kb_NeY5c0PYCuVM^EmKV3@L#x`X$gc$s({>fs=EvcGbd(_} zt<%PVwehYiiQYZ^ioS+Kvy+P#geo**aUB+ET<|`mf@00)@zv7464lBb{i?BdJg=ze z>&dUfP*btGb+^IN!$nZ`Mp=#u_n1qbSyD<w;xpUzbiTCcO2BxBF6e|BZ`xvYsSuN3 zBFXx&ArZ<Vf+Ut$VL==ar~DFnNUqF*^>AI<iL53tW}@AHXsB;kWCkqk-2+O^t3p*K zEcy0;WU(^Vuql>vzzT`6W7oLM#&uj}>ub>(?6VDk34B0^_4(J0w1-Gt@>kvBFwrLf zrxR1>e9&%jzLhbLot&$q>ESOPA`jmMx4#<CKV`fh7M&65pInzPQe)>(9}CGo;;V6( z>0J3qg#m(V!oxefQ7k`%D8;jT`Eg@@>ZXQscK|a(&})Y6+G?DUsh1s2g2OszbRHO^ zJx9jRoL|zaiNKwMP6RR$I|0}EB^n6Zmhu_M*(cTSx#);XXDpXx_Ct-FR2$l+jITKy zq~3tO>$NSN$(C`!0q^ywG^rGp_ysA0lJTgc?N6-WMaCZ@y5J9kW=A$I(I@5GlyUj; zjSNmH>B}wd;rI$6d-q^onE!zzNzjn`vVeUksOWeFv`1Nc3+cJIp8R1VdXjbT=?S6> z?;;7C7)d!*r$|f+Sow(I=U$Esq@b$vS?I50kW3#MN45<;RW)CFol<Vq9qGYgXLuuv zH+YASa?$ra=SN#jJkJbLs#0R9pf&3zoz2ond$?(d!Ohpy39GDJ7n<|Olq?dp;Ba>M z{2+#ShU->0Y9OU%I{8kyaJc!rkAHaL`H$=&lMVOdkKai1wgo6ryK(vzZLhWY-p-~I zturM9bK^SZdnKFG5*QLcwj(3vH<D#g)@<;vy2$H70p|hEhpkn9ylkqSL*4DV7ol$z zNUbj|7~Uu`FncBgWAGToGq6Q|Yh9*iC84Q-n(rUnRynG*ztEbdIZwEDmz2S4okUP8 zi-aa3Bg{dr=t>D*I={Yc%mR(w0MI=<Wpr3}!~;-d47_$Prh7-pF|IIrZ?wY2jA6_; z|GaFHl6q4aV1A=b&H}$X<V2X(JF_8qBwleJ^!KQz?7cN6m~|XmsIBh<(d*v#x-)8> zzFYEOM31|_c8l0`lam!nfo8!+0wBII^|heGB-%t-I(%bZ=$$FaGL_nc)Y6TRbg1PF zi<x=LH#K{C5rH<zvY^}j-j{ny-jkPg#Jf2~{ma<Mu6Gsu8;XVF*YKSs(?#R72p?Q$ zkGQ9fDFIy#$9y%PL@3(S3bZft>y;&b$Z(0ENq*Zt&CcC<ubDT&ZiSKFntLc0A&gPq z4`dFXd=tQW7HV|auC2T3?>XyO7^t$6YoCJ^SmT}3h@@B?HXWk(#D*=KG}Y#geHG0O z_D#4vApe2{{P#yVJ(WmuV-uk2hBDNcEb)qJuBsD-%cU<jbZMJI(<btgjiXJU3V;Ma zBG@KO2gKXi4Bn{~v1WqxNR2i#P|?qp7*=7CKNx1&B%D<kWr=&F3FM^q%8@%1<f;tO z6Zru@sU*gNfBi2T=$qW66I;<lvCUK3@`I3acHYPt-+C72)`i+u&+j^&dja0l-tulM z>)7$NtX1OIn$S5H<C-jgcnv}jZR<f|@;;2(BGe0_?8WuH6Kgy&kb}j1>)Vw>*(WR_ z(DtM2G_QXDiRW*93@Q~5YPfBAWLNGQb9mqSXorLOuDfEaXH&^k;x&WQ1)t<~^`M?& z2s>ktO?B_u!1_~@oYT<J4VDX(=-<w|5Ou2`TCd+vx11;2=E8v+z`(NXtJ=;(zqg%j z{P0GdNzWbC{jgWcTo|upE2R*#jh|F}A;Y$YGlvYLlGmvC*&4c2+xc2+$>iXi{b6qb zRI=FNN2xyJ<@2?hbms7P>j^4714dRg)=bO6yf?=C?_aoMb$~T<QEfKOy*JzRIIZ1m zWTj7wp|DCEW^l0J@+md7*m)saoFYtXrG<IB^Ln0EPU@=E9CLC(ne~GPcIIz#@YwRj z=!#3teC#@)$}`+4mLpN5x=E>vSHvB7$+PDK+ab)ZkReL(KEwg772!RE@@Ffwt<bL0 z2kxStw9bEiNkt<DZlC!OvpZdiKOS7{=YaXs`FaahcW0?_{iJ$wx#+}*v^hq+p}MVC zGgd0~t?`qQo4=7?bhf&5Y>k;~4nsfc6+)|ILvsg%(rKTw!l_m<wHmU#{^HT~-ebpL zHYUGus`517v%$jijkHJ`WWGPM$L7|kpYum1C1n~4aCW4H`gyBM{=l~_=UO+(36J=g z*<_0aK?-Xh>M@4!>?Bd$qF8=__6vs2?YQLQiO_z%{MTVfSr7gt6E*v;O1yySya{Xi zW0E*Cu4+KLuy|M@Ev|WEWH@HHj*@87n0~ehP=-MpsYRn1HYA^c#bpm5#T9_6>MUZ} zTxoI0=33v)*=*sOr}eUr<2H}LGjzl?Cp&pPONI|;gu8t=Z!<+TriO~@A~=McTLlTl z^C(`w%Dg=@?a`wt1C4Mt#+_I$%*ZBn-iL{$o{ie`T64AU-bam=`<yDRJxbNkQZ9Mk zJo!{!?<0IL6_r_XmZ8FHIeHG9mBAjPcK1+mQ^?gluj~5cz1VM(S>N8bIihl^cCY-_ zFzd@|#n&}QxMb)&-}bcPgF{d87?R90(Ft|R8_bjc^+@$;zw}}@Q|56`#umkl@1rk* zmvZ@7#6#m%mUIR#HfTPN9zH?gui6-ZPbkBWX{pOye^Ld5MG7Ib7R%;AsP$4$8*=UJ zErQ&ZXtcKV?Vhg+F<iopn+{0`oWz$;V$T_4r%59dIYwqGFHJP$@%T(!CH&zXiEW2K z4(;;E9booZX@vh}MtTypzVP`s6`~)8GxA9mx&5hll~_Vjla=g;&G0#4_dHAaD3IJ2 zO;4jWCKcSr*f){j<Z=PlhXkhwX2tQDKPF9nQgK%b7xeFXa5;lAcmYcq8zcS&^O4AW zv#FO1&up&WihrLoY@1aGnJ_iSMhbyga{z6nGl%z`=q>8*vVQ-L<E)DyoI>r;zb)Xu zp4p|%7AeIpQS+*@b!Y~ksa^-MV)s&Qi)5Y|zG`^`=Qh<}U-5>`y&K|su52gEtVUcD z#Xt>sb%yub-6@WyS+Qgb`6e1hZDO!$ik&y`box;~LZP<+78~d#-?w!|<JKUd-)a1s zyqX+a+bs;>-9kcJ7s7h8$;}np`8KRv_mP~R+>i5hF1L!#Z#a=s?X)<eNup~oM}~%( z_DWADw3!AU7<9e$`XO?gLcS)%8@<7pbeCqNGv_XXfA4}}$ZLcYn-#MVX+pDN7^}nl zUED+lAOIK@-l({ket#x!#u7xYQ^$6Tii$S=U}yWPr~XWG+gj7Ejcxhx;>PUsn;JZM zT_dJ0a`M~s8KmOu#PPAmJWuO$h~_@mlvXI^<yXf)AhQ3g*Z!XS|2Xx^`8{i7_ZMfW z?rV(Y##f-67C?B>Xj&N{Bs3GXJ5+8cjJqn4rap=%n|OzVwpaHYHOjWa8;9-EjrdcB zux=J&E6<F~S)d1f@)d++H<{p)#9_$+rUexfolrm;3Ob}#zYrH+@w?2_{|G4cf6K(| zy+!<rAv!mkdlhU|Yz3IFwJU2Vrxj6IYvgP1Rxtu_848z=(_^gL^(F;OWmZn%bQ{;a zf@}wR6OV5<hEep_{Do-o`pJG!n>UliYB#FtjF<K}D~;~D!y_x)?Paozqiig$z-(l& z3uLi&;Yd{)-A$R?rXj!}tECnDSJf)`_6rhx&p=<)z)(J4Z%8z;6*R%l2alDRS!2nt zl31OITvSv*iMj>k;8Hd*TWoa<SzH&)%Jq>_b9KIV2Gr{-Y*9plIv88CnPgvY8c095 zBMMtiU!R(zI{z*!9*l<qWCtJyYJ~UQJI#<$G6_^;G4E`C@UFCn!Xk}|*IwOuBI0O3 zD1Kj33LhsffkaSe*lhvytOT8Jf09qKz=+*!DXJif?d84=`7Gm_Fq-=gfxa_VIZ@L- z;(X;{#_qz)5hvri23<sv-2#&>pLpI9(d?$KUul9Z5Y8l)2$>1Xm?^_M7N>Mr*DfQd zPe6x}GVdvC(v;po+$Tj(3e8Wd>>YGhF5OOS=7w^PZ@ui~hWw=B<jTrk4;ETB1Y2?3 z2lNf9z2kV9GM3G;bM^3?Z1aZlT>Xrt<k>Re2k9RbJscIMwa4bd)QU(DWUrrXJ83WQ z{bXvEX2I=!2Z~37XoI_>t#!J8+x|+%6Q_2cW2?u-=>Ge7@|Y)xo5xOnC0<XIbn~%+ z175i!)DeR_l+2Wze8Uys5+mdgmL;>MB)60?>+-5biZQ`1#u~YshGk0V%6p@^$?>p# z-l|}wGv_njAqumNG)yP{FkLW`E{9O4zne?@c2~$k7tuT7!`N8PlrGOK9>*I?1+O>T zhc((YG|AqF!PnExP%xP1D0b<(Ma-AidTZkWyDBZnHB0ai+<{elTG{maQRp~Z`u65@ zq<@-PMr{#Es@p2$aYT6{25LCP@(VR!T4rbemu08OWMaCljgV2y+fA^cL;7vQaerPT zHNbkc_v5l~W0B|G)Nz}!374PEu@3Y+Vp2$OwsDq;NR9cCLZ|BL!Ds&ZL$5`iDMGLW zfQKh(=2JTB{es~?0P|Y#H;a74Zy?e@Zejh)2?Nh;1pATojaVG`mQYb;1~C&0k%zTw zcWCBajO085JZtZLgqLHy(K;%o&cCON?~sXe_CsT}WG?`2?BI8~`j&&fxGNs?OM6=} zqm%uxR<C1kHArk}okX_U8)x>C(-Ph+lJ<!Yf%31M+Yt|hI{>oFR>hK!hayHvt?{_( z0Lfu%n2DMUj<qK)BfTe+$d$ElRQ1sR)M60+q=K-E_~xCT*CQr*vs@z16{V8&s%+9C z4Kf<<T@5elhw1&0KiBWw*S}O>h4FBYb@$lQQJBl$o=awzwCHP>QZlcAlzNU?()Lu1 zT@Qf|?+XBp#9B?QZ~65a%Y=oy=D{A4BgL_pDwff4%(*s%S|Eejd!;yOnd)0`v91U+ zmHgNTlEvkou`W0hJ5zb(C;EoA;)^KP_k7no+1^#n1(@?BK!s5zB)o}jai1J@?p-P> z!;1dReZGy}=={$IjHu|Wh-E}=cAT&X97>@hPmXn(2i+3oNZ6R$0qalOM7I-~{$jKK zJNS&4=lPnV=Gix{^;JD&+KWdB0VpdtRf?5~0vk#yFMJY2(H-kB0we=E{pH;dZhna< zvdd&n563On!c1qBRZ3@;@F>C!%72zG@3CSp8iNHJL56f;21epaH`JF1YeVdN*{{=v ze*KF~|LNne31K@fEid=Fd?wm>m^=3a8AC}5tj-*7H&1?2(d&p#?C?fTE>~1EukHnU z;~?MXxnSj16DA%~^U+6JH6FElE@vyTuFFTh&jv^5R)Hl7JLHI3HX#YpPb!t($<5Qo z^M6kDZL;B@T%TNjmV8PmHOs9FGd?|0YYAc1u^!vt-+%DSkaEq$gX7!TTg927!IK1G z@uThIn|O!%&%3p%4RW)u&g8ppwzlIha>_G&fJt?r7%3QWloWhVNZa|n?QFYR@@8Of z>_oSY^Db@MYUYEH*w3)zppMs71Vf*?U{v&zZ&y>cIp-PKtGD_m^Fopc1gmv<jwIhn z-ZyL-bR1DObdK7jm$gY_I&8eM0$1+tDs$*G#z#4%A(GV57CTpWb#ak`p$;{g-JYTt zW-<?FN(^z8L(Q#|(3tf^S|6FprSy5M3zR;B4#J0%0LwfPLN=t1pHymfrXR`T@EyIX z`tR_}s-INWT3?`?3eOEgDS^k>(O-M0e!2e@&_bLt!5k#Pio))P*_7D6m<$LX&6mm$ zCoTwLb_^fO3t_~D98JdqU;~F}y{r?3fvif~dg<_Sv<JeR`M^8W-8;|dg`#J5`8Yx} zX%it&l!KaJhDUqsB|ZduQM^_KBk4c(=G|lI%NIQ#$Ym`zn&&WmvZ(8Q7K7rsjWB^Y zE%jjX<)8Cq6ornQ#@dDvTPExPN`vs<^oymX)>`;`V0xVUS8Y?qqlMoVE0>mq=HLaM zktYvn{gU-21Ct~U)ex=WS6#q#)5*~1Oy3mNF~HN~YZ>)6?4GAAg)G?ql{wdGA~1U@ z`GuBSJUn!U*fAbd;hE$#-RYCj%0py%=l#M-)kM;C+^Vd6?6%R(<Tyh_FLy;~Ask$# zTLLYmAy}P8hN|vcD4_cEfv(`hImX$-N2!y&QkQ%hA<u0gY9j>TO4O`E#K%WE#it$e z+V^XN%115Lc}gz!pDo9;-ru&DQk|T#2V{9|J9Z)4T?TX;I$f^-+4u0Jkv_*q8YJDm zje|i6LvnG5Qmd;|Dy=L}gtxiI7&10bz=E^~WUZW9Fc5O=_bfu2(WuOSEU`;%nnUnZ z%}3)44_cP&k4!C-OXqTO^KFUJCW1lqA0ooN`S@2fO6%LjaSRh&&FP$<z-ylto_F^S z(gu_aQx^~QqAs9X+dqyfxZ!KwG3LN*`TIy!&5#L|h_Yzr1~RK`3B%IVO$NOd1dFum z(f2Q=ngLcEx4;LaOINzJu_GcEYu>iW#>j1N&kVLOUCGv#Lf`kkoA@Q9=&9?n!f4yW zyPA3Z>2#tP@O6gUPxgn~R86L;*GnJUR~abfl3*9lD6QD}7nl($D<`^N_AW?KOPWif zMek+-uw7hI7rf-tH^3FrzC5CjV!ppmg1z8=z|v_ttzudV?}j<eht)iP#CBcwGt#>^ zmw?Acrn7J+cKn!Lppm79R3xOmAyF3Dj4;&=b%6K7D-(!`8V3b^9=tezYXNv~th+K8 z?y@TR82KUuzHNk&-LTB|4;W{SoevZcs(r&|UuU-ifb}B}VCLuH<u23a;8G7<Ig<NR zxn=~t$ynsW-%^{oT&kM!$XuVSp?EKNw5t^}qJ;5Em77XTHJhB2_j!HTkg>&&PB7pb zsLZ8(^93rUi=y>C>mqW)hY-HE>Dl3&869#)9o^(v5VNWs%aLn~m%w4JQ0Kp-qViAf zMSRjv%f3^m7RXz{B@|Py7RzxhxCd?Y&LC)!xcWi)r4-`iSLGth9Z~25LS18^lTr&V z)o+q;{FADJ!`QELXEJ$LcfPhBI<XGLW$nGLYxZIkQb3{k5?vp=B@Zr%4S{(NL1(OZ z3`d>3C(%dB^4YzLYoaGoKdE*j14ywWlNDRp3VXG!+h<Vbqe6QyW$VD+9{;V0Esg=V zpHvR$3FF_dlHKZsb_HqGpX5yXTJK6PA20l~mw(=ue~y=bK1cu54FA-a|Fk6kzqgG_ z$%|YATdBu9i3_go-7@2TjS3{~@g}JfTgiF7M$RZ-5zpvUku*5e?lNZvCwooTK#7;U zYeDE)cIU3i+H8wO735*02}#oyJ>gk#Mw2SJmK4_ZC%Vl)Pn!O+Z<+zN%5++Y_%Y@w z$8!nx43^cAZo9<rMLjmRPP2%IjNr__mw@>|Zs<l##~yYFjv}>KJ;b@ux~6101MI?k z(c+L5s64@lWs{ig%$Fr4G^Aq0pMfl^ooy&mkq<bupV-oTZt(lpQUCl$;AZ+;La0+c zh5jyaqy-%d3-{40$XJie@GqOhM-aXOL*b7jKFBL}m{lbdkr+T1ls@aeI0>%AP(XE6 zC}N4aUd`7%S%K}b%swSoVsHnzFb(Rfba{Gp>WBa4k|-RBtNLi=Q)<syy>P4PWLh!) z`4ekBr)67fn{D=|AqWAPk_SoY0blbuj@WFF$ucIs22K;5iJsa&sa~a|ITJ=R`daig zcD?S+J?qa1YCH5?^Db)Iq~v#D#sYfW3x+Mad#v-y_oPuju-?~fb~Lh{J1+%*{k@!M zgy7?&6)MgvDvVu)`Pm%ydV2yoW(c=>Vr-I1#8v^ouW)2_<C+ZBRRZ|N$jyvxvQg9O zx#@T~cjfR!ai5p~&tB2;4ud9l*7ug>zFOz<H?KsLW;l83-@fh2ZD(z6391Z(q^Apj zm(7i1Ce=pM9;WZO6^q5f^d^h>iyub!p>!vzuqC(V)~@a!G%Lw0vs%B_0>7BMl-_TO zefTXuWv(0{S!x#$JD;v*-O~O{1~Swl5+d0;T9IZkD&)*PCtU6<1Q&rPKihOS>_F?& z3F;5nYC=f1g%6*XI^E`AeP<J8!>&xvapeZ<Wc`#{vx<bu2TyJV4TOG!Lmw`jIPp7e z<r==gG&MD2!SAH2kmKKpx<1$y$W|-qH=mFve)NGEH-;;;C60@ALs+k$Pi1&P)>gG! zhgzu{F}`NTPg)k7P15x59;D<~>KWe62b<hs<;M!JQM=1w57ka2ruV7a6sV*9-?r4S z)ykeP@Em`Pcr$jDm(Qe38Pe4}VRbvT&Ra<2A`?@L>huQFF9;W_nV(d~&udj%+COXX zPuorRXr}@NM#hY{P5shV*x(l*MA{rz_nQs8vA(-p;eFjEl`PZ!Bu1o+#LYDZh>$cB z(k)GFG%K-9vUqUxAmGqa``c^*jUS(;=fLOXWbx`MdhTRtnSpkAv!{>0qqkPRw?%PF zImkSL81dA&hXNdMd=)Rk_QLuq3LcXUL~aai7y^{wPw*452s2jC;;i@WGCG~9uu|FN z56*-r4IYydYpcPzm@+*!pr5`%@GCMguB;>2s%qEP9VS^UiJ{n}7m)BCcm;mS!1=pV zK^nrJkE^GGfHX4Xv6zd?iPwe8#<8I<2VTwkxa8j#jUQm`<b-3`0d~p;o76YjiO<ah z-_hK5sPtqpHy)R(HTeooE>c#;G57FVReQP7_yw&$%}TEjYP*{=d*hpA<sEJ6h?xkK zDaqCzBCl{2qB!yV^vN8HXh^KeECyeE#%4mal6Z5=@<qZeovVwW0Zz^diK$vSlhc#P zt}i}~WkTv>`Wjj;S~}I92g^cNxoCfhElcgT=`0Z$b4aR6HXOG1%T|5^r2DegU^}2Q zbFMLH4@3FL_r8B&Zwg2{y0?|RKK|>r;#uVDpEZtuv19+)<3CW1BYoN8`l$F*kkV&G z*)6-iU0Z+Id3N7wiRSoSsgl9!rFQ(a`83M?Ru^yEJ(NiWQ|g^OR%BgxE~QvnA8Y8E zgNukb&@eEM8JG7LMZP4J7z}g^s$D_V2{go%WJJs+wrE^NGs=C{)=#Sy7<C`e?cJGw z(Z+PQMX=^PoO9D*$E}syLt(nR`vK?TyUZb`&#V)~Vb6OLoq4UJ>9Cv~MMD<ehS6-_ z_-@lGEpZIwd-tWxvuqPC@F2-xwPdE)U!`vceQ%!k<wDOsx^<Z?ZI_oj1K@4#0(DtV zeNdd1^uGCxKfAjPJ`n+l;&?7;i5l!TF@S#~kla)}@ry)d?ne^{K(sNr!1`V*c%z^| zStmL<a_Wfpm+p^Ch}LQaE`?Uk&AY7wUAr{WWn4pz?#H8?Lgd);<#acjG8P}c>Ku0Q zc9ta#I6T5znn}wLw9?@+ljeV={z;EA2?$y8Y+m+$%{||pi4<La|B>as(F(B&X300{ zYtYlL-u~q#YVxX;G;6!{NDcC|S>F)uf*}gHg}NrNcnDiLrHs=hCs>t8kcnZLt2MWg zzxhsk)tu}z$_BP6EF4R}l%~!bZtZR^@CAMADc$FJxFz|`D;MNmy5)B-ZLj%tD&+IH z{t?2+GO6snk#zIp<zzxrqLZ5|YMaiR!|JLxzysfUZoJF6AG|m&+d7{<s*xC7o+@9? zVcC8b*p`1}<kK?uqCBTZa?>aMq2X+vn1BssF5ZW*`B8vx1jqfbw|3?SqBmFPE$GyL z=iP#`ac$&{wC@sMzQ9P<VMSaXooHybtA9QpUb&2u1XIV?&|~WL#p~LG(*cPtB%cYQ zVEGVglyzolZ$MuktV?zuJ|8Xrz+mGz?!ke4nqvSg-FaMj=*WpHxhvJ0APG+}WSN^9 zM<uv(2!BWG#d4XKXz-^;nw5R@;{EiK$`I7qk4W%kR1q$^hG`H5I?I_|?Uz3<6qol} zV#4+;l-B*sDn^Xa;a+0MTcWpm!Gl<BARNwV<deDQZJkwE>fk_wVb-TzI#{~ooCWp3 z#@_H{Y@pG2VRfLbA31k-3}PP9&ENR4vR~fvR-KsZ-0QiDmB3sGp;VsQN&0a!MHJP% zvYw2iA`jp9bzF>dVwbWp>os4Dxwr<z0qwLVD*NxMhT6omcZ**$HZ&G=yVpv31VN5= zNDh$ba@+almp?j93^`?%Ae=yh*C($^sp96;9=jrr&kFe^Duc9L#2weSV8&SzlREvq zi~)}+N)n*XfQ%O<uGc>F%}Ynw`1)rU=nYnNCo3SeiLU4xi+y#)tJ&{51O0<`vyaAo zim8=P1ha#szZjhW6i@d{jjx^lMn&E3e|UINwrE3R&U*$bCN@IZ_Ssmk22#L24_Yl% z)~4Q^!If^T1qRA`(pi6z=kdR_&eOP4Xe{vukLG_?!~U19`zI6Af9dx9Zx{a!vy+z> z6>F?pX_US8=K+R@nxGQ*li<FE!m^`QZ<yR3e`SC*|qA&u<ka&5rYT3bycbJsfq z05p6im&3~`qE%L7aGBd-0s6jP8t$~P<zy{#J<!I;VX#EGFk7N-mTcJ)#mhON;4(MK z?5hvo_Z}p4An$T8Z)W5`gz5x3mfb6^E#yh4b~Za3U0v{b-$Ev+_Ubw9s0y=xN-7dY zb_wbz3}|)mjJNenHcYx_%z%qBii0$15&w(5_W)}v+0sSncDExojWJ-7vBBhIz~t1n z2_~B;Km-#6CP)~B$e|s`$tH<Rn+!r=1V|u~O$LE5K@uPkCJ0Q<Iryp1nYlCPefQpT z-<x}9&YkJ{^eOGVYgetRy;jw#TK{kD`=&XeetDzodiy7v3jFRI=bHQ~x5y-?&RAka z1Iu1238-ZIu-_@O_y`6zKcptTM~TTK>j&_eZV;zHQ(WExN=(cn^LcjG8A}}|*oEF5 z)x6A=ogvCa#;#vaa@pVeUI!XYAZHxW7q#WQ&1zb8Ip*ZoIfRmwq2qQTw=!+(L^k|_ zLgs#YUTvb_W|%RURyW8HTT@wfN?hhl!XgR<*mu@~Ud_u9m3Wt>ahx*v27-L>j|7`b zHGy*0_}^!P+~!kt&}NzC81ss3Kd>LOn{Ys_XidRv2C+lWzj}MHDm(!(q9oScDwgvp z`$;j0!5`d1N{92vtnap0a}GL;k6uVty5kiAl&FzoauOzi5E#y$GU?!Cz%IO@)|wCA zgYk`BUkRGGX?eLs-9bt-rdfY!XHyTB$ipgl6~P4pF6Wu}u?OTv&T3|VT0Gns_DeK( z?46T!3=A}XtPM`?E#nLvt=MK0r@l{lSDn=<-ay{>mJs)XzBNt=UATTPs!#Dw2HuaL z_LJ0DfdW;)&waR7q0ICLX8gx&AZUgyp&swR*z+LgRm{A+f&Gs&E@1M&?6~!l9?{qL z{OCDlf?rD+Nf0$xhRkHZ=wl*o4V!|zuwZ-V<)tXjAG>xqpF}AdFlf&O{pb~;ovzVl zupnKgKhX7{!jW|akv<>5k#Y;twp^lX)ckP8FceK}Ib<?0+`15FJxod^D3=Yhf2Z^R znx<Tld^vc5Sq^^}R35(OE)#=CH&;H1!kgt|3KkuvYW==Wdxr{muOLgIjoN|AHf;U} zx$3J(_s{x4zBWHDH6FSEIb<h;&^)q_a`wzpVy#VJt08Zq`R;diJCw>7aI-O2RO^bP zPeid_mht3KtGOVz{vGYLILll|gfB!u;*E=ZP>Gb}s>_zbf{vE%<BDard5<j34K@*P zSOfMO0xYtF0owL`k?~|Y^y<pJzP!k87ZX@6VCYWUV~F;cV~T+HE@X<N;A>(M)8L4H z6!dON{vcbM3~EKN`6fDQ7(K2-Tpm@mcOR-Le(TA%)c;gf#Nn`&&$XJB%(7;!Bt7Bp z(VX?eT-}}Cd7;kPhEY}7%;W@4u@#nGkY<vsyluC(h{FodA0lqQyFkNEQ@iK*K_R4T z0E#`+BWV6&d5f%YoAWyzSE8jEz*df9Jl!Kfp<1$sbc40QjH5b*Mm|r3Pk}v)M1DQ0 ziEX}$)qgqS*tJGc*=+xzOV*T~i0y{bw+c@vB>-8%KuTpe2f%vvhW))5eO^znXb_hp zz}I-C%q^ve<Qqv0Zv9%q6tMNyQE?6)2x0Y^k%yQ;!12Eh3{by-XHi)W_kTyiwY#|A z%~hpYy_Z@yS{Ftx`I#Yua+Zy2ub)-GS{RG>(9NUl_#aw?DrL+WqE|w~VryR>k*z&1 zfBxOV@pj<_7w?2TZADLp3oKL3G4eK`jXFg$-Hnzy?1ycG`X%`15Usv!Tvp&>V*0vd zpUvwN>7;(&73)N0n56uPz1ZA>IBP^wA7wVmMjkULq;A3I7PiMFdSU%59Ua1@h`MPq zm&c+1WLpBvp~5_F7of&tZD(~r6d<%Vq+!o_9MlBndY6|=+Il&XYyO!W@rT=v=T#Zs z={hFD<eu2uSz%@ikFianAEJ9`3Z4DLJ#;a^b5kb|U+AlP`8%Ccz1qgmrmkI)YUI=w z(`4A0{oC`)@!#pl4-J|NL!<1@&+NL=2Ct9ppX!8O2K8k8_J>utDAR8e&DO6n%Ua;} zOnQUQ)(S}?2gVaSQ2t6DU|psbGO?f`r4lKQOgr?Qwx#R|fk($%HL_KCri>Ix9-WeK zWt%!%%D$<=>OOS>@5tr5T)9?WAX-}K9L%0NQZrqyvZ2~8Q~sBm{c*$p-|3YA<MMdi zhmG{D=68BB@Xb>RhCY9JqS^)O$+>W@WAm~hYwNg+OYGG8=|<pMc)ymILuV6e9z4Kt zu;@(<SRW@))27Dvx1-DIdM6vq16Byk{)$$vxbxV&R_Z?#2n{n~MW&mcY~WGBgs_by z(M&+5qm>g@E;l>$MQ0;If%~&))j&Poq&dEqAjEbC(2DH~(?p*zJ7v1nW04N0s1wnj z4~qluH1uVb$mhDAo;Qw67pP@w9!`G^y&m12o7@z?bnmy4*NeA(-_EGkyo#M@3Y#8_ zFh{GYba||0AL9$4@)fN-$stLa9$gB%!~M<{J&ndTr!_^HVt#qeGNKbcL$)Spmtbhg zl5_4hcZK4I9g~s{dfDrv8#>O``Cq{KV~WHnLx0b>@tT*}ix=N%T(Tf)wAA(gyrkU5 z#}exk&zuedX7(UL(&`}RIY$EQCljifi$DfRrpdux)igKH0VVMO`vVpQ(m_Fs(Pd(& zS`PL@mfVX&qD;@6>_q|DR3VT=gPg^>exy3S&OE0%hrmI$B2h|QIlopL{b6<Ce^}id z>D*TK1E^9^#j)`g*=LVwvhrIYR5|z3<=#CxwwDUJRod*$6G5>qnhq(k4s8j7b!GX) zE)>_qJ*PK8snu34n1V_?dE}M}70zBYf{m|Pc<j&J9cOrXVI5r8u-JR%(o^}7%wT#i z9r@d*W}`~6E^$@Wz}b5(Epz+4_kgA@KV^lRqBIT4?%khh%$zm_SI?2Q$-*y+r|R=Z zK@jDg>AlmD#T-k50`Um0IFcDuj(OJK9%t=JyzL=yrS8UJ$3dd$`L8qetI*4~*4wN$ z`Kg(Uu`Rt0LpqaFaZIt|u;c@4>-YqK|2jJVOcw97H7l{JQn7P{G)k2mnBEPf_QfdZ zY#&EWPj85Q2BnpN(U!Cqs1}72EfS-#y_L|mz=D;8!06$elp?j~U&O+Grwit-R0M6> z8EuzHEl?Wf7L?+=;m=$8=WDpIB;G+TJp<J-UH_xl@R>psraqt5Ky0Vah~<h^-kFvz z-3gQY=a<N=D5t;^$60xN$g2fL@vq+f64I~ZdaJE78INHayXw0?;Q;TAhbo7wVCn#! z-HnpfFE>P<20m<NnBTd?)}DKD)^$KJrJ^maV1I)r|K*7daoOf8hExrFl}m@0K<6#r zDi8(f1W{OBnl6E0q2<It-3wiNkQ~w>1W6nV;x?ZhyYoYQ$E-z~Y8OIyMsw@I12CH= zs?JZBf~u=lv@Y+nE!xALRMPbN#vLqVGdU)x(S2Jf5zD|$Bv<*L@E(;fR%hJs68uj0 zU>}%PkTY-Vt#+@E|L%C;ps1%Kxv9YX47avEK4pmRd#eQx5mfYtcFX-XZe2UOaIGGC z>c~~h#{k#XUa**4_9rA}Ys-bxXaX+xR;LzQR0nUtIIOlSm615a*8{=wlzP>ufy2CR zu@4^{{X6SqZt$WX>KQ2g9Q%>fXoJYfxszfm$>n6Lh(!g=RlK<iQ@K2#^kTvc;Md1f zqztq+vdg=WHr8EWGIWg*m$@)xP2WD%U-Pa-pT$y@G%pU0qAcv4cACJdc2pYFUbQ6V z=kBpfuovih9Q6t4s`}h$rD6f53&)Ovb1hF^J1)C&;w<q?4QH-5hwF*rEtS1qk^a_Q zOm}eXEj-_D%WMJqs`X`AWgAee#!-_wV07(u!wv%`FV9z*6Q0k!c#WPc#e2P9yb0v- zWDU>gD`9UPSh(v|;h+<u6%f3yaX%~anS8K&V2Q*2JzXm@(4*+U4)*!d{GvYPCRD^} zd8)NH=ThPtII$?0AtTgC?A;>cjcN%IWwOANzK2~>QSzi*&Yg$ZCIfd{!9-ucq7t|? z<P#koH{Z_6w_6J(of7Y-qgQ)yj#Wc*-EA{aB;hNZD}=T6ReR!hy6)zqLu$W%!n@Us zO|4H^48#x5hiT!p|6xf|9xjQOBE?d|mkj5laME=mRSoJ{yfKcy04x^Zg*j*mz{~O} z9UyRRa~;*ZzUK~Z@Jf%70Jf8h1*`}e`OvlgsYYA;zFF5PdU2x9B|a8rWY$+Ail~y` zbTcxT4$U}d8o9~*NBw^IlMm*f_+V%dk`r2{+fPgv+131?Z_+e{hritIef!9HvE`=V z!oa<1(-eKvDvf!M3il2ZpUxdKM*q*VLh_Ju-NMYY?R+efz&xa2#=yjA3Q|f<?5%eh zNPx3B*T3t07_W%+`A+vGgXbtWyhG~g7=2`(^*u}H8~4f+vfrhGz>SW#qhftBJ?6#) z7R3sjYax_-vMll@P!|r`qMSEO{HWwh62i;~otv4bEGs^?;`JfmQYmAnKd2{H$`xXG z`epCbz^^1Q?LnW9@a+Z8T5?z>ztF?!duTb1WL#1_lF{h)k@o#cPk>Ne%i^A^4(XQf zB3NZX0g)9J@<pM!WF(fM!*+2j6t^@IN%d{huWy6)HkGJ%&Wdg0c=Cp_NHy=FjNUqJ zch8i{5Bij}2du1+VlCuGcLN2p=>UB0PR>MoWm?7Ohb?u4h88zmY4@|pX9jD1d!G6# zpiGZd^FS|c*7K4UHQ{X``?LqH96=936qI*~V=J5Q5XH7^+}6y5am2uMXgWKWr()j| z(R6m~SyaWR_}ii+Fu5$37INF#83B~i^0&{Cs0D2vbgXj0Ww+QgWJ_drXs!TR4qf^8 z#wiVRw^otX02HCwjuP5SX=O|-P9JSwL-=9}h6gk<GVlxQo;rB1tyLZisn}SjVOc4e zf)|J1zU}wa*x&h_DJ$pPn=HG}KZVdlj?_IIF(A`m{#?PeMM63zCe0>$zx|Cq_`!To z7x%TKn>H<qoVT5j4HQAOY=^4Xx72M^7$U-;Vz5*7j!?tyWCFo3JV{Q#<(GfD{NI6e zmSIlYd~5h4J*nC~H8%-*3qOxUtuVce<Lsc48j#DDuqZ;I6nYpveA1*_QR3oThn=h) ztK7@N2&EJ1)Xfxj^nHwKT64Tw#WH9k;yF2?e5_FRPGv<wJHiYYvg|Uwqu=wF#rnUI z$p6<LKm2H5M>Ju3A|dhhggf1xan`>@AZx3-A~dMqPx=07s~;(p6^cHezSc}RT3>6t zmL96v8Jn@#N6y^F`2xg^;9;eMDp}h&XQ+%^fG%7JC#I91$DpfE3;i2H9W>?rLjgHo zIGqNS17UD7c;61}(SoBb5VVlX#$mKc{Dcj7v<l>EH~wRda^<(3djA6zjPIbH;C0K7 zwUztLBj=_*1=HrTXZpa;{cjMgsl5*oM_T${cU#)4B4Xkh*Fd*luf1=UyMlf}5kITs z=4R8l9k&lbVD8-UA&KHoLN)zt_qu0uWiA&-&hxXT__WWr$VHZ2h;dZ~x_ji^8m*S{ zGV<$~!^}2bV~n(q#Je7r{lxKmY|FV4wD<}U$%yU)hR8B9TDu!bnkjF#Bh&iOh9M30 zW$42X)rSXf7dbm7nniupcw8?x4&btv;zpiQ7025rdbI<~H8@`foRoxuJOVBrs2Q)U zxmsSc4sbJSW-4M<@1Pn4FiNIP)&#GUE8uthyD<%ttUaO6Uv4~Kg4NKAi-faBhJQ1F z*o<bYRUb?BN{a4tTL~o18PyDKyYVF7&u(znX=xz1<zF{-qTsEPC7Bo%_ILb=QMp8Y zFR=>6*L$&JSDg-t5h+W$9Sx^CXP}&IIneAE(ZIxQhNlW}<AC+D&$D1x%K_d>?@Os$ z)?;Ucfs}^MN-|P7+`79=Y!Z~km?~Wb&6LxM2)W~|118yyFS+hi06Ig3Uf8m@D(fa@ zdy=-SRxItml|i3&sq$tBl|}j%tyq_cWWl^q0kQzueA&shle$}$I+hMT$kO5@Uss5A z<r>tc7hh(kFRAA?(y*)j`H%VfzodVBdWe51>wo)pX}uei^^^$CWRY<AcynL9sR3wG zCu5Dg&Y%QdLpYS%1m1Fem|BM%MQz+9FHNlv!)+FsA}a@EE6pSkzLX}=L{ueK_FyO9 z&!tA3;&lxmROwzUjgLX)-9XBC9F!-94f68+h5mx!PXdU4=C9*cg|zT(xhH8GsXp3j z*H~XJ9^MzrUIQDwaj6<Zw~*J0s*@}qa;ChsiuO-!kl_$ciniM!(zH#HD?Sz@w#TgJ zFCf5HoQW-s4t~WwWLP-rF|o6D9J&>)g;yK-<sETI>SG!$PUn&5x7(vdcO2tGLz-*P z-x3G2k;HT2$&#;aY)3z+3Xs~JgqdvLPyrOycE!GGWEr+fv~Znt_)aH5>6Wp*5VJDI z(Uk93NNQ$?R`1Xv;qDg^OU@V;#jt;HQJ7peBUvw6_Ya0bp;1xej484Ko%8>#U;XvV zKQb$yWTiv)Q@s7gFU=grukr$fw+WCI@+bt&m;9OR=w^|#PpRYTFM_$kJTUF(<Nbp& zT}bi3vFOYe%W^ca(OD?2VRo&2{{Thn`518`^!5tI%nxkF2GW2^e;uvN$vrdL2-s&s z{@cy%Pgmp<&HF(N!QJtzuk9;ZBWL_WO+I&3A971fZ<+3JZ5aDEpW~F2Z8!WDgGe6Y z4hrrpVpKRU<i&KW5?o}^7hffcULVAy=<8P+Q2S~IZA%fKher%(@N2YCFp1R%3cvl) zTJ)Na&OZ)(r~64eY%Q}BtMn~Aabq<2g?-1q%HYka*U!XEPI6}LJ_~)PQ!E?vw>e9i zQ)@N+eBC+rnA^R>gQ-&Xk4!pSzS9BPzSGTu!?McK66&CxUdPyAA%!aQKaSE;Ip(@r z$RL4Z_TF!&2}{E^QO9ha-KWJIHmQKvZ@?F$qI7gWUaFRHt|lLDA0~{G<nMgxnDT4F zOIAzLhskzl`>n0p&9%)}4|^f}Dyl$1y#RFX)<R}^F|^oOplM5z3FW77pfm(1q-cm{ zk475eA7K2Gv!*8ESZX3WXWhyZf~SZ=Kg3%y{#4^8vSAgzR;fAK`eArNU?;-AbJjtM zgy@^;1+LrgsV2^N{^I|oHG7W4T6-}ixk1L*%F|+5nTfu~rnougeqGh}Z9#sMq&qyq zlR0jU;UY7Dh7%p*lx`a`Mv-b}7-5|s<GSo{Z?`x8Z_Na4r{w>QOSSX{eErb4y4iyd zfhI>hQvGW>E9*x5J+tW@%tVEvB>`|OVNw`loJKqeR;s89YPKRntetsciJSXN(Zo9E z7uhFJIS8qyIh8gzZP-U;%sEV%nt7Mugjev&>?tOg>Ee)$haG=Km<jv-Cq2SH+ls$F zHh=T}kE~VygSbxrMm~T4$4^%j!YuVb^i8dARzvM8w4!GZb3MDds*g4#CpVL~&!%k- zZSdriVDW>X#YXh1xcw0ai?~ak2*e#HHg4UZX>(qnyzhw<%jh4SqKaFWh}H?m1gnV2 z&^U`Uag^=Qf1u#l|E@6p@v%bwJH=M>RT7=htnv6#9mM<_9K}cNo5(3Er@nX*K=uR! znT=Pz6lfPBk&q&|f7-OchHnaXLq1!@*R{^OEFOs7n-d?^fDK_<bC?=cGJJQUtQz#8 zHj=qMW+{g-SA<KmY0!B9o5)`{3&Q>@pqUqLTt8L_eA=v57q^}@E2k<iRt9U)&DCBV zZ-VwT4JxmDN+-@9)}~BX%6k61qp(16zC<7Y1jn-^n-%~$E3?XvnGPM^=lvlR8B`09 zQ3nmwP|9Rjwpiwbg`*N}cUII!tCnCPKDpOI@SC1Hu-i35p^J8DVM2q8mCGt2b9*Ak zHg+}wucx6+9H&!HR9M$xM=slmxs9cJ2Z?`sDgCZp1Bsf~ry96kK%%G_w-yohhW*73 zls>l(j7tACTfw6hY@(h2na(*JK+^t-ncTSeolfrApvFl~sO4$FpZEMzw*Tk*P@dTK zL7_xp(V&<y`RR6J-YLrjwz(L{kR#WnVuijwLwzP%G?x!jfgultBIo6fG@+Fho8o@v zeg4gu5*TqD=snR|uxeK27BgFcT0C@nSsAC%L#QlG-`fzki+G~g{qod=J23xh^XsnP zKjf4XsS<7lr9J41Y{7{=<43?R&88wi5m=fH(A|LSY8RN<o4o+igJ?7Svoig!#jE$v zwf-M`{^x=~7f5a9Kknouc&2b^Dtdco#jsyoJ9)Lz?DQrF9!%8E3cB14i-_+=rE6CJ z@6WDNKl3&_<}4Kt0u`KQ0HH?r%gl_nvgKrNIXtL|DDL9PEGJ~-WFHNN3iy09gREL- zr7iHP*}5G3zx1oo+&}5<+|WODbJ(9Y=s%;a4Y)a2ud?)fjh;z{m_ahJy=Gvq#B{S~ zleU6BW+1_~5(f~A4EW()=W!o*NkwpNSOt$0i*C0Y_J;AsL6R|U2|T)^A1IZXUk)ZA znR1U#OQPfSx=c(#D->Uo0?*6)7(?+3Zs($q>^HXaCzr1D`g-(NbXBGH@_!^<hw7b& z3C9|!J`w5I%%}r+atY@o2o`#qkJVv}aaHJ)mU>BmYil6HD7T`+)2U8<NV8%Cb~ocM zlsx|fwfBGc?|)x6!G8rb^}pX>nzz5xAr`{6Wb+2Ti~)$q!!p&%s%wG{-n2_EwoFVn zP=Kd5OLoe*5?`y0i!+?;2Hzwt8GbkjRzIL|T3Ohuz2*(uA7H9-<<4iNap?lKifY<@ zRa$T6y=L?N>u!o4PF;m5isnCL?u&WX3>!FPOs1l393YHu(zCG#GR?Z;)$Fwq<`d=< zc7D;Yl+|@22AGz`OsVmu!LXuBV@gzAD`RB+b}HqlH8l2CWoPO`fQED~jF93Fb3=GG z>z$mtHeCJf@7MJ2oN-qhciiVF2%?^HJMLU}P&Q=k*a?-DNgNDFSbUoYUq9YxTlbwN z&-gV?t4v|+p$t7^)llUlAk@|p(nsx++Sp@TtO>RBz&jUj2zgT#KxL*TGfS=rwPRV^ zgXI0&oS*(Ez(wA>G^sg%r+a<Bb$`HNifi|A_rbF2!w0iLcNU`op9NXU&hT3jUsJx* z<(RH2i=X#;<xQ7-ji}K$W2l>zy+Y#nBNvD1FvJY4&1h2?oR(F?Z2g&y>aA=N;*Vqh zpy`Jb8jbz1OqO$a>{!K5&F>||%}3Yt0U}SH;K@O5W94w$aCUt@usck&u>*bV7gSqB z3h0<wsnJKI>bXr}s@Qz<MJnT)Prv1iui`M-j|qM5nM-jy`4uJY2z{W+a>4XYPw!uX z*f0E7K;!)Tt^DusV8=sm&1ym!{KLOZq|l%A0@4t$eM$kWS~T|tnZvka1HD(e4iZ7= zB0w!%7!syg2MCk(9CBfZ!k8M=ktOv&gREcxra6`7RB7<7N$<A7A{yOFal#@Qc^8X( zRu7gFg9bkixc&b3EBklOxU1a}h;|eVT2S_MV!94GRlC-{oqIzj@zYW0ce<F8^o_ve z&W(M`@!5l*RwYWKJ(Lk=QSB+(zyZ}fJDO~;4MM{LKp5YUrhGTBx1YFKZs4AV?Txfd z@9%W^iyKE__OJeGH65fF_98qFd30&~;Y6{aX?4-C(1N)qHw3EJ{ZoT)zH-Z(+_-su z#qfw=(B8JO3THbz4!!LD(C*8LE${OjuaC59TogMvZlP&XCil}Ry;>L|S0s@zGNU~Z z_{YJ2)b#Ibxc_~jA}-9~Av=SyIZCyCjpS4^UrTcvbB24|Cpk|xzV{$Y8o2r;@r*h7 zP_fJ7leLrO@oW{?Iy4UW&?9xF!R(f3v#yCG2WWv;1uy7D9wsb3YDH&XM5eaBR}OCE ze+On@%-fjqd(-Y7*hgdQESS)lXP<LhT^u9(B~+sNT9TddGRRx`3D$R0%Y|HSS7rnd zQZv*1hZ;5P>V2jz3d%Ll4w~CM%;Xumzl=&qg@zFGvwVion5hs*Q7t;BuFAf*(^6$+ z3A~#+OxDq|eB3&J=ggH+z(+mz%aGOd%?v_m)1!fSyJ;?^kFw77nZ0wjk<&=-4$Yni z{+TedOuTWk$mpER$PFvhy337#vMzj(tGw#3UQnklkC1=|sP|Q#8my8TH~5ljA7Qus zL&5P+3n_NDduNe8Ii`>qMXPdQ{+Z?#8B69-Diag>j@-jV&g0Z?l?G4_xH8YDYW*6< zy87p}KXPc@#eMy_&%Pgc8t?wz(fXn}hf-cIpP0@{SpIPrzc6}azj<R!nYLIup4LAd zn`dL-BViDbAoUnBsSBZsHvlm}*AU<0idXIY<aUsF&aV&k&s{@-dC!-%el^mIzDh8c zeOh0HwmbW=uBf&_M%|M~I+Rj$rn3vsp{PCDe)2B8c)b5*@S7KN*wk$E%-8MPoJi3` zep)n2#v76-G<d^S-SToQy$~T*$Z>^K2fA5QIt3<8JCwyZD)2~q$^Eq3jeSNPw^mhp z_q+*57`h1&j-A|58dV&Aa;w`U-)~wAO23!3Io8m&wvO$y)X{2J1vJA{z0>xm43vu` z6j8OR=<(YuGoK!ul_0#wM0adF=mRB0+IB=i$5Jm9_?4sxa_>>qiSMxUL<kjITeT;F zS|>w_FhDDltoGNFle@WCyUnnd2HzTva(Y|QEF3(`3~KIOlhVK7e*dT!A5&g%FAfh1 zSnniS%*U-d^!ghzMnMHM4U`5Zt&`uTX{buuNLDWhW%#g`_?d;W!XCE?pw@*wT#`mC z>=59wK#WW{@Ry0e<D<75#*%uG>^6RJ(;BLqRr*3tBa^(Y%4@5O!OVuul$1M-lydp` z<yyp-b(d~#mK1g0oA4@l$KINf5#hUI;|P=y0xN~PdAzxaz9gK~<1jZt+fpqvg*|pi z`c~fsFYg@+H$vk^kmb`>Q@YA#rX~uy{pz@R{YOiIyJJ&8cYtdX@aax;gdrL&&Qwv| zeRQ$z3-Y<8p-YCSv)GMw@Teaj)rmu0_FbyMf$&{IACVVKsOA$dqKzs5ObYC%I>~_! zx}P;dCRlZ=3guKosgwRRD0|8Fl#&)ILcHIHu)^1Nr@XqsCff-oRX=(1)AM0R>5(h| zCpc>L8-2(&GE=r!`K>kHFwWpp;J`oy5ymWh-j#p=B`8a9)tOV7HGs70GgX@JDST;C zrD|RGk49~YH7cM2I@6Te>y#<iE<|X5J>1O_I(6hU3yI`Y%X4HJ5)}_glWQRtIP#5_ zn+sWu>z08r#op-&-n?>}3=;I#tE>DHS0t02Mi?#D6%sn18qBl(wEE_0)KkHy5wTBo z`t@{rM5o?5nL1uv7N2QbwuliNhaF6T(Zt%T9UghQgM|q{)Jl+Eey1yUar=Bvm?F0D zl{f)sHv!ab^dZ^zH3waQA{WPoy^LIW7e*};6j%CXS|(}>XzS7=kwOL#E7V6j)+5~y z0U1Rv&mVi$IJA458D(M2o(9M8CuCL<Ry35a$aB7C(Y^?^AnMXD9y9eE^xR!*KFe7V z0uzbrUJ7fGkrIKifsbtzj$f=Qx(>9ac<7g5+46^ohUNYzvA-@fs9qk{xVS!dYhZr6 zzn!k_uH929FZZ`|mGBmGBB2_@J{B{u0f-|owg%Dq188?*CF~QV%yYp@TybICRvIID z815|u=4$Xlr<)I8*fnS^)8lY6I=k;<KU%VU*;324IODyoD#5s6;)NATrnTRU8RDOw z4nFt%qoFR5t))kTB5#r#_zm&;jW!Zxc`Fv2QVy5y^tmRj1Oo?GwJbG5B6`$61-8HF zo}TThgL{3=pKZAm*s*FR%_zw^uj#osnph5C#R6BXMV@=#)7#<87$1KV%xmGsrE=jq zeC;e&a)N@w&5m`f>qlvdFvkDBb#1y4dUyQRsP_~WW<)MV67`KZdg7+R?!iZRzltrJ z_wT+2ptAwIU71eX78l2BnBwu9>Rhrr@XkfSnImWS7>)jq?&HwHESyqxU66<Ii7EO- zY+EF+M@`qRa3OL6YK6VmeJ|h=MCERUUS-!8tDVc)MA@ENE8@m*Oph<i2oc35EelcF zAKEoxt;Qn_%4J?+0RkbX&RBbzD)7a<ZQ7n4e6}VZu{|3xXkYyiai8#84?CqziyQYc zI|n5szH)oOO9<UxytU->-nR2*d9+y#@nCEwAI~9}N%D@4CNr>sn#&GfjV?ak0VFAt zX4fk^(5n~2KCQ)&Ex}9iuP#Jr*dKB3RFv2|2sIM7Z?A`>>g#qG>sqz6lxuglBh{H7 zw=hE*bZ>4kF-dcFbZI?1FHvMIj#G`wqKu_Y;n=rXA>B*CVk){9A`I%|`kXS4YPqQ_ z&I<b%vjnd(9aNbWZCD#`j6JSB=pZmQMGXwS!L`Q)N>p}VIl4CL{@kbYQ^CPi;51#{ zM15vP_JYc*ha(xzfZ}I?i^|;(CL`29eGA^+UZqcZ?OYNQYqfQGa%`rH&?VlvJf#_g zwI-^9^Xd$B#&|MzgnubEZl0;0e8xP;oaZ<q_0rSKwZi|nK*Oe^+2&0udnrbc0~r)V z^n`gJm&RdWq!Jk2vM2BTe%hM=e|`+y^PBTDUsdv0IDOeB7s1S2ylo9-?j^5Jdj8lo z&;8VC%ab}L_G8)=)V{8Z-g_`t2*P^C977HP)6AL<v6iZDWWE?3m;T~T&7@lTGAw;J zH_5ej^IY2@?p=$TAny6gE=8zP4zx-#q>y~Q4du&rT5L5Z1dVXQ)N2b}zD-;aVPCpM zY_O`W9<h?C3vvcZgDHi7SV&zPkyjg#UuUyi9(4HLS?=7`6ZOrZSxEZ$N}IIV0E#0A zui%Ibes9%5epWJbZ`r*fxpQ&?TS|5hT5ZrBF_YADxvvQc&$ayz7`^^aqa_(d_k~6m z*pfP>(B;a0H<!E0Os30mB`$GEEa#m{I7*Ia$(|4}e(+Lt+DCTJYq6~gmic>%BLhqd zdM85)C%uxy^42#EZV8nyvYV7CC%f(yNoxEZA97H}(`*Qq>TSIhm~uz(n};3{YRy~3 zSUxO2+I&T6v?N4vcsYn5`4X-%>tmkY>U?TY<R@Gi(`Ytix~OlYRN_QcfMn0r4itFF zZdoXb<OjYe<|$q4=m1Ho2?WSLy!P84g1od<i11&sxadAs*EguG5aZ%)J`Rhn*Sz82 zy)sGM6UBD84YL7VX~QB4AJL?y(P|1}<pBsBAgA=ZP2>w_9~EN-$EWf2(`o%QnC`8t zlp&j2_yCf*(F~y+*|I0Saa2727uvypTdTbikXR9l`v8Y;h9vgOL~SYCF%2A!5!F-{ zlyYx|+BL4UUTYwSd4^Lqf)9MB!u!>D9Xk7WsNjJBP@@Q35Z5~Dk~?q&s!_<yYAV8| zP}7Qx3?qw*E56fx8xNuwjy;F|rF_4H#3pIY$*15j<-j>bhh<fn9PyI$ckle;*T}Mv zR3%g6IwLEaFyGX50i7wkz=-d3Z>%JkihMd_WqDwN4f-&`M1G8mVtK|Ctuqe>Q!o3Z z@l#kY*}w+%ANHGYHDtu)^HMj|RDZs;%s}6jpG!8SJdAdCEJSRWF^|@CnO$pj&Y71m zMgxvhk;S&Z%!xVfQbbrCpfxtjbuPI)-q8oM(g$NNWy`DIVBA_N1>;VYDce@AslU<a zrdUqS?5=&Mi>^C|6k9102AR8;mo^I*nl1iqlK)@6`iIT$bk8Uuu9VDRmmUSPX0K*= zn){?DUxydq%S0MCYfeAmT|adsBG$6d*FNL<%NVIg!?YdKq@I$H=#zcRkWim3=@b_U zNw#{w^0NoI$s9})pg5<^VAQarr!ofwzhC^JEzf~I#p+Qk_m$<qH{i9n&uUjL!LcnT z4xT#1wbY~UbS!1}tL_-Xb1W@McB}N<?q3gcal{O#i+)u#^_QDUuJ>2F$|lo7I}-*T zYVTV2KP+H2cRPBsfB=TT$6>BkG_e=C8hBov@(vqrSt56=KUoib=wTy0z*e!L>7kcr z2||sTHx3QUr^M|G-LJKdZGxR{@JjYZdR>!$T=z&zlwAy#S_IMQJE2W>It&aIQRHSd z6+YW*uzU08934|!<qDvfRci`|WOj7s#F%*Qo3^alHpysZl$in>=aZmC=`wjQu3JU% z-%{L&lse+@Niw>wWt2AJeDttiv21`6umvsg%>dBwWSlUh`o}e5Ug;Ot=I*0J5mJ45 zcc~-FE)1O?IF!<|QjH2^;O6LYcjx$|W<TNlaCn)gP<lLSi!pccmi*e1+wSkvWP=Ol zebYU;sy4|_Wh0{o57rw$&(t-8?8MB6*7&@yd)4_uSHX?l085aac8v==F~&$s{1+X< zt(rK1UehwJc@i;Sd8y-$9ORCXM^t~wUDAZ%&naUH>b5`iu>-`C-$qv}k)CjXRFvY{ zRNk8tTxTX`ALYx1ndych`dkDDW@Qo5>tC=oA@>?~4#elWPlXaVi&PGBEMX-@kyhs- zd%o|cs++){6fV52`e3=TI39k|&P<Y@FxK`6-?@Kxt!w?$KDw`YHeTZM)Dc#(E{7>U z>JSEK4q^HyBbN7Y@4{}Xzt~7n@)4ZLFQJs0W>)<&%0toH%H8xUHV}IC<%nDtuT)Rr zT%q^b#v6n3nI@ldU-|s%QnCYaN>|)?!ua?wb5=koAja7aQvxqc{M=HMo!)(j$gcy4 zRI7w1IV$*?cDaC`Pefd!*HNR7ZgDnZ^_CCa9poSJZ!}$T5AsN8!HphNwe$sV#>~11 z@@GU6a<s5LUUEgnAzg8-DU2MxQQLubd<k7U!57#%N;U^V+Zi%H&1~ysxk$+5&K`04 z{A8B(1EO(-fkSqEA>NwUbs*xVEw<nm<JY9_d@>!d5iIb?Yud}(lOF}(C$R%`SGhLc z3A`pVNz1*nSDd>9AG?XRC#t1KyiQ9^dmUl?e%IziGqxf><lu?`%oNkV8rN0-_29u? zp6X#uxdOE0`A&r=aGgIuY1Nqt)b;C=g;nED>ENs%-lKixSbKK_S^C5zW9rSW$|b>c zvutxn=C~DaUmj>&ZyZ|n-trsLwa5^DsWrJb+fVLHjfZMs^QDv{m=n@y$XU6kc6Ykw zXL*>j`z!i=HCrsRuDA@ljrGNezPEJi#%@@GJPcwE%S%fF7^PN5Mf=UQ7?|FDekzmp zCMV8b`nqtZJEvrFOp06b7!6cu+-j^55YJkzzEKn;j#@U)Lk0K)8uL_>xqnjh+0L@x z;_!8Y0I3|jR?=;G1_R6eOa}ThH-_<>aY3q4XntL>X$$r3W!cEyXW9cS@t(SzV?}5) zT_HEP7p=hs1dCnVsgn{Tx0h0LoaJ*F84DD~C;-Xc=hYV7Hx+S--?~5Cd)Fru<y5l= z^bR1WWZb7tVMM%NAVSc_G`9_6T<4I=+v3*Okv&YUtp8edTXtF$O^cd+?~atY&ZLm? zcqRRtP%z;{J1&=j$s?QIS3k+&7lUj8Ue)+zqmE?Yi+BtXZUYlTtwR+wJsH_n&B;?A ze6Yt)po{A^-HC@LoC-QY8;U4Y6@!9dRYP4@$df*#8AFES@qy2rFvy}-_H*LfnEo-X zA~C+}-qKrR3r|wpWC8$2ZZ^8Wr`Vcy?8L!|JJ1y`AU`ncD3&0%0~mh21ZxXvefO=m z42kQx{^l*NwOf`6A~$op7;xb=h|z$>T_jGA8g$8ig&txK;TvYwn0<*a5_MXJ%i8Wv z(xSY)GMC~LCG~JcT&l;JG;2_Xu1OgWHW@2-^69!G7eDxtK3DeC(b>J>Qj5d44)0Z? zwsp5yp%nJg0-=lU&2fG+<(UQ$%S%^^7Wf6A9bNj8IeQtiH&Dx#(YvU@%r#|T=%VCU z+hHY4C~@}6(v^TF5?3ov$H!4r;Z7&?;*q(Au3%@TyW>)wt+qOOVir@L7lLG4-tR{{ zPfw`_{<hSTG3l00l|AS}LoBO4csCi|fH9QatF~P2)mH92e!mrqN$iIzU%k11Sv1G3 zne^162z@?`TiGz_#~WoZ=5~+C+nRCb*pKCU{u0}@WtkxJbE>A?d;OoBeo5?cn82Yl zj`g#ZJd!)Il+XmQzL^L5*gS0-rX=z#De||g1s-;KBE_MoF$D@bcWCmPpF&lQXx^nv zKgNpPt6SorY6Z*}DRCZBKrfnsCBbs;+WO<YXODnM$hrn4aU{6pN+pjsZG>;2=mzWg zYG-yOU{WICNEH^n)(^QtG!rYrXo|Mq7)$B2#2Ir1#|W>6@$_%Tr72vxhHegW<j+-b zPVNw1x-Syuo1I^ZfOd4W`|Q+|;lr0UvbQAc)`N8+^CQZ=<g%p@heeBDXOfNHS?VO; zwic_}=|nZ1T!pdypk+CtTV4?;m7x5PSoMkwPAkp8P4h_mJm22z#N*o>Hj~+8^(C1T z=F(S9->yG;XVCL7>h0^dQ7>xWR&;b!ydD_S)X;nY$zSIbFN(^Khueh^$zb<iD>Qp| zn~tA;<#>GN$8cQiTXFLya+U(Q4leU5k_oasEg!0K^4N!=K7!)~m|2ok!5Zmvl}+uy zHH415aSNBccgg}4A@cK9SPGUkBNM<dFTf!yDmzGEYlN9b_T;}<Dqpj$HTjhMs^^~5 zI~SRFr;qrs56X$buWyj2$0?|^DKKP_DR;~tiYb$@!RJkhd&{o{wMtEr<tL4e^h#PB zuyUM{G|W^z`q+pi$+X@TwG?}Q$o;H^mC2==0ELJ|n;IP|FdtcGfH};}&pDwu@LS-s zxq`8QFqM7+!Ae?mQ09Dj&nbHnl0m6&GGNV~f45odQ(H5sPn1h>KGb|x>)~$IVw234 zI&Wl8@d^qu*68dxjLG-&<mczs++$dVeh7Tg{w=zBEgC#oU3JfQH5A@9GWt>8X(g(^ zSi36g(YcYcW8QOD)Nj>lfqPcAd!6EEZ$%7)cWC}e|EK|;Ws%XuxDbh5F&f=NvWdxg zNr)PEjD7lzi)}nmm({rUd;6tL28@Y#Lx(L1@$l$6*GucRJ=IQxeCDDR|7DDZPro{C z=H*$mduIYl3*q?zGwIe`QUo5e*x~$;fSK}2&%X1eJHN=dpdJCe%qcB3c<*;U+wStr zg9j~|2NmCn7=4rdWQAXcI==XtD0(K0Pi=Ze4!D@Lb29Q?;l@1?feUGaUX7POqbgXg z2J-LsszldFjB#jLYRvcXQ$aU(eo0LMxgk?gR3uWY=ntR5qPdOZS1sc^JbNO9?M6U! zqxd9V>2@;sN{$0m(o-`2Rh2V$A+^I%w4Es#O^Rd8@E8EyZq{6694viJ#Jnt8Bh{%% zO48hmQtC9P9nGh(t(L7^_LZL@8a#&V><}Cqw@FQ+zLa<5a+ReRbujtvKi^?w+g&iZ zUk9JROgvVLh(o8K&-+NI3G0}A7hcf<xwU1x(JBoe<lHXzeT6GA;Oy>8J+cW(WtN?; zrJ^)|hvA-W55EV!=_=mca`?S@jdxKW+j1;WX{yaZ=0?I+@kAQGm~eWrbP})J^wwZf za-#kH@N$c{Z)B_9SGxh-(1mM1kqii6)ShUau7`07HU+zE+*)mQ-b<b7I%6d{zC8_J zmiegY@YU!fTx{bv!!>JtJv{Wzr%c!W8j%q}6=<$wI^+pAiV9UwkRQD_UscoHJ#oM2 zy+P&1FxjNRkkM3cd7t8)UE}+5d$Sxrz1tk<;c8P?>q9Xq4CweyCotN`DoeEFI1RJ< z26!gn@=-a>kR{#k^0HRamhlY-&K?b+AP}qDxcd-xf|BHCjs~{5M`dT%frf3<xZDq` z2oq0yyS6ZN^EYm`gu7JbIkRri1FYv<wfRu2{qNpjI2tcZkcAIo9=2ZcTllt2^f8Fx zogvun?HZ=a{NV|ea)GwgC_f_F=t`=lS?<`B#ClFHDBZSW#urJRK2o_SA(uIanYTz| zPczN+uY5i&+*1a+U8C<2B8%u1%nGtL-!s{$D^RhedHu;JrHRkD<VKX@O*o4whr|J# z%&s^fdItYt@4l>vN`{a?daJRjr0>>Ig3GJNwx54aMgp))*KVPwCoDrkmIE^Sq<N&r zPA*;RE7++}Vj7rb^rwhOcKwbj?b;UlJ?=H*5k1h-_i3wkO(ZzUKiS210$Em$Oq<pj zCa;%(+-^SG{9{J-pBHrSM>OUAh5<wi>S?+K@Y?db+Kn;jnt{wEO`te^`Y6@l>)4mQ zo(`UiACf@g)D&3_;oh!`1mR9`?A528t--PG8!&INY_CdwKLz#qBPeX|){+2$m5r4B z%QCeayf@P5Ro6RHT&*9{TOs9XT-zm8yq4_Tl{xoL@Kd$xh4A@jNw+i?cRZ?}F5NQ8 zH$&GVMBrOF(kNtv35WdwYvHAg0h<5%!=3X^pVifsAj=hfk*@UMG#&c@(RlrURBF9= zMek^8mcat9uWvqZ%B4TM;b@vo3sVMk*C9?ERh0=*j@t{=7<~p=u?}8pw$J@-<tbSb ziJ3U(wIjt2Ni!mDjKl6n8tz7PFtTr;spG`V*6Et0Q*s|tv-<MycuGeSdLp1$Dl(cf z%b=}iD-hn2#9&VO$#oyR)uKq9@MNBU%W~n0-6i&R6h`oy-ms$7&7XgUyTo^@*UZOF z241mrV;LJj+^;Z*vZ9dXM^Ft3BmH}lVtK<N2W?zIt#4&q&Zo<H5lMk5LBrW+Ulbpl zhB~NSUmk+i?&v&ON(p9WADOEz3%eC`YP}qC5aaiI^HY_3_&746MC<PE4UU>z??lHn z71nods}e@iUxF&H){X_-;aO*5z`=XaEvR;{7p9x^4Vp=5sxP)&oe_2VFLuqmz&SC9 zVn-e!_?M>ZQS*@o5}MpRJ-$FuIQ=wxV{~@;<n2%y*@7-h{u-|gwebdgfg{hG@QSc2 zy!6CSStH!F(y385oFMUp$%doMP%_(Sx+kZOza^HH1(pC`(k+n-R#l)co~3dow2zSi z&k30jDc7zovb1>n<|NpaBosLO@tHjS!8p*;?-ZE?$&~=tH3yA0tAn)74=9RZ1>LuH zFByqtjTY$juAafrek@|rF&_H*aXQc6TL<N6@wzA2ywfMYl_bS)M+DHXYsW}u`_?5B zAWZ}2P;V~k#)n07>47<w3=wHUP)=rI@j)TA;0V;@H5H%gUcvij>x=gnY%woe_JFn0 zz#OJU;8vlJuO0mB7afczuW-(~aAA_1MLfnFXNpZhH3?@U@B!KR(j@{`{sBw+yC(}I zei;U4n0fAks@g}4fljeVtllbDNa5_quA5iXwe==zPZJb+tSi9?;ksDk3F`?3!Z{yt zq+#4@%D~84Z+;6QBAlK5D_y{cK-DRL0{k<C-D5zzJM^7(_ToA7dvB=p*l<>|E_Ncy zVT@=ZQNG(Ebzs?Ab7_wMTXe<gLj#^JGpjPescv}2lO`fgSq9#zVZw-#c1n-VS#R9E zl@Yx_0_6U#qV0Rtf`K{U(!JM+G7#4P32#~lgkJb(9MXc~=MLfUp5(A2rwZK@c+)+x zwi={3S-TsKdwP$vDoKMR>`Ra)d*zJFE?Q61d}c#)CyIliG7mo@%3sUrOliq6do+to z4P>~fCN}a2Tu<_1@?9YZ7U)qKEX%xatha+GdJ8o}WfCA_X;#4erY`RkS!Z9obGT<p zXRK(niv1Wa?1%0Cw9fS{S8@}ey%l+pWD$a07*L9n9JHVMq|x(WLg9{Kq()J-RMS}j zTGd1ZJ~%CiLdhv<&J(nC?y0YOWIi2V;1%qhb&>Hp{$-LB9-@D|{4(sP9l#dJXyM8R z((}z-B<VpL^0AIf>xGNR<%%R-u?QzG#;c{xqzbIXj@8t-x0`X3>$quq|9Z5`+078G z_%#&)9Hfw}C@vySmAKyks`;?6uZ{@pn}2y&^E6KPVR}qtYI0rsw?q(IR|x;CW;~(j z&hJz42%9iCihK()h&JnAv+e!1)v5Ao)X{kFNlfziaZS=OGKoG{j*yhjuT;6;>B^Pl zIOv34Wm*f6OmeD0)khdNNyCxOylGYnjiyz|QBRON&Rm+f*5pznaJg9|r|9Q`0FEzY z7**8SX)8yqZ}r60$*6u#-ELm$7b{v=?QEK*c-NKKNYSk33_tE)^1;T<P8CK$Nc75D zkvmKtfO4=dn-ZPYh!;xP3#Y1Dl7cc#{9DWi=?A53EI;SUXc~O%tv*+*{(S$vZ~OgT zOR0bmUZ|dPGONh#x5?&%w%W}Az6O-J#Kodq*QF9GTLI@Dn9{K3REBxXH$uPOo2!A_ z()R|Qf7Dm;$YK?)H7iy_qs{r=EV5XaU%lTNDf9~0Ta6TJoJN%Ul>wDTt1^!>geVj) z*2DLu{&gb^(f${&N6hJw#+5^fKrPQcOpIGWPW;Dx^fe~<LejW&C)sG>F(pyzXA7yi z#V}mQ?{9!&)%Vv7rXO}aqtV;eyym(m-#C&S<Q?X>mFDOE=^@plT$-&C4$o{e8}`>N zJxvO`{|a2b6&z$YXX4*suHb9N(;Ex$PSQpvdZ{z5lR<U)LQ&aYGX@Otf_uqxtWR?* zZF~wF_+HZh>#pzhE0-m3J12I@?9(V8u+z{D>Y{kB*r04gU3Dg870+%|WHq^6ZYI;D z!#9O0cZ|u;EK&7Sh?`~Ks0gz;=YhR|ewqSyi$Qx%CGHY}KY!j?4PRL8kV#XxvCVZH z?==d1BLCU%Vo%_#0jY8gyTS^Y66Vt(#+a|;+{#N4qET`1^Mx>;nfmyS7R_xpZ{)gb z!7e4Fnq3;^(8nvGk~lY*<8Zj=@fclZCZ(4af7^102%Ls`2A+tmVKbb)<0kJw4`qMr ztH1Qg;Ju0$mt<=C1S;f_uk84|^;$durXW}5r`-I`NMFFyeTGCZISfsM8==xDNkUC{ zh(T?6rI2f^Xuj~;0=32YPLAZwE$EhH@<(s_q8aD84Bd8|mV)+taJF@_Q?6Fe1K)7c z?@P(VSc`leOBfCGqzoovWu7WkFRZ&{5c-YlcBq;pcf_7++oCHz6`KHIkQeuTiGgfS zS7I!(N8*kyK1uX$jIf$ZXlkBI9h=za<5kIZYhs9lH+HdGm4M-TJ#*VP08vFk6NMw1 zQPZ$rEFqI7Yy<_*Ncm;Er+cVn#z>g-H|9?*dY{Jd0y18sx_V#9?N{7kQ>zzXvsTxV z1f9puZW`|~>j-OBX7#HdtTzBZ6i%4gE)$G#$^?axyx<b2sxhaR|H}^a|9vO^Ph)K8 zNG6KyoGD4>u36C)4)y~<Hrlf&zxD>0Um(UNaDOawpvp)WVKp5Vsk?y;a<?K)E6H99 z4>Y_I9(VoN!(r2O@1cWWY|6-2GBb#)bWm{ZiA|8E{rY6qsJ?HN!Eq_V+@*cuV0++D z6@)pH+8-pRh6&JsM)hf1QGfmxHb1=#xkEJD!%J-Cr5~kD@8Za65VO-<wSPJ8QkNP6 zjXiZ)_*WSuj)2rY2XY_D9cQe8?5t_rB5X&A88nhZz2=&Is$K8g?zrKmZRENBd2x^> zfF$4A73#PE3>%T~IBNiG`=800oU(qPO@G76a{u?-JQLyVm9tK4_iX3z#A~eJ?6j+W z7UhU1`qsLRbER5`_-|;Yq>>A~Povr7go-~?Nqj)_NZ+j+6J}QCIW@18U97&AT&`GJ zK2-Uf!`EYCYhexfQS!FPhz&Ck$K;q=kdhx&?g@;4LFfS1Kq18@Wh23yRXQ(@Kbp?% zCUD!9hq}`?{|W@gl_;-~5Q;VCR;eCjNcqxQi~fFP?wNN>MHud$-O$!q_ukmpId#(T zJ6){Tnb&Zu2}f&}Elb#2mt)=uY|vicarJjP(eN;>_J4ie%QHO)O~U?`=ZtyZ65W<I zNFvMKrzqw#ZU&O0;|bhL?Od#TuYFIl@f0-Ua;O=WuYxFPwXQ;NZ}$LpgVk)}6W48M z)5b##H;G}iYhw!@o;SmG9`&z_wt40&tJdJhM8j#A46|1Ivs{15>(Bo6=kxe~zn%~f z$F?|lO-a?eW_SV>lVI98WTp*{l{JR913N-%tKK0Q@^4bJl;O_ZS3o>1Vv$d3U}6F@ zq7=k^A~CHpX8m1LchI<rC$q!CooN<pBg;yxaIv`2XROS(jOeJ!_+T?1cN6Ix#a%N4 zFZNLaTgMKjGpA47#KxL;#>}UqV?eslt*@fQhYAr8no`g+02T{)C_b9?n$q`ojo1Jl z(+c#O{0jr8``XsqHmJ~AoL79t#W$errYPr=D?vOFV(INo?qY1S6|<#<%L{OE)Ec14 za^IBPHin68=!D+_AZVB}S*e?l_`n4o9``B}W({_No{M?Wt&waz@?n?JwQS4DN~+mN zn<}%BUVpy{yJkfh-cQqa!8?8^yPr1l^To!l*{B>-LoB}2r9Eyfm=jp3u0F%n=h4>h z=Z@zhmmU2MaczT}ao_3Gg8+u14R+>g)OS_i4nrF`xF;K<X%r$5wMy=?_~|)`Yie!M zXN-T7-OTZ-$N$6Ldxy1kZTq6mc5KISA%td3alwEA1Ev>Il9*z8=tY!JgiMhzO`?;y z(2GqGRgh2(LSPV*jD)~8y@^mn6A}g?Fo@op@so3tbMwwUJA0q^owx6~@3Htp>qD^S zTw{(p$C%?69k3$)@l@NZ<5y8-D$z-eci2sG`?vJ5LA$KXZTDmQFOO4W|2*jQK{oAJ zehqUZqCFr?8JeoLrKIkANF8Wht8VYum6?e?0;aM~CibUgI-%GJkDW;6|M}|TfbqS5 zrjz-T`WC-gj$1ILUV0~hs5DNLUn+Dn4c+DOH>#T~tCjY7MocLk_U!ZfjN@<8L>m&d zu{l0^jeOO=Q2&CeezckXxe&Qxw=H1G)7S4pFA5=zf~Y+l?ir}GGLo|mQ=Q`D(g0iW z@Ae*|)ytlf90=1&;$FBU8lUS~lj}^X32U4K&t)#QH@1h>lg%@^hs=iO0owmFehZ~U z|IhFcQuBX8eE1K7Q}Alc$dy^gG)pr<6OYYHsEH9X$@C`I9w2d;K>ZcBH2`sory1Jx z9H~!%yr_nQP5X}p-jc)<-;&R^Dc{YOBvjtr(j|DWE$7x1OoB6Zrpe@_mWc*FRPG8r znPO{G-|-l`%FJ^^f@(i)D_jJwZb!%-i;eCRavrd3HEge;%HO8vZvXIKx99MePdejG zy3_wtxld${qHIrl`30m=CV*x(dgME(fm>+!IY|3PFkKB3oZ{CODRE6Yb=Dt!EmY;g zqDEw~@#AZ-X&y($xTAPp!-ECAtXtcO3FbOhb&Ih4I<kCLJbik!2$(--uJLfLgEK(z z`Hp?k!^7-`6t3!9B{GJrY`1;U8g%r<w{cQox7(!<ZfOeKrV}<)Cu3QlAAyR-krkoY zb6L3!laCpzcFqc0$t>*=#;w_yOC$wPK=bpuXCXxn`uwlu_5D}awWoF0dL*8e7x>b= z6ZKX&yS^_D!<o}YX>Q0v%Tj4HU5UM6r;?L2!~4@h?C5H&rXAeIuPB6t4wa1oja{yO zMz#DJP=1;6YDINkFu6zWjvCCodJWQ3TQZW@WG3%j8eiGRE&0fsW?d19vyYbaPAI?4 zK3x#8zaYFdHw#zZHsgU`<9k>Y9<&7IT~U)p-RLkzvv_}{mS05dh#iOVi&?DL-}A7j z%KrgkQDwpUxg-g=%g);D+TI+0`zmMhzdWJl6Y2H%ElWD^M;~9vY*h@P=4HO^xgVne zqCvgX_l~CLpIo%;iVt5hU9h*kV<#RStAv}V#*Vs-o9?>ywOLg+H(%r{{%IYbbp%`2 zn0B!i=97ef$_MZXlCG!zR9;x<iYt`8yV>Ss++azPd+)mTUC_=R_J^rH0{8Y^Ytox& zgU!^jW+}o?TUrb~FA?!eiGGmB&A}eS!z!_?5WSo--Hs4#r*=E+0~+|(MIyG_05y?- zFE!#W^(8FYCi~~NY77zVjzu=6yuaHjVci%!mz}cW)w7bX!990bD5W7{X1jVK!o#QI zXhy{u^z1S(0d>FKHR+ZJe-V15oZeA-y?Uv^Cx7oj0m2Kp&LQ+F%T@Dg>Q8)+rrMSV zj`uaYLyIdOp%?c9j8Z79K+3gh!6IXuo^_co)(|cU`C)Ff+znfm*%ZZN%bRWH56}fS z<E5kCzgEbIP>!3d>?B~Oh;=MJh8)^z_m_E%B3}Njzy=pTX@dSbEbKd@5&N=?NAUKD z1AK!C6|r#u?0!9y89@@1Sui;7WWf-6?mW+3>q7|--Yy-Xd1q}D1(vqMjLHPb2OMfH z>)!O{gryQDAdWu0TLfNHTr9+h9qfm^pZ2Q=W#=f$Rd{s$Q>WsV%;FTTJ=>FLIRrP( zZ%dsCzB`!%7iO1Ey1-bwm3rXZ{v<%L)LYQ=rY%ZLPw|=>ff4BCn7JS^^Ib1J5#<FL zp*a+f8xCTZ%Oz+sa-^<i-MmC~j8RbOkO1MFV1lK8K=Rz1F)G-#a)4*Ui{-xK=@RF5 zg|_KaYH#R1wxf`QZECl+K`)3+Gf<Gy6+d)@IlslG&2Fpg%Y45_1zEgltw9<Zo|kIE zo~{er>46JhivKyo6cF`20?;Iy-zS==@1iG7GxW^&P0V!aL;qU0YhiK00)M+WcZw0* ze|}pgBKX0(CeZM?!86Q}(&7Ejs}-8IcTYXk{Lm49zaso+N^_vMm68=s?s5qd|4UF< zjtF0>y8~eTSxHbLZdIn4K*!N$+||nq#k2D(ATnh_`j(64@B6xa^GWy@YJ8Oq7mBy~ zZ?9!tlzAGRx}xzNY!)P@`3(sY%E^;g*Py2O6??Nd@2O+$K5M+fTmdPxAtIR-#Hji8 zu&AjetYg-gKTSoIyu;u)CG1BNBNPNMej=W$xGdBmlhK&G$aN06>F(~)Ana2zxzu_y zcnfpBF+mz9tzyiV5?+fOl)tkuw^X?@&h86J*JDLRbnqA(Gx?VTyTzqR<==+s_;UDK z*68ic!<O0}($8(2GhV>w_TkOC6fqCTIv~7S`?$M8xS6+luM)Z56;T)C3JAOG{n$wC ztA`WHqrMJGzT?BOxiCupQW{Lptb`=)R|Ni<4T!<4={Z(U*zI^agB--0_q73K4R-@Q z9a4)|I^$bB@^xs09r}wQwR<Dpj*p2i$KmN}Ra@Rh<H40;^iYkjJ9lA&q{P~wIu#3? zM6gtQQ)xGHrFIPv8z!C<!7~`)`UX344cdS)Wn2s#gFoa9xTu_>pFTa{<!fA{{a`sY zqno+8+kK}hnLNPmmueAb4iFGaQx1*mmJiA4b2igw<HksAJF-ASEa&Pv!H737UorZ~ zm8Y`ic8zEB_b+Bd-n=QZZo{tOjAcGtH=?6QtEUBn(a<GA8z5w;t|B&v_VwE^xxKS; zUDbNqCW}7U8;lLwVa~>?+{l=-nbtTzf3jDCs==`(fGf6=$+Ox)?f#Bw{yha1%nE+~ za6u9C>ZuhL#F^jc)JXT9gG;4HUQ?~<qC?huUMSYL4^T8R7`}8hC9daQU3X3kBuosq zmR&LURtGvVG%+uc*E=Jir{r*TRa}I7XHNyCu*r=Z8C78_wvr?9f;%2F@Y3C9b*(}D zrpDC<;)xyZf|E&|9$%&S*`{5Pf7<3~pl<Nk&<W(EVSaYh{MO;{>XZYJYC80kJd`ON zJjghozV)LTHFrCJnV5a95i%1M!mwXUjFa^EYG3Fs8#-@q37Ha(t$jZ(ZqQ+ZF|m=a z3~iN&x~FDkg~PSB)PCEa&Ccn;HB9?bKAsA0nA~@{c3`@R0l({~=`f!khz0UI$^HS| zdH*e8yv|>}ec{EZ^6j*$*<Yx0Dh<A*EORzy4~3m+ny_fBTm;RiG=*;kyuzSD#s>ov zHbb;zzi3gK<t4<@!@&yPUD$@pkZ1Ffou+TZwWWP*R)w)G{yBQ<=F6+-&U)Pohe#I1 z-ugFXp@3~xEgaZPI1-<WzR^(85uaTA)I%`)$+M^ZTR{6epOp(vvu*%VXGeS9WormG zJn5?Kf?<C3xkGJ5hIG{hY@EMEAExLfAGOJG<!gWo+Kk-8YW+t`noDj_<{xaRT%g&P zX=C|19twsQq<7r)O>xa{IZHUaY2Vuu!E$H8Oc*jAgDeQ?+-06hY^fxY{es!spZo+3 zOkBi=(fL8XX}Glv_l%$)gI>!#E0phk6#HgpsLQG6>0*93x2<6NLr7s#v&Z-jCjlo& z+Vs)xbD$@{Yiln&H*uK6;(?$nRHbCn&vDtAhx@vnub?6i9|!)P+}qnu^VLhD+117M z^t<o5Ro6y@;n?6&l{sQYdP#ToS<<Twcv2+$^sq5TO%KYUaZ%tKkmKoh;`a+)rDS*a zLhQAECJOj&$iUhc3Hf=$!~*Be+hyr^>>6va;z--b=*75^p8+==tRn7UZOdKXhA`)W zZ3av!aF}MthcxVEca5o?wOGUW_m)mGi}Oo1v`l3T>dZuDuK>Pd{TkH8(ycNVy+gpc zfQAW~Xeq-SM;_6wj;Nn5-#m&6o|*}S=gS0Z9cBVX7S&!gZWHPsy2vk{UijMv%VII& zkuCpJ*x`?=!pDr(5-ZZL-ct=&$*YyXE3p=))L#jj#?KQwYSBV_ofhi4RCtyP%?}9e zkV9Jbr{|km;j%0*7gucG-tuHBn>tg61rsTbPX`Xb86ie7eBU*9><Zri1jwfg|Llxw zj7#Vncg)ZILIPA^^0wOUXnSe+MGiS-pEJ{l;6M64a=^uv<h~(xu}dHy9PS_c<0nVh z&0oenA5_Cfx-eMS#fboW+qwkAE9-N&U$3t1lQjVNI#*9y6Ebjk>NE`$PFozI1~BBf zo$;}FV^b_jL1&(tLxho#OQ__1NIy2CUx0V92$gASZ|m&;Zny~9^g&@YwCvVz=c-Qs zi!pdk|EL*&kG2*T9dA3fS>wdr!`6${^k?96^B=Tq7jWe>iKm@M+yxLRdCAWsYZNY} zrn-;b>*#Im?fga!+9+G#c|7X}O)sUcqa2jm=WqAmYHY1#@akOXDQ=fFu9*C@OmaUn z29)oUV+`^gvSn=#53a0N4W8L?NpnwKGkN@SgO_z*-WR95J^Wbp_Uuh&zFNriRZ$%% zL&-<aT)^2)o+_p6SCE@`It_XGMws7HBTj8)CuQbr>g$T!&d#Q1al~g=wFTak`|qZ4 zZ8wCf*ljK+J}&B8iVe1=Bs*DGre!%<RWlXmO`Y&bJ9F>mIW$GK4?Ndf?AF993eSfo zCIn!T_wsGhTk@tuw7!}X@N~NZ_}m}uwhgu~d;PXxZ}bf=HDx>hs+wX%w*gR$5*$H! zVVPu$;x~qb_GrF5%=;OBB~%-$W>3CcAJIVxAgE~14f@_)=BfzLarp(|t}etkHk%+* z2JF2_1~pp7L89aJT3;*_^UQt~W4$eKi_)XDo9h;sTRH;=aipqoVt01GHN^^&=2ONP zBMiF6srdq~l%|~V1MoGlws=+GgZf(3N=zpr3!dU8XIUF+?3-&M!W4BI%y^3Uwg>E^ z=DCiJM>=4TgMLXwNZ?B~gWLlnjl%^7Uz?V~>LtjVV?L-}_#tc+Ii1-0rc_FlUo+7d z(302CD!%EfnV-0m{q=Lsi@ANIXHknLU{e8{k8mYouix2Sx?j^6J{1rKx^_mdes9U! zrA_$bDUHeBs?M-*Cup|%YKq`PM!%IX@~VLOgG>8EtBP;%S}qq#l{^Ki-zkgX_4EbP zvI=`^C$9>B)^z{lDQ9wratNV&hy+tzacf&?>M<|!uIMRCUelScvpF+FbT<r+UZ`*^ zzxo`Cz|NToVlIW}>MJ=_4I_y8{cByu0`9JLHrJ;w_@uEKc2_27W}H`FpnyE4i}qpO zwprF30;N{uv)f_)B;h`NsUcux7Pp#s1T?E(p=NlhVGALe=n)dtJ=y>TDj<kecgkA( zf|JDbQ*3W#K7W>y=6Y*+@V?fz&&VA%{s$;T*Wr1lsU`n%tR2B{)3RdTf(}`sTQNiC z-ZE?rUNq`c1cL{OvNk>;`Nh7V>TJe(ZK#7<PotdXb2%QjFS^K`#Kc^eYd+VRRrf%J z=0q%nY1~VWwpdrwBU3Xz*fxy6IPeQIb<jotJA}r@Z3u5wwS~?}U#N7G%ju=GG|~a# zGyaD9`k?)&OP`})8}b$OnMwnZ;5cfqFV?8SNUFV}yKz2ePDDK*$o=~;XOgmt%>-q_ zk9SaG#x;Ezo%n=x$N%_SbdZ!CujTlh5r5)6VqUONSE&8jflDQ#mZa`Dr2y=wrx~!H zCbP-YN;dnwEyB56zT)MD&)0@Z`7SAgh4wkC_SJIc8Vbb~Gza)3O4s^qpSyLsjq{=g z_W)uX^m&0|#~x9w3|vD*QH5BW%?{rB0@|6~*j;hm+{%*Q=vHelfi*ZUGC{KpTk+MZ z$sJ7%*H6utZ4FtgF760eF8-=TFozxpl|!gj2?P%%6HKp(WEI2tIvcl*pP+8To(*)$ z95Z>LX-!@Wl_Sd<rky>w<EXTlt=FnulzYE)+)ysAP<EIynQz!>>7%viNh?TFueQUK z^PXoqXi1PpWUntMzn}rXuB#^;91d%Ysu>%YE=2aN;KJ0RJC3&wpUi$d#neZJh0>Kk zyW(~Q+{DG2p>ysFAHFAs!!BE%d9-@z^ODUczvMLc`J-}~c1PTVm6hTLHJ;f$^Do(@ zcw>)wX3<W-_qi%N`;|%+V|rZ=vr@G(@?E~(QpU`H)%Rq3$5O(*^JO?J#ve06&PoWJ z!HfIbTw06ZyY6J%akp(VDa^>ts5Qi_Dxn>0KepLw1L(7lO#XVBhgs+D(>qi!HhG8| zn4OLly?$#SJB-PDCDrHOte&z&@HAJCz42hVq@6fyVC*q2qRjQZe1)jQXG<~nBx_N2 z6#|mmC5l`E2&|HzB(kw0o~qE~ES}R{a5tdC<3KtuI<wJ;`SH|M_(<0~UNX&+SeVfG zc+jp@<IpIh(3R(m?}gaV0<$<bqb@?L>y4|uIyD+2hL>%Wtka<TC25ye7+e)~aE)ys zo^au<b2&-pfVh2Y6mTwH6*@h$dSBB%esa~<WaW}>MMl;vuhoEHe30wSfPFi`fsp;s zs-Gr<0@n9nhI7x>)_a;^%PO)!WsTN8OH4&bc3jGV#DY{&dP;DZ24wP9?t9sO>*w}7 zRahN_fk{itA-93mYU#-BT!fQ@6U2*MRkZY?rZV-s>4KM*sgFtO`@zjejdKhel{6+v zEYvIK?o%fIT5bJO05!E?vbTs{-L)2is`k0YDVUH-vE?P;e;y&tt1?Oj%Bt=qh?nFu zDpcB?urZ<Y#Y$7QQHaBI8?Q@GW0|j-#jxBq_QlHgRN#%Rx8!>Ry!qUH&Yv^O8=q&0 z@bvlHKt#2FrZ7IQewd41u~rfo&1lC0ghf11kd}UfOIq1S4@WdO7N5SQyG?5pFl@wm z%H)V^jeMWOFTGrIy!1$Qt|8OD9bUV}v*OSjj5;e^7lXf<oMRy1k*D62@*=tMCdsb* z#RL;oFb3oL<#=terl-NwG@!r0B*00fLnuAV{4(#lkIaZ2uRz*#w)#+@d`g|YTKm{# zQS5wC@jDbB5AQ*!&vHRc{xgHmsgvYwHA^%A9N5a7h*0_U!t|r9)MMrKYbkU);oEGm zVQT`1k<qU9!qfHrw&=fIK$hoPrW(nHnwGYZHP=)e30SA{{uP6FcBfSVyyc1FPk*q# ztf@E+px*GVslh@p3Nht=0o{X#-lYH^2aBG}l^*0w0lc@dbql=H1bB@m#W0Xop{tGl zXsKebd?c`qeUw{0Bl4GWX8nrT{Pou_Z_^$&S>H%ztRvKZ(#`+QggV$skxY#RLNK`a zV$Xdg+zv8*3)bN7?6j3WLpPTY4=V6`ab0-5<%daBqL8{?ps{2MAo<09o77C@0obl0 zwF_+x!5Y#JNTiRaLXD0F)CSk(GAcPn`fH{xhdlxdUI;7;t`S|&Q+?X~1UJ%MMsC6S zDs5)ZS~Uq5$Ji;!IrZdP7(x%+rFOZZ?OLUPL(2|GJY3b<%G6$Mh@V}~I)!Q$2*bNl z!77Xx&c?eh&?;$+>}t~~7$byN<@&)r@x*AEHxIa9nq<`h)jbj)u$CR>zr;3CSrF;E z0~>6ap?3ma)!1WJ_EdAE<p^+QsH{of{~LyoV`INXO?e6W4Lb|^QzL@lVn&~leRQ-n zdzP!~+?c@UK1+UoV^(8R`sI!gN{K$^D96zJrL*r4St%y$5TjdmQUQDQ#ziWz{Z)7P zAk%nmYgoSaH!t^-r~9wF{u27`k7>A-lnQjzTpsY@Z7}E(y*c5SiL+^)6ycIk3SN;4 zKsdQ6`CLZVqwAYizh-%jvn!|}Apj+(+!afN&HE8{GlR+ppPCuWjTeTApE;O`E6bU( zw%1Pszl-0d9T@(jlk^`?WjR3*w8&i`2mu7vG%XHNA-D+`EqK(n4nc)TuwjIEPHmL1 z_J^yFi!`W6{m+rxsRAKOC3N%v0^5|C+~sGo!Mh|>oeVK|P~9);Z!4X(F10NEm2-eJ zo9@!FY70d=gs+N!qg4vuTA7>tT5WO_^@`e=c|!@hiKT3nK$XH$v+ypEU{pZ7d2{b# zl(~xr+PhTx$LDD)B}K>Qf&-A=;S36t%7%~gt7G}q9eS}r<=8rKgl0;G;uc|pENE%C zmqS#SNXzk$f6(+l{^WSWDb3=uKdmkM?jXkXN+DO<y2fbo>GNvrjtoKt=isASe4p_5 zI7rk@8ug*OZ-7STr-lqHC@nL1;CJ-BWw6@IU8R}IfJMokmcb$0o-ERA-}Bpl8t}hk z;$m`oR4Y@DkTX+;W$1tQ%C=W?xA(|apM`c${ML}=t2uJ2U;J_F4|mT5g1#C7a)H4O zx44}hP)2!jO}xr!&gu`U7Lpe&%9A5=bReM=D!T>mz|ulj{Xyu%Tzg?%bnsEZ>_}hs zEbnTn&9_yk{O>GpBqk>R^v0#@C3;{(;o-m%cerFF-<?d%*U$k2(672YGE8HT0KCz7 zUb1I>w@Q}(KySN{<)0RC?<_qBBQ(`HeqX~}S|sTmzsRfI5Uq}J4rWHDWxp~Mt6L2J zV)lhO33z*jwNh*Pp<)m*vZ6j<Vwu<5?tkG*(9x&U^TV;}dwyI&F!t$rsoKC0-}V48 zAD<rxVH{sVhrVdPwb5lY>*0TCHJ@BE-5O+pP$@D;0mDXtMk}ThBZr~7{t6iyCJGn( z9nn)1{dkx^+iCb5@@yG$9<|Aoo-4n4_XGIJyc+cNC^oyDSzN~OaPjGFac7Ke|GK^@ zry&2;Wnj&P`JCnk0cyztY!O@R3l))>AURnPCf}RlBg~^;n_hh=kOk02@FV=IL2{WG z6PKD%OCw@C=04weltGI28|BL_oj~;UuDUVmsKv#1#m^EE51EW74>CE4Nfb0cdlBM# ze5)7UnwY;-)W7tqv}C7|*&st6jtCmMO8ueV?n9{6?52j4v-{Y}eWnE1_Qj(8)gFB* zBO#OvXJ360-XhD%!Sa@GQa%W1`oCs0a(~Nc@Th(eS;04&zuwkXRW~(at$f!oYjs@z z=KA>D^H*hfpkdjna`J2CMvIgHaUiH5&>gn7lpOa8{ffD3x07WLsuVSpcIKf7cr7;! z3Dq+O23S6ACX~uofrC`u(WA$%otL~iI?OE_V!lma#Snt2$zB&1ond=Pj{rX1bEu+a zJh{GdY%@HgnQjqpImK-)Wae85@SSq<i?JN&-s|yoY3IAD>tv;&xA1MGMD=;_d)Aq- zB7f)ID=SkJ!eh7f=1h}cIBTLk)}`Rn`&u=fC8dl(T`Mu+A50WRA*1F#l11iUYeAXl zZ4q_5YGoh2jhtmI<a<VEV{{xn3CCt=<Ki&A2glk0scyF@eKdrziTmMDs9L*!J<-oF ztFc?&P%*_1;#Zedz1ZUuTwep>CR=%$PUJ_te>$M>OrvmGQD1R+5l)5*gEVUUmBn6n z`d?ODI*){KW-C1+%WIedlzPAK2)NDRXh!aCH)#CU+PnxR2g`bFXdmeVPw*lukOQ-F z3Wiu5`nmG%<z|-ja+(mv5eF7aN(@a6kTskQ1;y27_b_r_b^v?L(B5B4w%@za7ff$$ zqpM>DSU{O4!4AN&+<LP<fS6YZvNm_P@z05rc|d_kcq~1>@byq-RBs-O$tZr>R62)V z8QP4^4(tCh-+tn#Ve<RX5d-uVOT%@?<UCsBx|jmI3l!R<@M8z?j6jCRp6`WB&g|~I zN|K;~QYo69zw?RQ!UFbtnf#49;M)0V4t7vAs9oc1OA&>DyLw)IJOyZ1K5!}%M(|gz zOd2q6GqNXj`zIN@D~Wee*CpqKfG^MumsS8-K$p`vEN;?a0F9mq>?!REUs6#X5^_B7 z@A9~^1ocl?kb%Cxlo*Tk%Gdo)e|~I7r9jW)V4tyYyDCt;b6TLUU0PR21zTUa1Fte| zlE%XZCy`bmjw*&_lb05^3&S*XQ*6ud)-tyPO!sKA1z?wo=D>wJM!cPCA2MqKCUIbC zxShR8d@k#XajIaoft1J%p<8bas3p%L7e}k?8d5E~*AlQIlKEu{RF2v(hj$vOi<y*p z8CGaxkPWCKO3fQ-AX1`g7PAynebuu;L4RFg>~SOVme2$p)pCO)mkBLw^i3A=k$C3N zl^$E5OHJ5MnnQa{t^?Sb0$$S``SDca$5Sk|o7y`=W?w9RU@SVCZdHbe7q0bqf+zDC z+k)S&-+R%xa(gH}+ZZTGOK#nW1@_zrXU~1V(LHV@Lie@F>h6}aSKn)TxpU8m<?Y8+ z*XWakYhMU0hmyfR<AtJPX*@duBic8A=&fyNhvTn=oZ5_9P#SfQ`ydMAun>ZD(t<lD zM*@A>*&6T_21z`QrI8|<VXQ;f{Ts7!Vt<4_vMO+&zCqtcTz{NVnbmA9O`JFOx3W~= zBF|@#ozH!z3c>EEI21HZhAl>SG^s(QIo}>jzBev(>V;lHrs^;(!XH_O2+@*N9+f<~ z_2gJwQ<)($k>NI{tZeFC`~0g)NoG%QmTz(#I|5E_U1IO^)GWC9YWSG@9wz}@6zqq5 zwe2>~-5d)A#z=EVZC~`c&>19VppH?NfJtr-n)_Ey=Gq)>WDO#QrYh!0Ic5>%xPwia z?-sjpZR&@G-Sb@^Pj#oNZ*4Yu_ppvDC#}6kEK8oy6^b0$z}4wcADVd=Sy48Fq5(@& z*wJhAy`#)=qZlg#`JAED;)%TH61F&z6qqArWApLUB>|R;k{%ZD#kh>9|NLNj;*4|5 zNQCjc%bEQ=&VGpH(>II2yAgh;+C+Z9&8|qkY2tV^d!ZtG?n;w?s)4UTNb33R=XSj; zfN)4cM<`0Rw#e~jBaXfEmK#VFD1?Urj+AG~a&mpnWf3E9OO#TtA0+y2ZH7pjE7O)D zR&bO{o^_4|YE|`$Y4?p738q~j37i-I4Zi{~$LDXiALLf^n9{9Umvg3Mxq9bfu90vx z#W%=J59_8P9?}E?%lz)bfXllTyS%9#ZULg$0s|#Eg$QTSn+*0@xpgD4?};M!1k+Qq z^Aq8b&#OGL9SBg#w4<>2{9U7dYoT3Ae&pg*Kl$Z{Z};f2rWeIS{U4Vh>g+G3XA<25 zy)VfxLteEjyQ=Y5aaJw$Dv!l=c+AN>B3?~|#Lr3^TaK9BLhgrO1=<w2RaC;DA>B8X zSEHl<T?pnteIfG`m3F$JY!fwlc5OkU@bMubGDF4u@*Q`qZvAD&CIc1k2TKup>IjFP zYf0&yo-%OmIYb#kGfg&7vf{oMYFx$Gn_LeKNhXSiwE#Q;dci*~6xYj<WNTgPG;Mp9 z&!oS3*TC|o*Il6-D1C+A8=6d!=HT3lAfL`xh6L4H;Kr7TF@`t`s$XfiTCjO7BdC)0 zrl8S+#{FtPC1_#sO{=hty8s|XKJ@Hol?pV=m>=xVN@Idcf_lc!%Gh^-f#<B>n%r$m z%l0K}*_`R^k+@H!-bQ!ILbm<iN>Y+41G4*l)ma0H=^rdZ7dlP94`8Kp@|RyDL>d=6 z`o&JV^>0@bJLKUtSs8JwU^r+>q0@w@&7b;>dyfONhn*;$6|EB;a%YGL838xSymQFx zWR^Jww=Y|2yNU>#X7^Km`SH}-+}?FFTUmwSxBt<B+Gg2OKx4VZyHuVKfodm*>Y@3a z4a${&3v(^5R1G~@^?h2|)I`DclCL63JyJ%?l^M%uFC!USqD(*mEM`u;SR1=eKLc4( z5nL?pk7Oi!ISHtxFVdyK`@_Y{m$aqJ{Z-V?p7}|S^>m}+qTjWo+TJhk%zO={BlIe) zBGjo6WW9-iN*5Ymzf@R^Ww$q6Eh*&Ph&KR~Y({>2YBxpTEYs0$VNfC0)yjVoqED7^ z;jtZ3Z!?ZE@kT)^ZFVWktB2h#bMfS?_@q)xZG+R*E?jD>RcrKH3m-x|^Zne{i*tj! zF%9U<cptk6F$Zls#-Xi)nMk~W+hL#_GHQKtX;Bh`o%OlE?FHGD2s5-8uAX)>m&;IV zH8y;QyrVw4?t-e1Sx#m^KkF0}jr_9TMXOhqex<sheK5_)LpJBeIj9Qk92RH2%Iy_( zd9`nVQuQ9mt>02fV!bc;J<w&gH+|SW-u!r~YBuiUDXNKve@YEK^dO6iBw28N{z!g2 zXIEVHgZ@_$-!IAn5)^0WxOltq?*1CTjBE_@f-)ZwhZ*v;c9-Ka~lF>R8q(tI{} zFp<}~RCARfT}yEGqGEF1OLw^Zva1^zvz^+Rt#AkGk6dmS{uG~_-gU3*EAdh8yTDg# z$F7@pc0^Z9<W}3n#3FG!lv-;U(wB<4h7%);_V9Sf*2=DzQT1kg%cy6btz<TZ=;tiI ztYhmW5WYVEz>H`4sXj$zj4BQB&+FQo#oFZJ!YTUA^Uu>TpGG?O{|C(CPcQn{*I)Ia z|KmTuIGO~;pL<2D_tP7GH=mUO_r|*zvEg(To_|Mm4|DhpPS;rUcR1a}ot;4hE$VOE z%0=4*44H|x>nV@{*7$`>iWfqiujFy*j8<5IGL`1FA6rEzT>K?7?vG*q<IgXL4vZs> zq^FxXG8rk@f`+W?4gP#eaX1Ifwy)FP1ZCc-it6f>EVA8?k>{6}@k-ToqM5QPmsuq| z*ayemOsr}BJmBZhEbhi1!yX(cAdRHw^f}TPDcuDPtJhzp@?D5~<?wAAPa3&C)3+oF z*L%ANKhUyp5yVUBD21+61Y;j`4K7aB$AZL&rd9I-rPH9tU;W1u{o}Xi-o?dl2Uh(w zpS@0syqkpogz0Ph=BFo*H`tK8Uw=GxjkM^;*E|je$J3Vf>Dyy+_<g7$-9Er(8@@^= zu=+_9CW1D;vyn6w9`@YYemfZaZo#X3wtvdAGvkjj*q<kz=uePl|HKY||Ms7e@QYR% z#Ub0%6Vh&@5^A?ffJSM!?y<ZlZXmI0QXABwr%Dg)O2K8~vS>3-5CA|5h^{&3iNZK_ z2Xxb}4izd=OauV?qk>e0Rh@Uuj^^A$fJM~p4dWwDEn>5Q(chojZ{P6TUle^mv=mh| zSv#&#JoZ61GNl4hJt*?U>*q7bp<bo3S3lP3jUg^vlXEusjw-c?>vqO;;OamI=T&5! z_Jh1hmUw9ux9sj4^C}7|%|)N3Ekdp}z{>dg7HBQmEECI@J7>jTtVdnb#)wYX%Lv5v zdOUQP7a~YK=hrF4G&GiYn<q<7$m_NVs$*KbNgv`}$g*HH56=gwI;Tac>e?m{<DtAE zLb%*`Sh=(BMT|L9P%Aph2o>Pi!x`H-A57K_s<|l_YE=F(-ayn{h|=p3nDELcI*xMT z(4tnQF27D8sK4B=*sS&-Xrludkm?xBv!hdXi})&O>TkdV_%|=d!)Bsdsi0SPp0ufn zD*4)?1;pKY>62Z{BC}LwICG?u+jND;DWO>6u@bu1>>m&_>Wg?kJ3=S_e)PFvg)dt7 z3S{Hw8XsIS=x3wfF0BEY8rFzN{LWtF%2dG$^|65a^Vw=P_^lrhwuGuqB7V>dU7E`B zQR|CssNu29GPiLSM&vd*l2*lh<G=aS$R`Lle~EBIX@32QSbvjBZ#n35gsf(-X{MS< z$*~I?#PiqJCm)^e**&s4YKD&%$VS&4PhB9=_E)xXu5yCOd}wB&wD;|P&2dM3pe8je zscyVkV+W)v>%f%6+k|@CqNf+U%ViIgqjuBx1ckr(G|Yd~>z~m(Uy#3fL+ujOZ1HH+ zajVmpotm05?EkDNJH?XEjYM6=F~eO9ZWhA2oq_=$R>;dTXk~S+Wn$1&QA2m-Qk&xL zd?wz;X$6skY=F*pi#b~JSa<aSDr(f$yeZc%wkQU={{z~b<+$A~S0!?_6JtDd^HJ;F zrSHB3-tLj_EwX=dRw<G3{Y61T@~l1g5-R5T!)M<=hwua}Q!_1~;{@9mr90#7HhXUS zdP;c=yA>~Xha~$bp{zGLpeqITi9L4<+v}3NBOiy_-ANQeCOlk`fqn^<o-lO)_*SAP z@iuK-O)QyGZ~oW+V1lRDbaW0HM!wnX4WTz>>j7KV8nva~y?*=cCup4b=v4Z)O5)TK z2GhE-6R{e$bcK3^7iA;kNQDu1=beJ*>5CgZ(51srJzq`I{mQBX0%k3!erN-{it#Y~ z)5!nZn;idXF8}l`2P0Nr!(&r9VBy;N^GWE&q~PP5Y%kEuH6+4>1-EQE99Zeptu72U z1V)A<*~~LC(y%^?reR}>;>jqOST24khXku4evq~z_cEZs88^A<_mv4N6f57#Sz|cE zB5u#kRYhs>NA`qHe>_2>`?N0qj7W35-agdxz6)i#T=KHby6Xy#K_3I^$Fwp?G8-@_ zZ>J=88%t6o1V<vT`i0>J>!%@(4c68J{6o6x6nL>}xfZ*pg_U0K?j~3+W;<xeSZB2| zAoa4P_UA?)GRr?r;xDdq?H_b&BeGN$Hp#uR7dpTJM;)@$?5d6kGp@FoYyGngdPdqM zn2;BD;6jfQpeq(o7}R{iBv;Wlty=JvP3uq{Yo%1GyP#6z#!xw5*Ta-T4X(GF#xVF- zz5bU4{1f?l<TQ$I9Gx{voPBxK=!*m-duLq2W?A%xxU1+@$#JT_#I0$}lNu8v>86Rn z1VY7HYTf1Qe=*%pUul1?gRgS(xOmk3c#;2!Tf`?^J7>j<x8}1~LSP|6Q;z=wtzK)_ zuOAM1lU&=mVXM%eiANJ*)}w!5)noJLS|&#mDtca^WI2pXTx8gYcFH<G|7m17zh=r> z^Io3I+#;wL?YQn3RbBX{sSoAHKmE;rx7+S-J2BzDiJqtsR13S>RImRMP=na!Ud*i0 zZ!AUF;ls4d&j7kcSQ1k!JG*E?1|zDk$6PnK-D<Mf0ZDa}tjs^8DJkhqmV1VmiA7MW zbGIwXU_&;R^!%cz^D#lMyFb0~wG%YDPh|LK1pCBRf1=c1Tqm~r?-J)<YODXX0Ca!% zo&Ps~@z03#iLE}d)&C`I`Y*E81HZ@BTsg0MOeEsf;sOQ;**i8#)KwL?O6yjqAIg6z zRPu6zjbw%qEQJs@i&RL#2O1V#k6TVjZ5?YFiYw+cvDRgA>8gS1&|y+#U=o+!B&Hwk zr<%p(%^b&CH^k-2_?SjaU@hf@j`K!?KAv)e=^y=<(CGi2hx~O<y5Gl)>(}pW>b%Pw zz-n9HYs}7kW`Q5qjbN^&OuKW|s<ZpSkd(M`0)r`dI<A6BJycXCXfaVCzB<;0(oTw& zX37rhPR<`s8JK1AO6D#$_{kLI<P=`EXQL$Q#I60-clj^g?V_-GhP$1f(sNJtx#2T$ zu47NQapnk6jt=IFi#~kqKVMPJM0VCmjN4wiIeq<?n-h{uDqgaLh6!S~%UiCS82Pbn zBgsdly>@cwLg&wQM*!JJaoutn7(Rrnb~5P7@Zs5wm-f5>0QdBy<0SVaus**YHf{}U zfT9z`BS)MJhZTPOi^+ZZ>g?anO6qC(-3^=Wu@))!VB9JOin<ke)g`a*y@KxoY!-na zy5_nU1t7g#ilb5;c4!U`gM1LD+SsC8??l}D%G@%zX)wh}O+VZrFlTBNtnsqm+5|4< zspMTLCW0SsHH|WJ+%fEPc>Sk|v^9M^W&4)hqzw|CSAj^u2DbSh5F#YhYHa@WNB_-k zKl^y<o1-xeje2lhN1(D;dd?E*2o;o0Qj+j+;H>>hPKi*lV?nV=eqvy>T+<JX+%Ang z;9d~ek<}BXUsEd@5zYm-=c1~c!z8QS0KaxT#RsHVppe#ZG50r|CUSFSqH0Q&KeFHX z-;Q3L`kYUGBwH^!D019av<|Pk-z?&A->`#nO_Lcxfo=omoRzFMygr^PgCCNn!ZA1! zQB$Za2$3-Q{z87C1OjhlV!t?_Wo^tv1QMl>4dhe>WfW|S9*j`>r7;2<{Xrdy+U+;0 z9{O^O2)A8dPTa1^*!)l@-+vS>G8a*EFt<PdbUL(6+l#geCmqwfVWERp!3JJVrm4j4 zfY8OQ`XL0)ep|6Ulqs+|>H1RDQ5b)30EI?`d&0qp{en>W5AKh_1vNXi=X}d68>gNv zJx92{3tg3(YaZ$7J#yjeDnE?cg%ej{uu*LB7CCLe;lpR}bf)|W8<kwsabvN9-G~7W zYJQW>_0wC1QrOL8h~oxTuKCWcap1RcK7s<Lw_|JX1Kd9NFg4hC#z`1<W~p<(Q0lm$ zDRer-+23pe9!^`0#@8W}Z?K7yIsE>xv0S{M#>hm?2UKWj3@$Kl)@&Cz{qzkhNb@RT z9E=0QLj7{)(`83gl|vUlo&r6Db%&w)_AhtwdkUW`*l6<k;2Y83wjPlijbDX_H|>HU z;SSoy3(`C_zw(7@SxQ3@xfn{nOl3~bop~7Wi2rwb-~JQ5uf){8d8us|&ixoCJJMv? zzth>Hy?&IMv(e1Tn=jydI?w%~98RL|9)?SdolyIP+9$kyqDf9P$%)=Rv63fN^28@O z@c>W!?Gu0dB)U0?C4Y<Ec_m&bjd0$q$H}D(${ofS>Q|9Ko>TDgN+MWN<Xx8m;5+(8 zA6HEnV(<VSF5%oglG&9ybO1CMPrSk+>=dCNBs)k@Ipqq1hPVh|(#FG<_mjL|H#Ec+ z+cYHMDF9_NC^#p#dri<tB}GqMJPv2_7+%qN^QrLt+7%6hbJFR+_GH*VIPnG10y#kg zO3|0m058Kq-?Ql*4|;~8PX}5o4WSe=m3(vJdnAk8BlIJ)IG?o4yiW{C2!0XYAJI;$ zoyeYd^*8yp`ei&%X>AhhdFrIRg(iq4rF_`bXH8WzzjoHpV1joS@c<b<jLRA#jvMaS z)T32DXqVO_vujg`HQtgVag-utEf@d1i5#FTd`j$&R`MHHsl4nkC7<k`NK1^z&Rl3t zRn2Fun2=ewfRIFwF_p0VN4L#q6NMSA&jQAk8Xt^8_=to=tON~BsUxjS4B;}+Vz0e4 zU`ZsEH5Db9K6Q+mrA=3MeqE)QN-KQa|BA7eOdLM0+#xQ1w--Vcsz`zHaSvZ*eev7@ zc%{SZ%7+$FkrC%Qj304{;)KcMT=OVF{^A$v89z!g@`?nIGHO6RhC_d~6mBO=ak3OA zQt|H;)QMD_D5w)#@$b#{iBz0O#fem$NX3aWdlFZi#1$tY-bu855^bMse4Ok-o$NuK zYzLm~%%1Gbo@|nz<SS0{6(^~qlPumz7VjjXdXn2d$!(vM8T?-HagsVZNgbV}j!sfX zC#j?VTk1$pZutgk-99GpSJk#FJ$E;S%_*J%=Yov-l<d<!o<h@m)V#|hF^S9jESaU{ z<#G_a=xx&FyyA#9hYcT3IFQ5HzP<ESzeId;t+DA|{P-Q-Ae+-1Fj;$iW+zRZV!GFZ zR}d&w?DW4AE*TqoT2sj9eb%u{AGSCaB3Y9e^mtg?QU2lhU}T5%5^>%SkH^%J>d{_K zFfO5l*KQJRu0E7j^8(8ZQ~TD|rR;2)f`F^_l4ibc1tv@Z4`8Sz4;A`IOnu?3S)vpr zb(b7=?n*KH{F-~WdKLMbmH5yyl)TF}aU3jdwTknPY}N$Pkfi!0w1k7Nf5fdJyCY3I zN9$!@%~0@F1Vf`tOu0=CFeC0!iYa<|CA>DQud!NhVWbk??$nS?lPJ3v?>=q?=;VLT za?xqtIEJ7F0bbS-s1o5{4yMy%$muI;exNBpB#DH~TrTx7WWCH@vN_FZDs{oR`exEb zeo+8fOx&ZjeIc9rWsU37jI>GK0J33<zZaT+Xm7gr-THra9fsT!r^RwRrWfDN)cClv zdQ^w;{7gAHoJ9N-CqPsh$@60iEpY_G3{Ww}S~kfq_qH#X$O{??cmG2FreELTK$H!& zu?cxFO*KR@ovv?lj9$!F4l4BT376TYE-x=F)j*^iY@METxV^lR;BV)!?avL)U~(b+ z<p5%0D#q<&*5MprPH$g&(lU9E>>e~f(G7pgm+E!NC81ZL;HUQ6?e?+R8!0G-XMiGS zugc!656~U^9&5mIzKdVKJsj)@0Z19z<O%)-GfDWquR1Hd<c#r?dQJ$gM6PE+Jyi_7 zp3T_pSYO^a8>T)wAbZrD=c9jl!rDc0;oOU;S02-tlEW0>IGjA?=LZI{aX1DEOJV?? zA6qRG-j1T;iZ#k_=VRjI$K~V*p2}}gW8tcamY!Q+D7-yTpj>OjvgxbF@cZ6JHm><w zm*w>2do?;Tg6;EvqJ6z-V&l=wg4dB9DyDpA4x_?)h=6dfaR-a~v6(%Cvf90{m#<J0 zV__R)CF%B1V`E5y8@$!D%LuId!`)rC?YvOO<RP@xY7#L}j$mmV`*la%3-~jIfsv;8 zXyy^sK@~Pwxo>-4^WJug_$8$HWB|RV33eDB4v?Z6j%1Fy%8gZ>y_s*rOLElZXR7Hi z^Nmfr;**Eua6HZ}<E;*PD#d`nCWUO8+D;vE?I~m8p6v|g;{4D4333S6IgR4V-r39V zvvR#L>{SPn5CIg^Logq8bHr(!N;T~s%q;8RduyVU+Cq8S<~-6eitw+1Ds;QK`&x1} z-Gmte)uld*CGu5KyJw+D@A3!`H79v6*FzPdnR&1Ar-BshmeI#kvU3vyEx1hEZo;>V z*Q)tdeHXMCh#jX*Je4{=?mS^rUrjup()NQK_smP|;>_)SiEi;bGj1?rV`xtD%gP;L z^3CCK5<eBWp5MN}#%o-CA}c(2wV5Xyta&=gJPE@g#}u*wUx({74q4~O9?+IBh)OtB zwP~uLZiP&rfZ1fAl~tR*_Ns~!u9A`5!3j5Fl8yWeEV%^SvXSdtbr$0Tb{93rNS<_C zksy{efFU#43(Xk1(OSDyDKvX=E4Ze}Wj|VZBt@vcvdMao<NFT}yIQ~oyMp+-Rb&&L zPVU|r#Fhq+8N;MLi!0}OT4T$p7iwy*2Ik_bb8`>sg*>%=x#Q1U*7u$~xtcVmVj5Xh z9&saN=NV<MszvR+pj#3sJ2dt7B1Y{rL3A#+sw;YA6_n4G%<;CJqwOphY-gyhzSOI> zZ7tozeQn#--xm9Fo0;zoOxnoKrgFEg#v#)X<b>C*D{U<0jRt{oHXriC=G=qIaxROe zg1%q94lYJVvRlsf?BnVmE|*$wR6h%gWyP2ZsGGfFlCmO}cXoDQwm3FMX!Tq7TDyz7 zs#VfquM!lx1LAvBvytgs0%h*LlB8Hn99G#+4>lhGmLmi%g8<VPI_hI;+C2IDzhQ8@ z-)ZR$)wj;+6dI6Kq<9(~<HPSTE0H^7S^Rtz5rfAeGfSmRQe>ax`do`eT}U9IV{7g( zEGEGjt?grF;t@Ja8MqS*abh7(EX0Y0II$4_U$GDy1;p2KSCSvU6zpi-4_?1h@O~-m z<0);i8q_#3u7U51U7N7dlp~$VDbtNDi$yqTaj?D|96jh@CJ;Yx#X)uyZE~nSs_x+K z;8ryQ(*Y4wK$mM{-;QCDiOLJzkkL#4*uyvkwz@n=v;5URRKw_%T013@_we<mNd#QF z(d7=4FD_c|0S3+s7gYIVt&zX`;O`&eecrf~bHyNmTl2p=ui~mSg$Wl}b~6;>M1{gT z9tAGL2fh$8t67itOn>%JSkF8)mFW~V0_lG`2fWi4{a$7^U!}Q;_Q^_T{vHAixh4#$ z8wt2oDT~cv6Y9uH5B|+aFPC8-wb(WAK`hw;kXk=fez{-XMe`hAdMoj9KE!swuaQG> zv?GApwm~)ziQV!{RPhJ<w|w%s7yfXQnlHc_c@F$ly(rD5e|Q*y$wQi@Dqe{@a}*kG zJ|aY1Yc%q!pN0=Up1OkYQaktAEa=MKvGpk0b8^oaRM$It{Ak6XCH!!C@{_ae{D*&Z z1+7q0i<4||gZkK^?l5fP{s`PsCVcGfC?!6JQPkLOYW@z}IocH6{7=!Ewf1*tZFxfL z6Iy?A|4;b(|G5rPaLauWm;AiJCUiBrrSl*3isDE<NOaqm@f(^)W;^qxkeT}_E-g^g znY{w>#8&OXu7D&&w1MaP_jW6QGu*VvlF6mX;`%(r2jilSY7f!z<)BfTp>3w7Rmi<^ zQ`xj>A*~Scr*qj$D>t%d1eF=QvIw_OoqKy1v-rAxP(*O@08(bZw?I!AerNjDP|+HL zOR+F$0iSoyMF1nQr98ow)7Lx%zxfAKjvi`d2g{RS#9Z~Wp{s+|hYR|9Q`wQX)_ZnQ z2Q!hf{M5FZhwLuH{8j^It@cJJS{)Tq?gx@E3?H6!7@BZstMr{9W>!ihxG6mt=Vap% zmTPvhUc1WJDvjy|Qxp_%=*?A}M!493@s+lhrs%PDjPIK?;hU9v()`8lu&xl4b5VE5 zgK`L9lom``T1NZ0L<~FalO}3t-Oy1hibB7FTJO?$a}I<{`F&!LZ&7w!>gQ0O_)BtV zQJ1ES=;Zy_K{LVTu;yy<!F6P#!|rA4wdWZo+()_@1QJ!64Pd%skx@=EA)z%(s~pPO zPz?@6*<~U&$<H}6^d<sn<b=kvUo!&(2ny8|IY_J@@&m3T)nh{9@fF;83h~MaBwPMo ztF_CSVntu*xGay)u)WzO?&b2Z!)gKviADRY<|a0)5UmdzOePj{%R=YCYREj5P3a;} z8YeV4!;+KpU2>oQjWVSY)b3#Fdh^`_14h=W?RM*dvjRTRdAhslYx(%1!nnFDTOtTY zHKli3Wb9VpvE}vHM5{3@T*}IlyVZN3?xuVk)ik_e!1l+tj@3}xKPcOb8(Uw>)4l7? z`$iq_ezgyC_I^kL>Rr8OaxztP1|60tF<peLUv*()xMFZvbmXQvd~Vmf87@I|vb5^g z=$%)<cpii5jj2V_19b^*H#ImLs&6T_*Jnl@m>;XmT{F-K_^^2Vs?ew%w(c{jX8Tsp zT+wo!*J5$k7f1D?jvHDOY%A~7?;vWu^LVS7-U)8m$qvdodgcON{cv^3wJS!MeckWL zgfdSUr3t=671m6DP<GL6Ox$M4-5&Qt7YC<x1aHznEzzUVy2c!&p=gOivQ`L-JFpRK zO_R6G5q;Tqg{k6G>76s5lRpRZo$AHK=LP8!l+BHG^dG4xwZ>$Rq}5CrYPTP?EQqJL zkX%N&7DC8$>F`*|z5Cr_2~jt@ot&51__cs=2}4VI8GWQ+a75bDjWUTgH@4(N>2=0+ zi$K&?=5?J<pATqgaN-}e>LpL$$;VXpjyeeUn<U`pi?k#k<zD_9Gm<rr26B~Ee6td; zi+9Rn5@185$WbR}^27*sw@-H}k5>6%vTQln#8P8ZA)nlrw~rW5fX3nVx+UV`*7W9H z{gr^7=hyjP1dKZIKLpI--wD{{d(<ZhQ;{lGU(Cs&+U!qJeM5Fkin8Sre?S6jlRd{D z-_p>vUUN{;YhO-Vw;}0ftPPm5(F6%B)Hu~)q-p;JaWfq2Ld>95S5$%vJOgvaG12l9 zVvqse_v5;9oWfsBj(&aB-NCRq^7hA50-GEq1!_^-(T--N3_u8WMG!SDaywUIFHs^m z90!EdFE5o!n1$tqJA@nAVNDWk1F*Vs#(HRhn<BT9>*t9`o{)>8-E+(!u#=?%z<UaC z2uT(0s<%8V=gWnH$yHJBdc?+6HeJwrFh;9$mK=RiS8!E=YP!Aa6dcaR&mNsp;*0Ww zp>_lEuoNZZ&0caKK-q5&sMANdNfWqTc2neyK%v&$LB}~;z-v~7cvu6%^B_n3KwQqu z-hA*vlgrMvp{~7@8uZk!8Z!N3<seN4=7*s6=f%1+SQ*f-dm*z24q=XEH?_*4eMn^p zXp;A8BM9vs#_SrQ0s^W17(ZpRTK6A{ibS$?Ixw}wFWODq$9|c)ga5HF?L5vmHHlDJ zT@#aF^NAT;;9!W4!_G)^->RFeo2+frw*4m(SB&$sXRXGT3oteV;6$`pW)nK;#cxx; zQRTtL!hFG;b?Le9=InZuH)_F=RkCB8nzFvQs1|^K^rZW~=*%57Wn~<K1AdY@WJcLa z|CjYU!hO7Vrn)KIZHn!s4c%-NL4J^fd`=~QZ~MzuFq_`6O}0)e$VG4BqAD=O|G5_+ z7>y;4B~qqHHgLA|Rl@WF*&J=2p*Ow^y0AQfXLGd<=r=|gzvM33@j+kq=CQ-QuQxen z>4awyB=I_r2zaWkc~52|x0uDZvYa4j4Xg)JNB^YXmP%D%A=c$DcOKMw9^1SqlPFV? zCY!U>aiC7`QVKob5s9O?n$6sJWUz7X7R3*V*)~B6oZ;aVd@H7jOdivd_YrR6-~=_E z^?hc7@rVFXtb-#IEq>D+hr~||gToFwx3Yh#KP+O{n$Fs?PJyjG0+Nc9`+aV^Kq*AF z1`(0`O(;8k_+_*g)k66;2CrmgM~iI_KV~jyri(Bd!w4yk=y$)!r=1T;l=_X&5j&r3 z2}pv7d5hMJ#pougY_J*KM6LoF5SLV>kShlEfNf^*ypI(6q(~ZBm7d@-RK#*&rSJQ( z+b`ngIOUd>pl{{U?RIX5Buc+i@OT8t6Jf|yqEORCnZIdi+9&BGVXM=2ZtmP<165fg z*;b_z`8=PksWU*FxN!UL4q@m|+M5421*m+_uFL=9Df6DrX2i4B#+H4R>XK`+21_~r z7kl3w*VMMH8@F4r0UMFt6qH^>dfzHVx|Gn1(p%^WQUWR}9hBZtsw4!YB%!19j+6i) z6zPx<dI#afec!wH+<W#r?|0rg_ug~&0setS)?%$S#~j}n-}vU3Y%H^wA<ucY3zy^H zsy7>({(x;4G`cK4PliWxB9q2(MJ|=!xZwwGJ4UH{#VguUrT2@-aG=xQmpoh|ki0f= zku+K5#7q}mzU$d5e^F9Yxf>Q^Zw;Y}Ol>QD*lg@}F6}n83zm%m3^cbSzk&DxiS?^L zTp<zRom5I!N(XQ7D_SK%xc*8c2^Q0HxTDI)I_YpoR}wUacK(JoWsI%rF^AC>O2-v% z?kuo%)PZjv_-Wg;@2{~I=Opnx<JQQ1X~Et(@xz1L*44%5@nF?lSJvU$PgnY_dX9g% za1AHZ^lT39$c3;JEKBYD1wS^G9|-C8!!s_!rey5#Y0~0Xc-f_1Y52=9eTuXhmJ4TP z?|OC(do#_heZLC^!|yxf{T6=gL4Lpv$T_zzl=N+Wgt3QI=fetY>`5WWJSnot9DZCs z0f&&n5M}+}kp1oOJ+q)8&rPBETw$TRCz^ypvaSJtPL;N2J7DH2(=QKfZ(rY_HTVrJ z1%5b5txi23``0G^ly(ucZa?5M)mnFao)k6Ni)!??6BoJpz8*@GqLCV35(@Qc8XVvh z^s)V)babe?*{!jo6R)f}OIIFm(3*a>>-ZTbuF`4_G&F2d;&Ys=CzRCufOvmr^E)d_ zD@ypaNw^HjT>@n|q*8kAxjQ*rcFSJx5>3&HrrGy?i=tfKl*Z1U<RrZd61WxS8?xzU z{z%>;4tq~trVajazH{;lHP6kY&@%Lo$OP;5BjkhVrq#&u4vzYZ8kGnA2u%hV6BoHj z04kMj2T^g8x^EHEKf;%mfct^?eop9K>|uUy)XVVD=%>`Iy{#)83}P`>A)#fH=fxj! zV$0<3;bGPFj69}4Ts?H+M>vHuSthy7|BK@kLOV^6Ts~F8jb_DX95!N+No+gJwGju7 z*VMZe;{5RUH@7o8-fc|EnX3pItUpds{kc{t;kPKT%l`-Zm&H$DrwuZju-PqX2S38V z<RP>aDOh3Xp%y8V@$I~_EgxNFHeNjWBW@i8)<gO*;@&Pd^cB4>CGSEcp3-*|`QMOL zN?d0syD#4JZX*c@#H{zL{f4WnKSEcFu@O~&Dt{`{wlJ_>QXBx(YVRdsYbPmqlPmfF zJ#+hKZvV{flah=xw}0mL&)oi5w0{=upGEs;(f(Pq|GPBFA1m4~DPy?>-z*G?8ysz6 zQ&%9V7%`ll7vl{(k@sWS5Lk6_r!0?he}MxWDNiJla!`{I&?}P2@blB<#%VXF>7_ny zQm$f8qSGByrbJ|HS%@TIoq5^_V$sv57pYTykEo%%q$#|j&f4-6`}uR5N$VYw1~AHL z8dsgSkiowbG(u@6<y`>nida1$kaCq35{;pzXCBdJRk|NuY6ROUrI}Bkr^?i!Vq#~P zP*iRQ+Edz7I`Ly85v@zT_5q8yUY}07x69;~2^zAQnXTN1#y>=iu7x6RMYHRHuxoF> zyLK9v>mNm>VcmL3*&=Dz0%w!q8fGq%V)Z<w7Tr~ULrP^|<-Dpcsg#UzjoyP49FLm= zNm;itS?4AbR}Y3o^(Q%5Njz|ju`=4_qv*YOQF>UIpCkfwHl&!q2#GG+!%r$nn}_7d zteRQ+^pS`*H(MDVHQm$|3mKZ2W?*=WAtJPde~~+KGc*)SMODo%{s1oNFX^vi*KO-6 zq3k8IC_m{{|F|}UBr=3Oo!j0ORvG9ci5S7E=`ZqVHW80)LI@Dup45VIm&vX`2q|Th zA*G|k$kAy@)%;KNe(sf~W0ig)og}i#xVxK}YUk74i&ghmdLm3`w?pt9&)7ofyGGXN zQB_lG_+M`;HG;U`6&@}P`ym1}sf4T+`WC3mS?)BAP?+;fdCnZw`;o{he-fdg8$V*T zF<KPJUSz;q=c43mFQsT7Pa1;IsD7$48sjEx(^!PKHJ?YdNXnGd?pDU;>pAI%hVy!q zTm_}!@`*o0j4+Kka_*7@r{LQPre%pP82MSdUDK@}Y$48q#K;u4T_$M^pEnJ@Zk)t4 z^=Imk7^_}8dzV3xdOJv`=@>~@S0hnk+B>(F;gsWTJC+>vHPw1FQ7*ix{KboCWTZMt z0?3GILW9+Nq>V{?Rur>VdM;}nCDBc6jgTlStQLvY%deq}Zn55=u_^@;toXX5Iyq#s z*~JwVT|=YZ!g^VIS%-|v8BC-4(|Zs4(CKUOLbpg7L*8UxIk`xkZPKn9LJJeR_BS1s z0^s@#w+<)b%k2vHm?X-kGDxIh@7V4z5&@CaB8dzyvZf2t?iRB~ZjyMbL@yB;yOfMA z5tQyENo1&mt@E4o;R+xCnQ{b&nq6NFvXVrG1}y2<u7QiJj7TED;bN8=n1$m&pW%1+ zou(u;pYh82wM-IkMcQ~oH$G2nv=+k077C{cFEOREFz(f1n5UvDW9RTzba`#yzU#i5 z-ILro?i#t^(+jO#4EW$n@fLHS-_)_ZVil8@MG`UM<D|~3@y(mO@1PuB$x9Q{uEf?Q z9urB-A%w(ABAiPb-QzT$+})mbM<d<0?c+)0RXK^l7wuk4$tX+QB}uOZdkDi@RWgev zA14?f`5fMy$-8%AtUj%Ldt!~SzE08rDkI&A6S`YkiGB@)kYeU)z54l<y?`AOd9_Po zIP!RkTV_j*j+KmxfPSOlo4uZ)ecYt_B^6UPhYfFeNO=g7)}_^8*4tjB-ix>>Gk>++ z`%Ot_KC8C2^$jTh4-q3;Kc$^f$C4Lw@lhb!mLCg)w)U)`7fJLXY3~=(GnhwHlSGE+ zLJF?Fu7ii<$mWnJtaQ>`$hQyZCdQ*HNZM<Nn*}<fV@evMywrshX8Iu7R?6>B6Jme< zJc~1ZB1tAL1`lz?C#8CqV@?5Pa_;j38GC|4HH#z;i?ovp=^->BLM-8JGrTQU@Zn~| zM6Y;dUqwZi(9j7grdz;txpcXY<#zYbOgT~+TUl;WQ`{C0Njh}k-AzA#`kZBZlFq$4 zxA)h9@B@R7_a5%l@Ywa}t%|$ZHpq}j#0(Na>1?v%o=(!CUz3wG6Cj$&G0c;QEdB*M zNRNojg1t*#9Z82CQSP@>yQ+0C43khcFASZyoG%w<Jz69qNl#BOYW_sh>m$r$eDrGv z^D;{grwJi~@oQBc&?z|*kyS_HxOvo^OP{S6C{P*j(O96^Ys=HKMLO9zY!sE3La|qh zrdOtkN@>Cgl@kozYw1V6y$26A|5}8w{!0iUaE1_P2yuoGX9#hI5N8PSyE()eLY(Cg zXF0@K4sn)4oaGR|&oZ4M#2G@IA;cL%oFT*+LYyJQSsmi64slk8IIBaP)gk^vrTVN6 zaaO55t5ly=s?RFbXO-&T*D{?U#2G^TK0-v=`URWYZE|<n>=SQKp>5Lr_y!C>F&?Sv zRi3Hx*IeQh1y_rRYI|^yTZw-elBBCpcV`SzcjywaKJTMDgh2?yl}zo}MS5X&K8ikZ zGor3n>CDWUN!ko$Q+!mKJyN*0$10iP&MOrG>PSUX`Y%nG+q4f#Zd>|H@&?;=3e2j? zK<et|Ot`d&f_d?)y8}N~A&D!f&Q@eBHAGjHKzJ}=ov9GT?)d~^s(Sl|P1~mFyZdUK zldKsgoL*BRXdB3aZ?aj*W9OntB?gx)mfW=6mADusKee9HRS{JmK|Pf(QLzrMComa> z7CRus&Kktv$2vBx^V-WG20NE0u6UDFWWJaK+@)FB7o*X;6um{uq5Q2B+|sSYh-tR1 z|A<BT>oKnk^E{t1QuOSXY*s3bWR}ytZ^OH(v<IE}DDILyDH?}%#!V_^d#?`QjkVT5 zJS5>-x%GCYjOt{>J|T6_D#Iwfu)s#6*I18=X~F*#z-cB=P5CMtG`)<;wwK$IfvAvn zVSe4YbFsQ-PA9QrV@$QdwL@~-Ft-TDIxCvwIWHPOkL3(CpD-RvSTh)#ve>hA{-Ip^ zCVG<CpJ>;5aW$_HZenc^j_Ovl&(QB)4P6tqIvb0#u{fI-XY=CBN1frt8D5-W_di4& zwaW2wCYj?x_J&cK)oAgKDvb^ty|!BQn~xeYQ5|eqS!3^)@kdRlJ5CVuNZllcT>|6U z9MwyMSS;#B3k<k;9kJ9RiTcgT2bo9WOqW9%b;Q@V@%<v12N^XSXp!#3x7@$ATw*&N zZ20{DXuk9h@Mrm_O$sZ1<3VkTK^Jp<x-GvV*mi4=9l@zGBGliv=3HhCa{rpUyvC{% zZ*8P3_RcOPU+F^V)6rKqP&$dWDT?Knt~t}SzNeQ=$Y?L)!5WgYPv88&KE^wbL-XcN zlzW%xs1wV^hM%`=MmkHhmW~fzZGT^OEF<(Xv{P8NoG$UHLX<82(9y-sPsX$|GB>8j z&Bkwxn^vS(K(Ij5Dpy1}7j)QMZAj$#UvszTjTVA-<sAEFv!{ZA;>p?{Odb-S?SD<J z?`{eTIAGIeA;<nz*ZXV!_uuWa3a3N=gogG%u+`eX8*#B{`%{4RaQca~z`mHC<EulO zT=|ihsLSw`Zi&6VciS6ZCzAi&3IB+{oIl0<6Pn(ckNYpTMTOJhe?mh$^Kt*>hW6+G z@cik>KcVTJ`M5u~g#Y9t3a4NH`3&s>wKQRenxHwTp5i&WT0fr~EO>7f(kD*GIwAel z%qqEzf~!r5zucfQHF==y`oKNL0mq3@_MA4s%#tg3xuyh+XW59JT(tu%17~5zh&_2r zXDHW$5NFN8$|84Fi%}@@M1so^%R#V5BHPHQ0r=dli229$=of>+UZsH*FXPQA?{y5? zJNO(e!BP`((0fYN>|UW`j7<YS;TQA4`L%<GxWxL_o#DbSr2?SmvkiA$?{)iyT>0{Z zV<W(TZg^|VP8Xtwao2IUwO~>0P7I=~FN5)bM=;_`DZSPXYeEmAv!RaFiCcnPETgg& zZ~a@%?_x6>=Q#4KuSP!J)l%Fi+zG=EZ#_OVkT;QjXxk%NcOl+x9zJx-q+QabT1!V6 zKU<}FW3a}dF6G6yzrp}7mUf>4R{RFD+LRhD!a#Sk9#n*kZESoHgQmPWIoOoXlx8ab zD=zon^wFTx{(rtHLB@I5=e-z?*J(5(=(UvDx)Q$#c$7ce5ue%Zadj(upEF^S$-S!7 z7UKMfJnTmH*VWbfqsR9RFUi*9iXAd2yn%27=!dxk0cxJ}d|VeKSa;c-Xz#CR)apmr zrnD=osYn6S_V-rCjZ%pgWss<4(jGE6XcErUS<N8fgJ}mfHIE!0!-dPNyB1DP_v1Ab z^}TE}AE|aes!~n6w0jLVn!TD?2SJAAW+YBP_ed;>+Hl2tR#Y9mpI3|b$h6?q!g+>! zHIPLJ8e981&CTE5P!g+GN(AZMaAcoqMvh;s3D=~DBpE~71>xXHV-Q+K_f-N0VE`=% zF{b!y%#7SR<rFZwQ=kwX5lF5-_Ei40BPDWn_JPxp2sw$kfXaGH*!?xv`|tVe>A*jq zfdeR|E!BeaWAM;9MN8=&0|kGmO2<LcHAvU9-MV+9KDP#(YJ;)BRaMbJr$LVgNCVw5 z!{$0w)OA=PRJQT*KpN1VvAmx3$+qF4!^uZMMK!Myr`f&Ap@1hTu5Ee}Z=G>0$(t+& zA0ORIcrdT0BcUm}!k3#Tm?tYUm=<&c<}=b&oMGtHDP|oIyKTbx?5`R4KL}y;M`k9^ zH3~McJdolV9Em!7C^&;jW|v`e_hcp0gY#w1?#&fhKb@SBve|KDV)2f+$lWfV7~+u7 z%RDwMnu;+oNw`tnqPystoRR_Rrxa$WSK6V=YdaZv*|1uvBc$>zu&ce`gWz6_j-Oc& z@fqI<;Wb6f=kG~xm(=TKhb)rVjx4U60;;DU=Bz8&&PiWid-iXqKVCYf#QIXas+p8i zS|;`EMSd$eD!w7DaDLa~;n^ksC%((YzVX}{w%nuc44O=jz96ewnl5l)vsHi5xaU2| zNSibX4^K_br(8Gl#tcS0MBeK0|Kg4DCRnskuTFuM&Ha3Qqi(&-_lj~kCVODM=Bp*J zK{)`OMumUgCv6^Rab?D&!MqeQd|k?sSy@YSwn~-DOT;U#Y?a_u<=BBuB2;@<Clok^ z`?#Q*5v4MExp#qDUWlycBuiZ5TVne+17$rkv9sy=Cw^*i#QfahD^Kl@hD>{b=AEW@ zl~D3obF#YyYKA|xt+gh1JS=PWkizS#Nn`0&4BlD`+$Hjvi6g6>klFfGyoDfqA+Xbm zQ_M$$Gr418F!=NDq30h2CI84}m2*HgwWB4MZ)<I7R}L<urwDvEj1bgcGu_97Mt^Te z|L@22$@=dfGD)>;Ec684f70eswIk0jn&4(q**f#PCk;zweUCBm+FwF{!)WGHFB!Z& zvXB?$EGfS`H6^by*!B?e<af{eM><IPhpu~^*~Z^uYm|TJQpK5V{B5@JN3JFOMccU2 z<#&IK3+U+<=>6oYe-rI4s1Ow+zQu1X(<0~lZZ@zk*iuj46V7HaBk~Iazdh7$*nFn^ z*@TmiKTnXYv)V$brr2bDIBM`-8>BFQoV36FtA_EGZRx|%hDPnAtb#$0uSTwmee#Lu zY_~lNhi%pcp${WNN+;I?YQM`zzijf6_ubB*4yxW#dA}zNrKryqT92DwT;BGkWvbfh z%Uw$QK9VX&Ru!=X-k}P5l_jL0o%8<FL|-P9OL1zowtq>k+wx(_$B5(G2fl|;mJ4rI z1Gbi>IZpxLg_!%RR);K5MayZfuD-#gC4LF7#Vpl+iK7xxKT0pUuLL~%Dd4iaMPQc7 z{iiiqvWHq>4HLdOU;UHoLo9XZ_Ek5xwhyJRl8+xO4tQ&x5PDdH|MbE7|K+*j{&OD7 zN$wP|g!MLT^p;=g-iW66E5FkWW^M1-SQf(2bdlAUq(5)6v$eAHl_JLzgB!TNXFEMp z&xP^&_@l94B!aKCmX(nwB^)x}C!fUYA(8(v3~m?DzvONCUg0xt5VvxUY9I2f9~Is3 z{HJ7Q@Uq-zifnV`YRp1F%hw?BYf0u_o^13@HuX;aaLdC?3PYo&&Iaqb9oN=I`bW>! zh}oHZxk)BdV>qb5UR3mz7WfcGf<r27G3y;GC$S5xs3WCpzIY${r$Zy~FYjN?;veWG z|HIqPhrVJZ@62yxT9Y~EG$QgW4hqR9>ZQI_!jX2mmSS?4PjVh)G(~oIjD$D+)vfKi zIgZKpfZ8;$M*==X*Lu`Zvk{KAXix(enQxyN2sCm=3j&4B78!h!6vVm!Qs+iyzk%@7 zyMUx)nV-m{Magn(`z^)49%_qp>^~*QCJ7GtO>wo`H0T@hGx#-n29du>NQBPK?!lGG zWpR5>JkvL09~DflVr@|a@%fvPtc;FfsXq)ZvA9Tc31-EM%@Xxv^7_*`Gnn)*GtJEJ zfBp>puQZ-l5BoRzrQwljTSX_q{rl)o8Jh4a^qX0FP98#c%<Y{UjEpG}@yUmKg2`DO zHb)Us^=mY<ZC4HJu%<_(cGB8`sSb6(8!P#D%8>dPS6+BPV-F|ouK=2J+m8d^^m+vN zmRr6x62=KawIj&ym<|^US3dteH2s4}qyEU%+`kO<2jGN53BO+g0zIdij|;P|VsAV% za@$F*rI^fk{qbK%{QQGW_>$#Z$SAdYppYlWYpCM>oz7^OtWa$A`D5}rx%$skY$5j1 z6%*AbfGc?K_lL68>j8nKK`qzrqxvV5ENB~;FnZs7T(Io_cF9*6h9@zC!KVPWqMVI~ zg3jJCI@+&YufpJ;ON|R%{-ZA%t_2>_?N9CgJa`I-824U59fqzyRJ8=k(;iCwn`xeF z7L2k~UNb)h#Pr_T&kC2`<tyV`N9{`Y$X^K7xb_*qdw%Ktck=X^{VltOo1d&vW`|j{ zjB03vnYG8i-r1l2;LO~2(uR;a_BLI2${)PE&G!ge!p2B#h)s4|%i>s`{ZMoFPe1+- z`7_xcx-$E>n0NF714QDvm9ds@iiSwrr(-VWw63zMgR3Q_uUI9bTBTDmlA(SO9%#`l zJC?T$iNe9v`Acm1j>y82LwkMhQ>D){O)XM%m$HO}&mQ!ikGIC6XcCn~GFmoQw5$|v zwU%)k{|qvZthha=9^z5<u8*odiL>m=WXA3YD&b>TSmdk=H8pkonkwZ@vd_|7Fp2XA z0v#ZDvpH9L5u5bnSm2od?G|gZqBN-%lQDc1HPrX5wCW|fSQL%F304BHG>Kz?4rOBs zz*-BuZezt&XpLsfwFHwYO<{ALfv&Y#KKhH*eY>j&jMm*Z{#;LHBxQ(6Y4-_GNE2s9 zOxW9AuknN)#4X`#n!(6H-?!Qgx~n@(Vx>TSwJuD3VxH|DuGJ|&y*#}<DLE`-BELmS z7T{n3gkC*<d-RhlWy`9fd&$SFpR05*Dz7&Ue+_zpE<lg|#Ie4zF`S0B{Cv(_E1pdy z$$~OwSZM!4sQ8%7M|k7NtRF0Zf|z#uSJF&*4q`zRRYYHY2O@9Dnm%kWo6#tK*Wneg zbt|G}BUCxQI?*KeRd-Wj<l`!E2~xBO@qH(uerN?nSVfKP!(fh4PWkMtR-A>M;vH}l zs%&DEQ>H?6H7JBg?v+@EQeo^_mwh9|-O4#;fX8~i+q%1IUTQH%TQ-L&OWNx<=!&by zxuFOS`7oy_Cp*r|VfmgJv00fGq#HZes0BX-s3hGdxshR={SQfE)hZtg8qpUpz;8xH zLnr|AbHc{D_|D}cfcgo`i}M5v-tSkB-Hv{8JO#9@N<&PciqCH4mcX*ELYc>ZWtX)0 z{CQVVFNNrnW+k=4B;~6C9q*-!eP}DJY5##4lRm_eLN8I0dQ0e+)v?@V<Ve3AUavY2 zHL=FZZUt#>Zt8As-LBkR2mHhlv2u-4(kK2?<Ccqx5H#4vb^REdDHQuqyQZmZ_;POf ziYbrV^_{WN6Xg!N%ad?AZ>3Ji6v(wKzB;3x-O5L6F(oW&LFLn3S$RY17hUBpDzxc+ zwnJ^}MlLb8-@Hob;fe)$wLBG;T$VtX&v`D3mchoc84&_b-Utl3Myp?hs?1I#mfhad z%$HP&Js)b$SRXZ6LvrBh>Kh6-z$=C}hSQ)GaB9HSi^&Yn0sowA;~!Zh@VEHd1GbN3 zUs-yx!X<78QTwJuubIGGvR-sX7t7v7xM^f2nY9cvU!Bpu<7Wjv-&sMcS}l15-wpga zv&Jr*E8#}H6%`z3eT{9d++8C{RU=13=v{qv%aqI;*Mm(oc6u~h^C+}{C5?^;sR?oJ zv}3p9atX9GbnTbmOsiOoUyF)e%9c?X(0P+LI)|n`G_;GO^SQ2KW0h9mKby=brrOyK zo1eTBn~QRtmUwha$py(<08T{MgOJtXTy`KA8yC{j>n48Vr&ajP2SRd#NpMQ(ep5EQ z&JgAKLBA_jxa-}Lg@e}D+dnyU?+Ts*e48mu+o8FsHM+^$Y3e1;d{oXp{c8gTc-=Vy z2tCq_ZSb+h&u}jk4Aw2iBUMZaq^lOc9$JF7Z!cGsc?%-@pS_9yuC3+mm+-E?rY6RV z0=#&0$4=9;P|A`&Vr&<CM<GG8UG@QHV&d)aQwc!<q#sU&hrP@U--u1MN{%d>5U!Wo zqi^u!P0jb}3(#8Z^YBv{V4kT%wt=~LB{heHjN8UwcYA$<UaqikH83dSw712@G_tgL zPXRPttmRsroHM$PW5tsbrt#G{J}`F@xtTc=4=i<gZ6!-25ygtw0E$fFuEo_x3~1x( zKDi$*=B@oQ!{U>sYKLXDu9hhFxe+B>ClufG{u>tisxHVx5~1TJ81up>NjKcw&6js- zQP$S<UUn9Lt?irW3B9=x!78soAMsgAp=yOq``GceiCWxzaTne<M{HNA6m@}Pz3%Co z>8ouvDeAQfTFbJ&hR-Hz-uS+4l5n4i8mSU1d4P+(UjlW$@x`;d-;=aCy_i|*?3cBN z0ut;nzWh|HRQ4=$cox%*CyaCnmJdz=x8*;l1#kGjW9GwieG$|L>r4kEd}aFvS|;uS zLXTx+!TH3Ib%3E>9$EkVNbu}V#0j?*IVu{@yN=wSgk_ztvFrE+KzRV&EdY&7fl<b` z$oiu-gaE1wL^?p)37ZFm`q7*q=*gA(o%`E4mG+HUmQE)kg;d=Zio#nStG_fA6rq*B zUGIS8nAn*LijO$hYLAv!VAxB?YO2w>IX>Ff!+DoVtU<VChh_K{5At<!9nz(scWZDl zM$f_?%-+Y7=9%NxHSbZnx(W_;+LuN|Eq@OhOI<S6kgyc-3Q*_Tc9@w1#(@_W%=56$ zNfADd*uomW`Q_fKy&BEeHTtHJg~2Z-G<`D$ePoM4Ezky`aOHLx<gg`tkr$;}uuEp; za0@IV5U|ndA!Lck@z+t)EQwEXNCF`;IVMY-FoZ;VX|72koq&$#Js9ij452#iRfa9o zA?b#=D~j%fca*ic{@x-C1i}8Q<FdNYfn?XNSY$Rme6MQ|DOnVb5X{5pPr$Jk;Cdi? zCf7xEOLfbXlA71WQ5D33-U^zeu{_k2?eLWC?!b{ySw%IDSe=2I01XlIh9}f^2P(eD z4)q-Z0L-`X4cornZ2RAB*}@sTOmqFh1Nhv{ffg6Sd(@wtYo};nJMZ>5>(kE-)1$x0 zBWFs!Hng4sK5=FpTg(>NqK8yoGO8UGuA}>Vn$N$ik1qKtgASCh9XNKAztadV+$fl~ zZw7nJG;(0(<p>qkZ??hHyG8R!?3Ed>JcDs$2ZeLT9=(E%n}spS`EQ5Q9+GWINIKu5 zx`jV@wnx6QrJ1;%rYg05lr*KjJWGWD;vmZ~$8cnMR~<v`7$yQdB1|oucye4%k56dQ z0(!5{XcTboOc_z+A2Ho&5pNA^rEV6NUyZQ*B_V3m)a`m>K7X7FTk8iK%z6%ILX`~2 z1B9%PUmGC!gNpffSB=pnbbKkj5`EBKjJFxwz#(5;ZEE2Q$IA?wARkuLDPX6VX>cz3 ziuxOTaZo^_|AZzh$H|W8p=9-qW2k3I%e7C<V4Q_Sy9u6e!yM21<P6|Rk>H<yQU0Nq zivA}7{MS1AlgpEtY&W1hn}T;|LkKsXeOmM{#!P#+cQ=#XF~t=y?EARi?V#aGhlW_G zenBo6`uirs%8uB6^iIOvzhm0LJcI{f3?shtiZN64%&A9Kn^?>FNRh+9#biI_)&oB+ zZtS|4cUHK3pD7ZK^t^XR$^c#Ke|x8{Fc&F%l^HSdU`3*&-zvlD$UjBE1hz7--qQdh z%e~)QoSW45?NVQ1Yp-y}-k9kJF~!;KwN4H}q^YZl>x$_wVeJsZ<ZMiKku3MP-yvtz zNzvBjgNW_DQXe;$2^G-*L_(1q?d}>p;|sfikD;`Ox7DJdUg2<;1Jog3s^DwT{5^R^ z7o6oxbs%l1lukwPvoKhx*R8C+QXo^DuK2l%h(!EwpTxXwO)HwT;}ULgpiR9`Cb`%m zdju%s8=X@}UxgW@1$W|RO?cid?@S$Nc)ern962z^O3hx?1F=q8I1LNr-o3oniEwgk z?L$R-PMcWH%MKXqj|e?o#b%~TTRa;#ty7xJhipkHKe6>e=bZw6Ja(GT=O<US3p?b6 zTYVVKKZw`P?g+Ka3LyDFDmpHvZxh?WB}v($*&4Du{C=I>NYZ0p@r~duji|A=JCrJz zdr}jUy)c3Cs=F<1vjdzt1puKca^=rfW(C8NKWBVt0)d<}e=Vd+aPByMk+$fe$=qNE zKepzGOw{7RtW37nc{qh}ShBWu`MgDY*nOv49?n75A!?l9dI?$yDaoHDRWU(Jn@b8C zhn)&H?k%7n?cCTm_*M<8y-Jgs`1$->mO%N7lOGhGTn=jbbQ9{_V)-E`>J;!qQ(?cZ zO{>f8W6aN@2|IezZaHb8WEY?;mhXLBkD<PK`;!6cuLydx+Kqjo_}P{>WbjvPobH)H z+iw;GgJ%rJ=Uc^EgfItN+D+h}J_*=!oVcbMnmUd1wFbSDbNEt_7D$|h`wulVD~mZh zV!<HdMj&4VYE?%AbAw=?6nM`U2^S}17lx*E^$5L@PWM##$fYC5)8XMozl7`l4&;g_ zYO*C*rrS|74jcT$Dq{``(36OV4?o`A4lGE1dMO)X(C3FM&U0SV&6mMU)G6nh!o=Go zWHPEjIJl`r3YO0&Dc4;uyJU5Cc<Kb%<QMSni>mtsux~B4&%ZFIIcT!jQibk8R!lK) z|3e~ubd7WC!BummK)yO94boioxSC_wUo#RkyA>A5H4|MIz7l>cP#0aU{o={s`MZEC z&kwm39@<OR%VJB~`RR#C@&zq#Vi5#G`te`?+?xUbjBO&PfKq~15DV=wV_`)j^vVF6 zb6e{x%&r~N(PI1IvnAK=-#hOg>e#tI^s?^%4p3N70J1)_lVuv9Cl`&bw63Z$@5pEg z^(YTdEe1{yg%5~TnPa;P#ur_xDRV4tJ%3t6|8Z4qdt59#+-#ycI)!s)53xQ~BVHI~ z)H|;iuL4cPR2CPfdS-J-dFi>|_q)%`I;5N4*XdjOzG{#L_CCv{_*eILf`U)|JgG=4 zjz9tR0e#AD%u>~+bi5tH>0mNJj-eErVVJM$j>#jw39ChNod~oxkC>9NTV&a$`fYDH zufiKWQmg4F^gg(#w5^Nt5^UQe9LVhA_%9N6mCd_aqG?C`TB?zOK#E~K%=M)_zpz^( zm#X*5pJkxUom}7Qj+vY2p^!RehKhz-%Wtj}raGnC2S_+}w0zM*TGqrU#vG22(`~9q z-)Y`4I0e){l*`O-pqebp2asRwEcp-=%l1U`%YI#ZG|dk6w<KQakL&enOO)&4+q*{q z#Xy!!=|Ko#AHY{Q5WKWW__A@>atgR1d=aMtrg>&^>;}|+F;Q+4`co8Zn!@VS!KwYD z_N=(E$YDpp{FrOU5kDg8OTK%I`Cpbs215EJXBQBmjS^FjdG?FdTo~w=WXs5uW|46* zUq|!$OmFda@b?V9n)Q^cVaL@+b&8uywo^>e)V%R@m~cwKjehReQ1XHFNjPsIM?8Sq z>TWh(yCWQ}8%18%+NM4D71&<22%EVI$8*X=&U$FvEZx84FvRc7LUom#HrQyivXxvH zDQfyY*70^m1q$a#>T5QtsHm({#oX&}?;C4vv|u08V`cnC;c~)E)otrhjR=Mg_GGQu zt@VLN7Q@QyPK-KaI%V%-#^9dL66SZV17+Z#;o$@XZ*o{<fd_Ts=w$vPa7}SGCQXe) zVhXBYKT|pK$vUUtUI&rxoq^WFhqgZVTx#J%pV~ABW7~IbL}bp4aAJR+`z8~>NyN5t zfI9UogU&1Ih>c-oCrY}@hIv0OyMm$valMa+#D(s&J+R!ni>Eq<&Z0Yrl^}07J<B)p z2EP?Y66SkSZ&F+bTas!gl*fT(F)i1s5Cd{b@-&r#u#%rz?D9SV=Ey8#UZ6i}kN#x2 zzH*7pWW#XDayDp`TKh!EW3UW|=lDW?2dcksy0kEJZcE|@I*Fm`d@+}o1&``yb?4BG zv`?QLM<f?6$Q36Sl)EoutRU3D_nZ8d*8?_=e1}$%KD**NHMmniHfQzlNP`6}KD)Aa za^-jxI0zI;@ZW^q^YQ?kdqEnX07qZ6(SpP|z#?ao<;@P}2M^nngx+dPmx_+}^c1y} zgYV>x=O>^(&ij2tZlmH6m^>cr3_FKMdhe#?jh0Qauex!g<3EpQ@}C@-*(qDFN~`Wl zac7IU1;kUMqmn#+IoaJa=q#F?8$u+k?(X_Gac3-eUE7#DOG$ng_5O(!j#vJ2`SLGt zj(;&FnbkIq7TKh8BGij`dWF#s$_2Nd06f(h<`y_U&aw8Vn&w=N2#b4z9V_EKid*GM zu=%8=TlM<;5lwy6u<I0Z@RbZ#vyQorCS-R+aWP3jR>T;VoRVLk|FP@y;=(!swwRLY z@8mx9;+S*6Ri{rbE4Y5hSROGp<_L0**)Y*|w03(xzL0h#oD#3gMjhT}oh7&{y=ag< zrm9Gt4U;G%6l#cBRjJucz?|mo?sZ!GypBy{jH4M(o}2Ca=9BeO*0%gjy7;Um?RQAD z+Lj8QS?1@o_SCVNRuQbIi<O$Ko^YXbS)1le?xrEdutRKoc9?j5m*5_;5D1f!@lX-H zYX-Ndf@fM9GcYsXAOMdlw;!DX5bpg!x4p8>w1I9%b0S#0^9Bon#1ee1g&ooz+}izl zoGoHJblOr!{<3EdEavK5@$*x_c{gphPd}?nV`mW(t|VPibq2S5j9@JrTao3)!(TuZ zK01c4OImmI_gQe_kDhb)FPEPzu#jX<F|}a_avyu_V(|{^eeJ*1T|%-vU@ojgKlq-| z@F}2~Sz&J51G|j3{@jnL58zpz|Mt@bWRU0gcgOd;<+UGW^5X43Z)xqX*WRJ{G%5Ep z^m5R6(?^w!z33?})HJfcPBW1H;5XoVX_zGL@ch3hQFu*w*ebx%oe9ghR5{VX%&`!Y zhf+WVt@K^nRZp5>t=hfSCSaUt-LTF6d2u74SO$Z&5Nw$usI)(uBzsi?Wg5~tp%3S& z3dGQ~diSEgP#8GDA`E#8Y<1x4_4EYouUmN|mn(VX+FgY=f*0&7Jv2vJmnyF{EMVFL z`r3s%(b1IAeYaMEo)C*l=)jB9xdtk=<#&YC8>X~Smg=tgvdWAtH74773C3-%zQ=+P zw~699lLE<3f1U1X<5J~w9g~JT70cMBo~&Cr;+)edy*{<l@>V_?4jKNbtC3qw%FU0x z@hQ5Jva*pExewyVXr+Pial0`@5ERybg``0%zM7mSj>n|*7CVe}X{IH#Rw(Ol^|tk! z3E}ygT;Ep?-;ecBfZTV1uP^f4>lMB;Yrjqm39d0WB>!42FjAGPfAQ%x%wVE(?!^2G zzGW<wN0HXB%Ew;D2Qd*z>~$5x6_0Ok#1Vrzo&zXuc{`DG4Qt1N9zxB>IwPg#?<`-V zONSlT`5B+s0nR;UQzBb(S)^-A6FayN%u=>EwEt-USm!j$6#9EU_7Ad3;*Z>z<-a3K zIrqgPD~LiUm**6ansy5CV|7q>E_409_PNii$n<FK^<;Mbe<8PZ!(khH3h<)HJO#8( zDjsJJ*_Eq;MW5NvnZCrs)*tp&V#FyS8QM^oQ;#Dw$rPGII2Qlk?0OAL6asAumT?55 zb?Yh+3N|a-JHp=_@c4qpA0_ddOjbvFm^8toRa6)M$U(y16x0!fGIf=?V_IB|-_^x| zesteE`7%?SA3!O(qci<Xo#kn*-=)Lrr+})E$1$^OEcM!;Cg&W#)MMez-)bm7mk7G_ z1Ki_ar-1(XuR*gr@qyg7J+ANYJnM)rVBj-aJ~4skWH+Uc1IX(h1b!x6DCEhnha=$) zr1A~Z$>-Fd4gctj#3>!tOOAY`yPQ&y_=V!u_T`a-1@v?x=H+OzmiY@U*@Zo!vWsuA z`4S=#YSk~&#!4(6^q`{CZCb`Qt`h~b5oS1B9rq0XjtOx6fjBLvK(~gi^x%5=RC4O9 z-~vS<v(}>Pz<ir#=96_brsyhhk48641Yz9z9Ts9AVHL*)Q!yqGEg9yCU#4yD%*k0& zvE7|HY2!cU;z1ENT<X-h8(fKo+*Qu}%Y8wC_XG?Tb$~RB3C6B#^7IQ+Oma81-ZS25 zW89<txcn}dfF%aQws=+|%s^2)W_5_vkteeUW0zV@V}I39v|OZniM%7Ab7gpL6(LZK zs}aoSi?=EsEY#PbN{1{~EGiiY^j2sZ&vzpkJPq5-ANmBUw-#UWq7IzqHHminSUFPV zReP&5Y5)=}J52Udx^HMb1mirY*+nZw6P0MuIfB}DsgBQcHqotI#fX}~DyOIfA<M&6 zH+q+oI?bt{`4maQKeH<I&Gui*li=bIvpe5zp#(a(BEXYDG>4;0lfMVcp91c5-9A?B zNM7PfxwDcJXD~O2{25lKi|h)KD2yR@O@rhJ!mOn-eUtbwJw9BiT-*V^7(IiTTAjr{ zHLVYRf{c8C37LY-!;pfhn@O#y9G3?D94GaJI~b%4?NBkQ;#iwr0E%g0mPMviMbt|< zp-#Ovm>1O+n2d%@j6r~6N+MHXUPux1Y9gkZr&k8c?_`t?Ap50S49ZmJbD|)bG!w{8 z7%gruX~c~ZME7aQ?}`8bA1Skgx5d38W_wbPUw(<kdf@|%9C;^^9#KDt=|B5ASLCH| z#9Fbq(eL&JmZrh=6>)2~Ho!sC((Y+PeLze>^qZB>e|FM8+5xsdbep9ABp^6g%&rK& zEEp#zXAm9GbNI+Z`*B+_oQu0!lWwCDPJ53ZSa)>@DdED3uA_-XIQpq!!AZJFx)lZ2 zB#d%eLS!Z&C07etAvY;AkZ76;RNmBa;@kpdbVJm*Y~?}J@p!?wjff||r)4tdjU!8E z1;bzK{c6Rf@BtR8HU^uQJ}e4VhYL*A$5*HGWT!gAD)F!`1%I#j5&gj%y-R&U&}~&x z4fBPZvkkp*J4L9DVZFUgPIOVK?)_R&uMYBXg~95;-#+G@z3I}l0f<@Qz8DZSHkv`; z0%7vpPzg!Yn6Z<CYr7=>YzPfc28asr*1tY^1brbvHnYbrX*i_)((EHXr}2RAPZtXi zG;t;00L2ArlsR1`WNiex<HyZRAeJHEwDU$CP@W9Z6MOTDx}OvMMey4t*XxUq>Ft0L zubsaKSL^oOTZ#-cP-kq6@4B@U%x^JX=8*=>@mRBQvo>RI>w!hF@JH=(O;(Q$q)u>9 zi|Pq8vD>;{u{QZgoZI>=CJ<aDCoFf96|&uHLVfvp2XV^G(W;C`dKNVn|JL{FRfYwA zV5eV}NM4Djz~kLQjN4^eRPBpw!emWo0q>qGDoqlOf+&xX3J?pV3Iy8A6<;+O!6N22 z>;AB?+a-Xrpzp+<X=Wh_A=1Y3sTLwrHmCzL{J7K00*xMifqffh6h+W^W+=!a;jFG7 zfJqq9kp`{IfGqI#yj2DMmYywLrn`f^U|vGh7mDQmvR~4y6%KONB20`bB$&a{8(7*d z9Tioh94@J-y&7dQ<3>KKVFBPmI@)_0;i?m1h&I*7*M%YNVd?mVsQDT?!BwobOm9}< zRPOoS$$UP|X^{iDYPu+)L}Sic$WU4AwQ0K?*%mxX+r<uyOjJTn_DgfjWaEe3#mws> z(BUp6egq_4siB)oM!c6wSMR7v6Aq1rnyoTXi_}qmzjAzDx~)P&yu9#Og!fe=>f)Dy zjwim}^$L7UQFbsZ_anJP9ak>N4VZ8hWocWPW<PYE#w5zXr0d4&1enJh6&)7Nn-Udw zcVyO1tT1{~y@Dj}`+L^q;}6KpTw^PXwkL((Zq+C&&e6}+#$TJ$t1^b0D{DNgHIdhn z>p?Y|gNhmI-28k75)eFK<X$&*SSfWphM{be&fc}CKAcoq(xIUC((>nS*)M7T4zAg} z#(OJ$7fAD3E^v8>SvI({t?Vt-xqTNhI?;r4%0TA1miQlrNDG-(N$CiSP>7ipM<JCT zpB!&2B$9m=l<x6Vv6-oY*oQaTnM_^vxDbpZhx`ivo|69Mn}^`L-0gH(pZKR7(y6^N zT?40pi(NH|6F#;`^D5epBN?Sxji%YIKseKsbqX_0JU*{8(8JTqY0EO_6hN`>_R<x| zDH(C`6d-|P;JWz){3`Lzg?jdRkD*+n8LYmDL*e{~Oq_{HxF=*1A$L?O?LTKos4)jV zB@R*#to3DR!W^=B>dd-93kzx$@|y%)jyEJ_Aj(hCp(w043&Xf(fNE#<Ix=c4k$%(A zd}~A0&M;c*@{9{@oECe;codw^$<T5lZ%;P^e~@1U6m5}BcZsYn2rn!Z(;#SJ7Xqex z=`(AYhrd5!tys3s6Whb9ElRK*AX(<52I2SE>^4)Gux{}qB>_#BvUEOmKoiVo9$^>s zLEi?eC$x6_YXw_*7fMvA;QHFY?s>)09Qjnppm0sb$Vp=D!MNFC@H`*+PTPu4w5e(M zaYFn4M9R0(*6wm=<-)gCqrDPhf}7nRDsJ5No4k6^!i1auIDM6<OcIOuPsC@pj1?1{ zTY-8~UZv(}O$Mi458*TzC*<Z?D){H|#~-_Y-QN-cv}!g!wD~l!zo0_Jpb(?os_-iF zMcR{L14dUyAgsui{m#tP?HUH|4o<$wh&KddKlMA%VM`DQ;i%v0&*fgS3hlRivSBaQ z?z5(psZ={{=W}nvEact{#NW8?^_QLz{tWblvs5<~Aw>$LyYZc-?yBuAY9DWF=UV#K z{@r2pfNGN_HR4T%@xo!sHg`n7zSCrs!y>Usp+I_49AkVe#N=1K<hz<)8~j$cNcekF ztmLjzBe4_THJBI6*cMdg#c|=>LTcfHp}qJ_R5l2~R22)aAL3a^*DAtWap*RP?%$bl zS!5h8Fv*hj@7-=yZS7HR>wefSoEVyDHLS&JAUr@hYcp&4J}v(q)mrLDxM8G)m;r`V zCn?rcT+JIEu0Zgapovl4lw%hQCTgZMHqd5$poxR>^^Au_8@Vgh_M&}dmySKj%ewYH z_Po@}rBy4LpG!bDIds&~KsKEEMfG&l2F5mEFo!6o1@@#=M_6HJa<AFVw|Ho8ea?W^ zdUVt{WS1ka1XASPr<-YQP5sO+eN!B+&)nfLtD|7OQsdHrvlXm@qq|ofCI&2ij`X|? zw+>hDGOsJAWDx?()GZOqH}y?%etxbF2bNmvd)cV)uQkRYd<R0MC?WZ(ud&2Ao{m)& z1q*{pz2RN+dE;e}CE@Zl1;fUNaA>EpskTwOk~w&ow4jx-pUKm-Nl(cv&r8gFF)NnY zxelmPsG%h4^{`y&+ReYCnDF8~r|V3&L*m=YxI;VkFSk<6<iB4?7E1_8iU@p7v{dd? zmRE)7USmZW%wd#Fg*4R#5op~CgrkA+N=D-csE*wARVh!_Dhk~4cYzBn(9a7aWm?-S z+1ewsiO!s`5y|xrX`hsi7ZSXYU6yL5w3EsgyQo!fu%`?*TT~zIU*TIucq6?a4fkq{ zstd7RF21J#=@-mZ(`-DIT;&;fdHv<uay{D)v$_qnZgJHGfh3g=P?Wh?u$_lmeTx^j z6Gq+9D|FFSK>2XrY2OLw2f-Jc6k|+~t-AH$%T)}6QcVjEVPP(T2I7#5y2{sGSqR3G zVaXxI*0xr;DFW7Sbg9a&CEUl+A(*+G!gv#QxifYL2+nE)2?dwZQLTITEUZj#Cd6iB z#=lETOZLNSS=gBqQh1Dwx!@MlE3e{%F@}%>0{V(sHVh8M^FT4x_+cbMkyH_Uc4!}3 z%P}t@BkrZC(gKo51f^G*zO4ruK{`ZQO6hmjs=MsU(|dsilEqBqY6V~c4|ZZ5+)|rd zh|07`YZXE?gdj{fq}+?EL9Jk|#|;hY4T?3<X3vV{P>0XE?tA9AizDOXG-YVxwk79Z ztL7q$WqA_U`kzWwXK;9m>!La(qF>av&?r4Ch+iMcA8!3AT-v!#%xt2h_vNY}3}uRC z4eCbc^4}JhprnhjE~R?=%P%gBN)Ns?esZRvq@w+Dm9aD`BGM}MTF&S_mxRLHa08=M zh^aa#k4H^6?NTI4c`h;;@OLDyFSz@ib3kxpt&h0R8BeBTe2afAk?~FJSM5ey%t+mC zj4~m1Ts0N1*Rr}bi^HK&_<k9_AV{a-WZtFqib3%OJ9c}MKpHwcj4v|ZFIm0v!|SJ& zWVtj$Y^+~|`R%VfC#4bkkaX5N=V_vv@|TBoguRl)l^-JQI!7o3Q3>^j#*_6Gdj!3n z%Fvb(sxq-B#dhx7-D|_~Ndu4fd3VXMgs_IS$Ptxvd!wvt0YdbyRcqRx*NpYfzpRCR z-(Y)O5^6{tsMmA79}C`p+h=G!III3cw8DI234T<$gZ@#(n9REEu4^U%^g5a=pTs-- zOA%v+PPrt<r<lZ>EnYv?Zej7K!P4xT`m@+&{q!aO;*)>YRgr(>hMs>*i~u-qxGHz2 zpo;vtrW1lt<ZfP5eDB7xO)Jf(jpXzaR!CkVkF!sFbh6Vj?SP9D!p(`u%ef4z3un(u z8c5QM(jPQ)!cg7a($v#f)R-5%`pEm!0$Pi!M5H+4IIQX<SBX%CJxLv}%uML@wpolu z7zVZ}6T`SBd&GY3%0;ZWMih{I<q^@~fnFC@pHJwPXYaV|c3t=CUO`1)XTO*260VQw z``&DUp;lh{bJVKLhIOv;0_ON@aP?>p_MInQGhd=<;^*>kOJ!qzSIkQ=9an=@o-Vrk zuH*IihXn|kUPc|f<1mJ~4u7a7&}~Lstd={$^>MgnrdH255N+$B<Ry82tc@<@Au*eV zaN6DW!}v`#8vi+ubZgmYb><oQjJh5jb0c&6HV7*#7ykqe0_I$u?B*|}#u<xOdcV+F zXrVuyZEtZ*7+Hw%ZFTEbMtsB+^v(N3%gen|zbLGuVce?JDgt6-Vq(S8YH*C+Q*P}Z zEwvkKPOGr%uQte!RmFkAupj{xX>&d`{m<W@0M32z1#Sy%K3ut6sX$jn)mWb$aD83{ z$V%5?e(vPrWaiY9OEFF5Z6>Z0L4XTj>Bmr3^Jnr3Mh!D>ZsHtPvrDd8M&S$BWl%2f zNUOiHt7uxa6gH=fx|i!!@n%9E1Y?}Pg|$>VFec7vHPO=Q-ny>C_@pykyRq&erXt=s zF=lMSVpHANr{1GDTu={grr4Aq22>>INvVaH>&Q`&Clr5wOFSVd?}$~e^PI7ctRgGM zp$loc7uXmVuZRyb3|1>!A6*g4u@%hLDH~DI$d7P#(HyEl7TSvWtkbAy+Pio`zRwSr zddLX6WP0UIW#1}8ag`DqhT85xKdvJ|wgN1zP_Qubnv*uitjV-EPC?pHRW`_?wZ<i* z!a$sJnIVD73mh&T3W;)owf<DNT;dY#I#qAp((Hmp`Hr;AmM}<?imFl8<oWy9Liai; z#1jP3K63h<fw1OaHP$vly|)A56;_mU%U_+x@Sd)gc>@?M(}{pi9#mw93k<>)6(2Cd zU{%8~uf!cG$>)FP6?A-F1&0z~iP_r_pEn-Xh{bMoJv$jMJL0Y%VQhGImn6ek_}a;8 zv-RjmaJ1$@(4Dwd{)M5V5#Cs_^`nmL1VKc6bh;c~BwTP_%S%oJ@_k3d4`b?-Bh{5@ zY39zAAHwmhql;yuTT5?iaL0w1G5>L0;MYy{9l<B*t~)na>r*}WuAt*ajOR|oxW<)w z+I>I~4oH80Jb#`)k49qAh*C$Dxd}$Ywub9!k|QiMI~8ojl_l<vSfoeC2vwd-b`+F( z$|fq8#e<gIiTl(Fjh&%SiXjVjO&1dAwDcoLWwm<D)fvV#S9(latYVVZk40T{)DdM1 zoZ-bLm~0Wa<h}(zMw4dIU?p$lr#D>WQhWmq$yl^BBuKInJT$dKYg6N;Ljc`RvC8_` zV6Z7M{EOe@o~w}nVIuF-*j>kksT$bCa4C7Bc6pU&C(fc%(>x*$;)*LVu)8-wy<R>D z3C-p%&Tt4@?0CLge@J3VY)JL2;<OpI#SgQw%||8QX(@Eusz`O3-2d?B_j9H4gj0Z0 zaD3@%(6%E~XOOa>we6d{LdR?IQvi1mFn?g4jlJN2C2M6ZIh{6S<6dnVQ`?gTQ~#^2 zA{uQh<vq18tEQj{95}AoeFJe6jt4xxGM1)efHc7Xr4|#lBwUrck=ERyU4gD27)GB< zzV3%FO%NJ34w@UNH&iTIAWDI>lWoQYpFcUiNCsT^6?%j1LwUL-tINn7EvZFqmflR0 zs=*FC()H$_r@#QfSy$rUdn^Ar$NoRJuKJr$`hP#kS?_}X(Y*`)(EX49QfJ5ihqmqi z%+oXT{vU1L|Fn%uDFk*P(`+JD!1#4-SNEWsv)9DOrcvM9(GN7LjQNn($RXnG^}JHZ zwHu(1rLqxs;t&y4^*gaS$@N`4Adm%;SXN6M5hsK%cS(8_Cl{yW`=~!WV%^ROnyLHg z6fl1n64ZNDuC$>?B^Jt4O)(;8;dXz;e}J^SCw%+rDIf{Yate@S9i3Xp>5z|mPxQhp zY_qo2aZl}+{Mv93_+e`61u^QxNj7d-`t01_c~|T*=Yf9OGHmC2kaM%W!J1FKx>asB zak3~$;;+5Raj4B^SYdv-0hfsm=%-t%fI{2HVOP1F;`3a~j{HF-VFPseoSZzJ)(y+P zk#{Q7x8OZXV7GiOx~&shcghGe!!h0cfRn}n#xKz{3EfYwQ|nf`yn-9^NQ6ta<=*2D zqDk{%)6c}ISu99pCsZdKbn2BMU+b-|0}Sr7UfpS$wHG2S5PA0Sop*l1P(a624_Y0< z3`?5F5u+|VS}{<dxB6mN9Ygi9)r#OLP*SIl0Q2C$AOw6M1Em{5pO(mO6&e<{cnVOa zcOA`MX~tys+70f?Ei03{d-z>A1$6CDoC4ArzW<AH@tc!5XO>93|FaKJy0~rW%w?&5 zg;e3U{3xv_<K2!8-&-CxJYGBayh~b#EXJz3opE;ZzrN9b|H2qcT}eYZmnF1MUFBOx z8p`mY0P(3_AN4oPK+;gMM9HW!8$6^B_(EIbMU~NNLvRvwsk>baro(~-5naO>iG~-B zHM=&b%oG*9f^zs#MLJG)j(u*@J##Cc*)D-)W=?{7<j-v;g&(3UDW8v;HW<k_ma0ac zJaFP8k4XUEq2G{Txb{XSW?m1(u@uKwXo^#j(M>YQk}`n|zv$Eqg4J<lc)XaF-XveV zU+}n+l_P5U?P{JG_@aeQw}sHPP6|2SJE<zd|BJo%j%spy+l29WY)1tV1rZPhrAU+B z;aC8rN(m7{ks2WhNGPFmj#%hOuK@*V2}y*IgpPDbAV>|NN(m5p@8IzJzIkVT^UZJO zo%da9*36vu{PnE0pJylg+4tV}v-iEP`?_A?x6-9c8Q5pPnpWrz5a~`e$vtyDTsZ;) zqGZ83rk;|Xr}8W?<9kZLf9<>2H2z=TloAt4=sLOo|GRyTsJK_SZuDhN)oRPH=3L2& zuHv!Scd29BLd4;Z0EdwD*t`3Nf7kpkJ#=}kNBC_ZbrNez?W~|)3XPIgg`}zO@Qwaf zI+=;>kE1;|i)x5#9{*}U9Bo<~NtPjDhbY~;SSM8|roX};SW4D`S5#Qh%q__2q7kAI z4qmEHU&H^S;)wssN}~V6E$6>1y8oxH|1tTG{=;I-|EI>pzdZCGb8P&j8MV!DdUtxw z)$Aw4XxQh@?b(WJ=L|<HEfkh43GO&N!AcoE0V;m>>lIz{i5Q!C@-R%yav<?@{J48F zyuiO<YzV9$f|adjWB9eM^so<9@^CDBA79$%2{s@1HcDoL$>wX)xPN?Dub$drp7&A^ z9$7f#-sHv9&S#6?`mgF<nS&Zt&~|0#ltDrL8ZXq#sHs0$tiW&h$s4ibU+#P#%=W~s zg1^Iw2dKcW0WL`C<MOUwHIruf>z+RTT%s{+`=jd<1GZzf_j0>e#o@>!>wJh9RWtbG zhsX9o)VliYhvebqqV@Wve6QC1DYYxdz|7#IJFM@U4v-<C8lg#~QBy|fus$<(tHt-u zAx`ON{}JEi@Ew&C6kO0bG55*>$~j_MFaJW+>f=2dkAuy(D*yRSS^s{~zb*Rr(EWRk z{_TwZyI!}UMkBl`A6MSoSx}t$X)S^3&R9-YbuD$fS?M}u`!a$Ar#Ap?;^!ojHY+Jh z7}yDZ{sbjvS~{}ii_roN5dLQI{+9*V|F-MD_atl`@jywjIVJ!y#|NUQn+!vL4Axo> zEB_H@D&F;=K-y35Y1%6}$6>>T;#~GN7npti$d}vzWPfRyNs0}U_5wNJmtS-uVK<dI zHq)C^*XMA|ZiPEi;oY;`YaAK!0`5nJG>9erWGQ$^rcrPGe;;8ruYJ9vfV_U3%fA}I z2w{GQ6E;3nl+EF`Zv13<3l#gwVi=l)%T(_y&<ZJRJrt<0-S^_f1Wqi&RK$+7H7Bl< zf3oy`VnAluJYBkN=cRwLoW}x>k>|v0l>#yhBTj(%vAbIEy3IM|znk)Rulzk${>u!S z%2m_+G0v&Pfh!=mbI9w#3__i_A(=D5chvA|omONg$w~W{0|}n0CGe=KJD9SFx6pXl z5<<J(SY_1SXVgE%y1_NQKzU4~MD3q?yT1tj;jfHR{HJ#Nw-^3J=nMYJ)Y|`cqyEzx ze-TUnl|di>)NcRw!oP^6|H}A>f4fotX^p>#rT@x@Ml8QX#@|XWwi5al5JvTydQH75 zDD4^D;TWy#IXfyJX{Q+I_;%_QTi>@~YWc$)V0lS)hEY>xqEQQpRA&GtDgzR`@fsl= zRiE%tTh-%8KM_CQ>Nf(C{_F=9Pc6!4WY(@ilL$U0(r|-#-}(cs#ibHw+)XL_@NwO3 zYo|WU<xIl>2RPp_FLS=J4{?p@&{&+EWWjlE!#oL`_Hyv-Wi&IDj$5XdR<}5mG{Gu@ zc3Z$N+)XA*;x`n{<J=`J2g$jkMop;pi8_CA5JO0IMaGh(2<aP{;nKE!iW~M~ob_v2 z>GRvqR)0IEpNlw<J$h~{A7XL9GiXUVy)C_nm=VMTrXct7{OVL^lU5H?-u<wi@(q94 zIJqxSkqZ>hRo~k{<RX)|`Qr*eYTJyejp8=TR2G)sYW9DxdAaA%E9|uz%Q6+^lN)rV zO&4s_B}IP`IAD0h?~rCw{w{XwbXalKO+!^emf1YYH@tksR!_{346?N56k~^Xnl*Df z-G^G_Fysv^W-mVC%x5_T?9!ep<`VbE1s9L^KjbSM46N5QC4CJ^bLN*1->s9E$|xvx zx7nYPAP1fh%WNpeuGjMaIe|!8K^$!F2-HtX+78et&Y-G2R1-aC0E-Rq+~W+D&}Csc zn>&5BZ|~h)5WOl$Yq4NPwQyUzZ(DZ3$Rt2;FKYs?>|R*oJ<kj=^B?cOW!veeV`JO2 zrgmMmhEh&5$H)TZoHz6#0QRo?fQJ27^x&s&uq9&&6?YHJIM){{-Z8#p=A6fk5R6U% zQrE6~^@18}hpPw}$>o8hqloV`?YOj2_pZHUDyv{nusd}>HnKJ~gww~cGi;!`bc(fO z@(f-Ec4wIi>r7u(Q@rN2WobD&6PW!KW}Ei=BjYn1H98V^rk8b^R&0=k!|=XY?T<OG z{T2GXvztnQP?VsG(7oOmBGN*kP9G`VI*Myu5{!f!cGA-IA4)ici^uuCf3cwtxD+oe z5Ek-I;5as&V%%J2U^!4IlGIm8K@S^_3}$Ru<loPc$2;I%CH0$4lMRd3#9kZ0c_ONv z$LWR&<CoiaV)?zOKibyLrl{3m#nkcgRK;|C2N*7{MEPPyeVc*E02v2EoA(us=SeQ* z$qu6+Iq9>G9ZyPtHwgyPmG?H;JDbrv!FCcjIpTQN4+(JK@@4eKVFPFTukNoK_MqTv z$>}kK4X**WoW*5dGFi+CW#K*G(~|<S-0qDwO_G(ay)%<aEsQw`&5A()Bn`HVdq$$W z_T(CYUy=Qw$JZOzBISd{q$0kW2!T0FTo^skjP<C`I&O38WE0Awu^0?Lh9Tf;_1@N5 z?>j>%N?E-c0{sf8umbh3C297re|x<0lSMyehPzhLIexoBJu$G=XQr(`tGy1eQluUi z*o7C()T7nrAL*?h7jD&|)LN4^+^XxsCw5VYfE@^==j1h2G72PqvZTS3)Lrc{u(i%T zntUJV@zv3x0*htnnWNHFg`sZ`mXhALgWw3`ZK=$uZo1q>RKHliQFXOdI?z1%gqXo{ z+ox}^*9@Q!;K^t2Fp!m_?grNMeaKYGHnib(bF+0CY^L|ZKzyehg;<gw>RV8~lbtHe zB>AJJF0Zp0PtzKQwk<v6c~yw&D@m{7DF88y;rxvi>qv!}>7{n^C<nYeN7ape6SJ9p zgqL)I)ZRY+{F5a$8$ZVvs<`p^$YfkD*6iTd2Imcau|>U^Q-AucSng+25J%3je@^-$ z`%flBen~U~t5su#UpaOTD0kD14uT%7P>HAD&;Q%6;H*O0d`&&|(FT{}YaIiai`95s zW$<WnOjnCBO_lW*Hn!wG<;cK`8gD$4ol-k~z0?<_U^w3-Q7Z~w906I5MeNXZ2U1<? zT&ogX)2QWLntt&xpaJifRz1n66Pob<_Ww>w{vyhTf92zNmeZ}FPuD~xpRNfPo416= z8c@BPs#_nrhsno38Xm`m4VUb^XU9)MJ#B-k?O$Y>dQD}7*y;T+KE{Z6@52_l;Q?L@ z4ZluO`j%^ss%gnw(%cVt3-!fj;*=+oTh9?6be60W<;Nh{L}I&VKIbYZNyM08`mJ@O zyf(8Gn4rEqsS2l+o#leAQDXfFLtIA<x*qIY$F7}6pFv`;`<w0&4LaPsy+)a`=zF{- z5Ha#+ycJzx2haiH%|JLsd&is-l^InTHRFX8t6UUF_5fjyKXA)V0%zTXTJ=Y&v?78$ z!3|BuZs^i}jaXLpXo%)BezXv&QPB8(<JPt?by4tIn7dOrDWavs(3h!nL!?h!x2dOu zQyO|zcL;Q%K{G5$*EJn0;JvG*L`iI!i>Q@Tn-l_HenLIU{<Sis-?rz*$W7biu+2&4 zht^%HA$*Bj!FStEUjDjf>eP)f%NbRg)T+4YZ;dn3d%U?qEkCNP4W6kcxNw|;>k3T> zUw=5t1FnliWn@OD4wN@T*bL0zDd7A37o0~SM|XnLN`1{6=0oePgFdd&?q|hBq-3`U zu7xo<xt`|dggtIrJW?!GxK-V>PP&{fS@mipMrDVs`nov2A&(@ICE7H(xKyL>>c2e^ zFFvshB>?pa2drPzOp<=^WaUYxk*U75!)9cdld!vkHvMwg6UiCA?Mq(-sG@obH!aYh zwILm22&UGvq|$X9Hc;d}Lf}o2$bOdWqO7uKXf%&E%QoF=*nI1sIh!^H>E(E*l6U#c z9}LbWf#JJ$QA)ZC5LmoH$>O*>Y$*@(`Y`f=iR5O#e;2QzyfZ8_cL;eu$ME`_Ohd`d z4tl=4AT5wwQSyPnZJjm%=f`9}H<;=)7_B!5pajbqdYGmL+O%(6(g}bdE`3R#C`|?{ z+vFk}WRZS>O>fJP($!fScShTDJ?T#*O70FkdN?U5UORFlgJ6Y9tuVxp5qoLH!}$@e z>B1_)@ByT+{}3FVw{ovMEq{~sRO?9Hjqw|eMa4D8Kbn2y4mUl&$j&Gc!l&H6*5Ghc zbW(8u8i(PN_d`VM0&7N>N=f!5@^ozat1$9OihuVr`%XodbX1p;r8q$b9~@I)fqm}n zb@U<xrE~gws?mJlkx^}<hW(A&hL$7n25^rQAh2z;xZwiDsZQ5A7YC*!uG{cO)J0Aq z5>|5>?8TZOkS6UDcDvc}EGMN%IXVTXUa_*18M}GsC(F_-|A_5RmUjD>-F3i~z~b`p zqMc)%KHi+oKlcvWv!IJv=Qf{BvGP=cy~V0a`5z4LHC)a=f=``K*11Vu?{M9V8b8&) zd#f^noM~~3>~QB}VAN0qse<PU`mKp6(icq_$#~&v@2nbJ#rvvpI6tf+7=DrmeiXcq ze2q>^j}1e*`8NNt01fe~Yjv3L8N2aTUp(s;O)9(i*I=J*$OWp;t(?K#OP5N+iK*^a z(HE579}B*__PW$Z)?+dgaDWgP6G{!s8ppP#7h7V(u}#ZCz0A|zCDR4ZU@1-dV4WY8 zf|AXMM4OhBL7c*}=+||N)MVc$$G_CypH#F{)w7X@=ETue(TRj1set*x6hwutHEhqr zH+>PHZ_1vyal*OXdSVQF=i-gGTm>|sA%=Ht{&ay_E6ePryIyooerE_fu@obVKZ;YW zpCm|rYbUtbijwm3U;IciRqV9?Y+O1wht72`S-Poc(Y%#gb!b@^yfny^DN$Y``w?M& z6|VhNp1oinzWw=Ao98^ilhN(`O=Hdg1O_nK^)2fkDs08$pFKCvt>;d;)lGW7h?`p` z0HfFMw|IN}2)5Nv`oPI-gbCkE$_*``1d#MOVA@py0!3w3u0!9PcA#&O{qh`{rZ4Vp ziR@$G#KLZ6oG=X8FI7u$xol`COG)ekYuJRI!{L;@xnWxP<)V=$=EJ$Y&D4=pN&cb@ zb!17dw1m^`#(=4V(*h9?lvKm^EdUzXBHu*htVnreG{~xc+Fn<j=`&`&P-JhNWOxv0 zaFF~Uc|Iz?h)znIkuXNETN(Q4$YOan7qqy(Nv4c=%p@cJd;+fOO}M#Wh`|x`Ia*U^ zZXY;74PG?bGp<S@)e)-dY?!YtJ4&_lmbtU!!dxM5%i+wCHSrw}-lWtDX(ZqYbSD)? zXGj{b_ceyS+Pb}o8(}&sHw?cUVyE$qI-G|&4~kid@p=kP0V~4r0*`O&SbeTFn^yT6 z(NLu2;zTmHt;a?G*wyU5PyzM9iJ@<19IZ$~53@Kxrpg0bD~?NCr&Y>+jDq$Z*U_%6 z6U>FngkpIcTK$ejiLT9F%ky3~!jr{fRzS4w{r=p77jBLNG!5MtaRLP)ZmnQ~>b__t zWq@7_?gY4@1UzH?-Y|*?K7xVziypDx_vrgSS#(z+g>J(`bg04w41qe(EOR*gppAF$ zX<z`~+X2I|_GfD5$zzy-oHu~wyGT-TY0`<xW{n<(h<~-8lL6>AZwue!Uh|L#>T4fn zo4gjox*Lz7tB<LKkl(!6cvh)r7NDO)M}`s0BRsI_0M66qUuN5huNlkol@F|ptqTZJ zF<xbtelte&NZb<xMpQlwP0@8Egx3Tw_PU8i8V_gg_#r6oD4a{6a4a}6t50ImCT_a_ zT+>Rwd#(DN)EjLX41BaOTN_pn($}rmq5KGJuyISlR$|=%_DpNEE}^dr{&bspZx9u! zMoiv8+c5S;NMwMIsz>IY@b{rk|2X$_AHNiZO%p%YY=O!blS3#QZJI?FJH8`ZPgkH4 zB`Q$MCNx=f+CmSlhpVLs8oz5F`MoT!hDwn>C;|n|+XlCu_OxlixusFQ$6nXQj2xH} zx<d5N`8%a;RkJgTiV`awG{>u+Nqklg$D0>w#`}4t`v*K}!dQZArTLPbE!-Yk3VV-| zRX=Fy4toz+fF3Y^%lC%%)`B(TxgR7pL9CG7{BspuJ!q}TK>N+Y%r)9s!(k5zL9TM| zw>Qgl!%#>0+|9rTfMh>+KRsMrngw!sRMeX`hJJ^uT{t0L9Vjn0z2-m=^a9^<)*~3a zuyz^ONO`SNw6!;FUNlo2q92^1=HFVuL9xVeUr(9l*0a!0X63k_&{~sH(NLmhcolIS zdaT3QxI)y1!%eKur|Q8h6wg~TG7F;>*8shqaV6X%FA4T(xk**Z&v#8l7P4ueJSwH1 z)xUPN*H-mAk2y?Rk^1BO%Q8xOnH^j~zu+C%Kh||trL@9K@48fov${qCBEIO}U_$b% zfgRDwOhch&<L+xM#rxYt8Ldbzdp~aG=V6U<B*+J0<d$7|I-OS|vRBolbD_%HM(~#% zXuWd<=XD9Rk5A$-$Wlt=ozr`;|Coz1aI+y-3X1Bw_9&WH0=BelvLL0KX|Rv6j7(n7 zoKf7+*WXDMw~R~?ir9$CWx(Zw%lHB+`oBC-r}Rqw@!-B|H3B#hv3!}L7@=K>Z5@-| z?Nd=LRs4NI^`dKQRr0`Kaz~}fE#)uXX<j|dlAOq@XRhLO<$b~HKB=fqK1mR`ZkXb( z`7R@_#H}cj0PAu@R9WmdE>r(R`fZ;xDISJ+=p|cHZuV#5`(A9uIEO}QNCt4W%4VAK zwdKA(Y>@%}M!CzF`8paK+NCd@JCo>JYLoy!`S3Vt>lOrCN#1wY?}p1%TtX~rl}F5F z&LyYKtJ4mWI`?{odxgJ%c|Ecou8Up!7!(D)v?AlWay!f=y;*x$B5BGOdeN%j;-BGQ z%=glnjkL2mqK@#Z3Q7=$L<u2gWUVHmg1oNeOC^c<i1abs4b5sFgK)MM$Em}uCiX$# z-OxWD^nil)lM7N`N=UzznQQZ5yCKsq^t!srbkRBzwO+6b@^iGQYe5RUMJM7O4XJ=# zx5a`rBAVzZL3VxDE*!)m`;POHtO7XyU9w8<$-a72X4i8cReH8?Ntj+$Xyy6n<rUfJ zK_HYtf1+Bn3yRMolqHoYfq4DWOW`s^l838=II*c1KzZMWb~@OklW?k@qvHmy{Xj_n zC>5g-I-kaTzW#yBjv~ST4JMkrR%sxg|HDHuHB*w4@}QZ+7?2S3Ubc(0EnkT@8<Qbb z_UPVfg^r2Aq#oWAwPl@~tBb)Z>$*f6*&MsN65i!|-$!}Z1ke?wt^^6)(p~?_f<DLZ zYt7Xf<Wk^8Z4a#FBY3E%d|1p-zK8Zn=0m}YqVwL1#R2W>CxM{TWgfzpEk#z?q01!z zVk-=!u?E#is&+z1HJ67)fP)Vw;lr~lO0@U+k)}3&9e(@)Tb~vN77Fq^zWD|<^ND8* z@3oh4*VjhYbHd^b9h6j*P3ONhOgT$K`JDH#2&D5ufw#lj+^qDnNYCcz{mEf-XhLRr z6!4xIC`TSkd6&Wa1wvCcW_=FLLf=XRo+|<Q$#)o@bJ@#MRP^A#lUizbCQ`YIy){c2 z=Ct#)&84P0-8r4qRIzVR{E_TnO@K}=KmlTXD;7Q%>Y@oZcSKKm#f837+FUH*iPkbL zUf$e!(cuZ*v>UE5*-g60GJEfvcj9KJcNWd<*yBArq2$@C!pv-zF3U-avl7BWV=8+W zt>mrIGhA)j6|dHZ?zwL24i&Ipx0^YtS>q`{z7g-Ri3DtvYqi)u4J}4I@8n(iW#Zgv z!uuXZlccfAhATACoiDZ7cLn90OYA<skUEnzR8>3IngJ5|2vaCcN@^P}Ey<9pE(;i* zpPwo1j%>0n5Ho8US=!J^M&SED;N6NB(D&6=D9s_df=O0Z(~|8|T%gOW?<<oVN=DL6 z>5`|g43FrHGfAye7a4>3!t(EgRmH+*uJ9;hqUjDB(kPu$1H_V5IlK%`u5r!ffk(_l z={v0^O}s)OAu>N%s`C~&m=X(6ZJl%j6~Bo}{`bX+UpAekk&uOrk*tenYzATkr*|CA zf+V?KPZjkSzmX3RexVO|qiDVmPy~<{)AEgS)DbOWcc+E8{}9E$&q@HP3;>v_{lcIv zg$Xf3^B#%!sEmd$>*8X;lkPL(mTWf8yH?`PS{g^03k#N3SdM#<9r%=2%w{5>3d}{a zJm`lKwo04#-9ZdReRl(&z9F1xh)nff_80E{i-p;@iRMXj;KmV8&4J3wgCLhmpSPy> zgbFPDS{J8e5K{P&1&}Mu_(GaZd%)+<Gf5%px9P}*UP=)p*}yT=`k>!H$<;G#sSEo& z=fO6n7ZdE$<svlI^@YFh;)m+WZ@WP>)u_RkI2U~42T0V)B^CAaPo&9)?IwINppP}J zvT8qB%oo+Y5(#Q$k%xZ6T6e^>uG!G|DDn8t8&$+*t!e{h@bK2)n)$6!FUVl#`jSTX z=ASBqaHB6Ros*o>UmgTqPO{JFQM4y7f)7GD2I+ETvf^U5zX|r5a$ql(J@}Q!+RM#w zc?$*~J))t~t*J|*-lXYfdq@dDT3_3=>p1dVq}*tDI-bhU0v9~d^8R8_T5^Hv_<Err z!vOrPJhgeF_@<uSkMDc6L!Dc)0p^JgC9=HA28pf8l~)nGkY_yD*4r3Is<Qjl_H(bg z70LEE_DGbno|hA(E8(8P*EN--ex%#m&4Y!MT9r7jK8E4c)bYCp$I5Vz_X46B(dX;) z4L&Yd|EZa53|3+_h-nOv`je6|r3~`5NZ!#xYkIc0O#+sDQHVV6J(#^~jWen+j8U}Y zle+vOf3z*XXfJcSuk8m|xH50S1{X*e%XFB0f4Qt;He)(47g2LU)uQ-eMrId#Mk3Aa zy~Wu%FjveISTXQ!jM4c)mx7x^H04Y0I=idNF;w?O%k%}nc$5~vSl@u&rL?oXJz$mJ zM~`sL#4M77&lR=aEX9-{J-U9MIas)2ha+V<<;mLsDj$gC8#&moMwfj2@zvyj>q>M? zd}^EHiw7<EbFth4k>TekU(&A;cP?7%7Wu4)qh5uhoh-D2IZF$}Q1)2`>d^ymkAE6e zgYb48w_=nJz5cJx+5Ri1F|eHOYVB5|DdkTLAsx4F`8E!eYxLGj8+fK^ZPVS0OZ3MD z$5W|K8mn_4!bZyMLZv|@i=eWVfK810{QOtx>i~G#s5H|yA}!)o>NtOz_$EL>Tc@%1 zQ_#aoa~N<(P$scOM=Hv4OYzch_2A*_4yUiY)Hb1%aZ78TfVYOZQuay2gX^)ai?z+F zHRBxAv(BSKi-3i=i0A;X(O4_GMvMZcpRGr3mfv``zY=7=hFUDSY$51$?4yy?HZ`rp z_+*Mn2DT{>9dzx}E_DW~jO#geuZgdWgHm$YHUh1IwfV^LU;VPA0x4_;wIe@Say1a^ zbLt0kta$#t61Jl@!|WS2ofSLdH!mJV>(s2ucjXL(@^%%cm=y0ozob|Hp>t(qLxGrB z*}8t|iwst`f#$Avdjeu(`%D2(*1;S1$B1BzgHb^YaSPqvmWyrz6=>A(>XKhG6tAyi zx|dwNkbNr55h<YZM@eV8mTDNdRlg-zqdhWXkS<<#1FaVMi_h2&7s%<JrSqD{yi6Wp zO$y=aL)Sft=z~h6IX>Vt9Eq}wA`0@!C?pyB?&#{RhmFO{T2Q+b(?KhP97)~^C>=|x zyV1kl*?HqjhT;Xym@0QwfPa48QV(G$LUa=FWa*iKqyFZv8<2esKref@M;EGcCHHg8 zkMb35!z-qzv<Np0Cb;vpK2|^E;jqzBNgApc-K*@P<vNqA;f;5nHS$QAq>MT^hu?$k z2qBXcl%9q)_NFM3BiUsYQJt3A`d3f0La34%7P4m-p<Vf3nS;>JWV6zER%tZ^Y_jXY z+p!Y@!)4bo(B14+F-zJk&OC8(ac8QBofpF~d^rC)ZQa{57(BE2tv2R3lfQ|Zzm-?1 zhtDVW9NA7~)TXB36Nm(RArIf%NM1~nal?~h`HC}qFgHntjLee^8%Xi9vvc>H+-eWd zdN5)V2BQ0X=+kq`_YXf=NSPrXAtxdQ;pqP-0);NAGhI3S@R{u=i@VbC3G30Z9(!&u zZfsBAz3<>Bivako_t}1bz4X9{DgNAdJs)n3W-uu!A62VDoRkM(8&avDOXP961fM8p zt?Xv))&*ikU}a(Mi3);P%gtx1mE&j5d|yWw%}DkdwCA34SE=$G+S-|zgmrXZw-+O4 z^(kdDIlj(MF6)Ku(Evpns?B;cmq<zJdd72o9?f?NfzU_$(N_B-E#_BcwE7~&|Lkkh ziZinnZR<67I@_;D9@uj8R**_zIv-mskp;)Vjq4!$fuQ0I@6)~Dqdt{@pDb7W*w;Up zaBrpnblwDOt8va(KiE9)*q#UxitFyY+1lDlc$jeZ(#L0LA^r3``^%PcuJ6J>(b0|^ z#HJG|IcO>6AKH3(A~4GxGT-kSe=I`}jVlCqGdemD{{1%MhpcAa9uptZ5W2x(!^1^V zzf~x<9c#kjMmA7uv2^O>jS&8;&C@2)BWY^dwJmsa{T2GswwqGxZwYM@>0cnA%=$Wa zhqpZyhzo*2JD>AQ-lMiE(K*HW!U)Y;`e=<o<z#xUQr5Wa9Gi}3f$cB*f2`{`+GVbH z5;s$Xyo$+bziM)=r(IjiG=fZ)mqytaERuz@goq*1Vt+VZxc_$G!J9Q!ahDS+yp!$R zQ<8hv1=s$e8Oe@?R!BB2t(6_ls0;?Pqt!`>BUz=kL7VImoev*k9XQxI$c2M#g@rAJ z52B-@?ecs~&862CE%Ou1p%w()zMf~QFax=zJYvs3i08awC}vG=1A8|f1i=H@3jLOP zITcZCT3Olq16;6|`vG3_OJ`cu;|hd`Y8d;kf$7@SfvvY?)OduwqOo5b1PX4n->$i9 zDH}MEkpIdj*Z;m43~r65*fFCf?}tTI$8avM15ugyd}q(~ic=RU{JNT7YEjXRBzMlW zWz)5k=XQ%FO){dz_jwRajr02EV(s0%qwiWfh*C<iZ=zaqmx)aMZgj@50x_kUIL*{G z_pOL7F$9=mp6Gl4*R11R?cAtdRDe;<>S0XXW;}z7McJd*JyTWZ{o%ubOiB8px1>WD z+|wLVeqP9cPp@hIDEuB)802*2^>=y7nqskY-g0!!ur_wEvf>~h9zz_Q=;Rb5z∈ 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 aKlG+{35~sL2CzTs4SN^BUGfaDP5loIqV<~q literal 0 HcmV?d00001 diff --git a/reports/llms-report.json b/reports/llms-report.json index 6090a043287..9ea19cde0fc 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,14 +1,14 @@ { - "startedAt": "2025-12-01T18:57:15.612Z", + "startedAt": "2025-12-03T16:54:06.965Z", "siteBase": "https://docs.chain.link", "sections": [ { "section": "cre-go", "pagesProcessed": 83, "outputPath": "src/content/cre/llms-full-go.txt", - "bytes": 651940, + "bytes": 651944, "prevBytes": 651940, - "deltaBytes": 0 + "deltaBytes": 4 }, { "section": "cre-ts", @@ -30,9 +30,9 @@ "section": "ccip", "pagesProcessed": 260, "outputPath": "src/content/ccip/llms-full.txt", - "bytes": 2849282, - "prevBytes": 2849278, - "deltaBytes": 4 + "bytes": 2849781, + "prevBytes": 2849282, + "deltaBytes": 499 }, { "section": "data-feeds", @@ -119,9 +119,9 @@ "pagesProcessed": 55, "outputPath": "src/content/chainlink-local/llms-full.txt", "bytes": 297281, - "prevBytes": 297263, - "deltaBytes": 18 + "prevBytes": 297281, + "deltaBytes": 0 } ], - "finishedAt": "2025-12-01T18:57:19.195Z" + "finishedAt": "2025-12-03T16:54:10.581Z" } diff --git a/src/content/ccip/concepts/architecture/offchain/overview.mdx b/src/content/ccip/concepts/architecture/offchain/overview.mdx index 5a103c91acf..8399460071f 100644 --- a/src/content/ccip/concepts/architecture/offchain/overview.mdx +++ b/src/content/ccip/concepts/architecture/offchain/overview.mdx @@ -12,13 +12,21 @@ metadata: estimatedTime: "25 minutes" --- -import { ClickToZoom } from "@components" +import { Aside, ClickToZoom } from "@components" CCIP's offchain architecture includes the following: - **Decentralized Oracle Networks (DONs)**: Running offchain consensus using the Offchain Reporting Protocol (OCR). - **Interaction Components**: Managing communication between the CCIP DONs. +<Aside type="note"> + Based on user demand, CCIP's architecture is evolving to provide enhanced support for modular security and + configurable compliance capabilities. As part of this transition, the Risk Management Network is being adapted to + align with this broader, more flexible architecture. Please see the [onchain + architecture](/ccip/concepts/architecture/onchain/evm/components#rmn-contract) for more information on the current + functionality of the Risk Management Network. +</Aside> + ## Components ### CCIP Decentralized Oracle Networks diff --git a/src/content/ccip/index.mdx b/src/content/ccip/index.mdx index 279cad0d771..796470376fc 100644 --- a/src/content/ccip/index.mdx +++ b/src/content/ccip/index.mdx @@ -44,7 +44,7 @@ CCIP's robust security framework is built upon several core components: - **High-Quality, Sybil-Resistant Node Operators**: The system is secured by the same globally distributed, security-reviewed, public node operators that secure other Chainlink services, validate leading blockchain networks, and operate traditional Web2 infrastructure. Each independent CCIP node is run by a distinct organization with extensive DevOps expertise and rigorous private key management security practices. <ClickToZoom - src="/images/ccip/ccip-hl-v1.7.png" + src="/images/ccip/ccip-hl-v1.7.jpg" alt="Chainlink CCIP Architecture" style="display: block; margin: 2rem auto; max-height: 60vh; width: auto;" /> diff --git a/src/content/ccip/llms-full.txt b/src/content/ccip/llms-full.txt index 48b565589c6..9d0543c7328 100644 --- a/src/content/ccip/llms-full.txt +++ b/src/content/ccip/llms-full.txt @@ -1996,6 +1996,14 @@ CCIP's offchain architecture includes the following: - **Decentralized Oracle Networks (DONs)**: Running offchain consensus using the Offchain Reporting Protocol (OCR). - **Interaction Components**: Managing communication between the CCIP DONs. +<Aside type="note"> + Based on user demand, CCIP's architecture is evolving to provide enhanced support for modular security and + configurable compliance capabilities. As part of this transition, the Risk Management Network is being adapted to + align with this broader, more flexible architecture. Please see the [onchain + architecture](/ccip/concepts/architecture/onchain/evm/components#rmn-contract) for more information on the current + functionality of the Risk Management Network. +</Aside> + ## Components ### CCIP Decentralized Oracle Networks diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index c5ee51d6a01..d3c63b7e58e 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -9110,7 +9110,7 @@ func onCronTrigger(config *Config, runtime cre.Runtime, trigger *cron.Payload) ( } logger.Info("Successfully fetched offchain value", "result", offchainValue) - + // Get the first EVM configuration from the list. evmConfig := config.Evms[0] @@ -9146,7 +9146,7 @@ func onCronTrigger(config *Config, runtime cre.Runtime, trigger *cron.Payload) ( return &MyResult{ FinalResult: finalResult, }, nil - + } func main() { @@ -9451,7 +9451,7 @@ func onCronTrigger(config *Config, runtime cre.Runtime, trigger *cron.Payload) ( } logger.Info("Successfully read onchain value", "result", onchainValue) - + // Step 3: Calculate the final result finalResultInt := new(big.Int).Add(onchainValue, offchainValue) @@ -9474,7 +9474,7 @@ func onCronTrigger(config *Config, runtime cre.Runtime, trigger *cron.Payload) ( logger.Info("Workflow finished successfully!", "result", finalWorkflowResult) return finalWorkflowResult, nil - + } func fetchMathResult(config *Config, logger *slog.Logger, sendRequester *http.SendRequester) (*big.Int, error) { From 56bf0ce75c8898e87f787c0c41c435269115f85f Mon Sep 17 00:00:00 2001 From: devin distefano <devin.distefano@smartcontract.com> Date: Wed, 3 Dec 2025 15:56:46 -0800 Subject: [PATCH 020/214] Streams: Deprecation support (#3245) * Skip cache for deprecating feeds page to show fresh data * streams deprecaiton update * lint fix * add deprecating feeds to sidebar + exclusion to filter stream deprecations in feeds tables * added copy --- src/config/sidebar.ts | 8 + .../data-streams/deprecating-streams.mdx | 11 + src/features/data/api/backend.ts | 9 +- src/features/feeds/components/FeedList.tsx | 93 +++- src/features/feeds/components/FeedPage.astro | 4 +- src/features/feeds/components/Tables.tsx | 409 +++++++++--------- .../streams/components/StreamsPage.astro | 88 ++++ 7 files changed, 402 insertions(+), 220 deletions(-) create mode 100644 src/content/data-streams/deprecating-streams.mdx create mode 100644 src/features/streams/components/StreamsPage.astro diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index 3d537eb6c0c..c70e3d9195a 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -596,6 +596,10 @@ export const SIDEBAR: Partial<Record<Sections, SectionEntry[]>> = { title: "Selecting Quality Data Feeds", url: "data-feeds/selecting-data-feeds", }, + { + title: "Deprecating Feeds", + url: "data-feeds/deprecating-feeds", + }, ], }, { @@ -895,6 +899,10 @@ export const SIDEBAR: Partial<Record<Sections, SectionEntry[]>> = { title: "Market Hours", url: "data-streams/market-hours", }, + { + title: "Deprecating Streams", + url: "data-streams/deprecating-streams", + }, ], }, { diff --git a/src/content/data-streams/deprecating-streams.mdx b/src/content/data-streams/deprecating-streams.mdx new file mode 100644 index 00000000000..19fcacda6cb --- /dev/null +++ b/src/content/data-streams/deprecating-streams.mdx @@ -0,0 +1,11 @@ +--- +title: "Deprecation of Chainlink Data Streams" +section: dataStreams +metadata: + description: "Deprecation of Chainlink Data Streams" +date: Last Modified +--- + +import StreamsPage from "@features/streams/components/StreamsPage.astro" + +<StreamsPage ecosystem="deprecating" /> diff --git a/src/features/data/api/backend.ts b/src/features/data/api/backend.ts index fb3dc24aa13..c4ee9a320bf 100644 --- a/src/features/data/api/backend.ts +++ b/src/features/data/api/backend.ts @@ -2,14 +2,17 @@ import EleventyFetch from "@11ty/eleventy-fetch" import { ChainMetadata, mergeWithMVRFeeds } from "./index.ts" import { Chain, POR_MVR_FEEDS_URL } from "../chains.ts" -export const getServerSideChainMetadata = async (chains: Chain[]): Promise<Record<string, ChainMetadata>> => { +export const getServerSideChainMetadata = async ( + chains: Chain[], + skipCache = false +): Promise<Record<string, ChainMetadata>> => { const cache = {} for (const chain of chains) { const requests = chain.networks.map((nw) => nw?.rddUrl ? EleventyFetch(nw?.rddUrl, { - duration: "1d", // save for 1 day + duration: skipCache ? "0s" : "1d", // No cache if skipCache is true type: "json", // we'll parse JSON for you }).then((metadata) => ({ ...nw, @@ -26,7 +29,7 @@ export const getServerSideChainMetadata = async (chains: Chain[]): Promise<Recor try { const mvrFeeds = await EleventyFetch(POR_MVR_FEEDS_URL, { - duration: "1d", + duration: skipCache ? "0s" : "1d", type: "json", }) diff --git a/src/features/feeds/components/FeedList.tsx b/src/features/feeds/components/FeedList.tsx index 682e13a3dda..fee6d1fa4cb 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" @@ -744,6 +744,54 @@ export const FeedList = ({ dataFeedType === "streamsExRate" || dataFeedType === "streamsBacked" ) { + // For deprecating streams, show a consolidated table across all networks + if (isDeprecating) { + const allDeprecatingStreams: any[] = [] + + // Check both chainMetadata and initialCache for deprecating streams + const networksToCheck = + chainMetadata.processedData?.networks || + (initialCache && initialCache.deprecated ? (initialCache.deprecated as any).networks : []) + + networksToCheck.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) { + allDeprecatingStreams.push({ + ...item, + networkName: network.name, + }) + } + }) + }) + + return ( + <> + {chainMetadata.loading && !chainMetadata.processedData && !initialCache && <p>Loading...</p>} + {chainMetadata.error && <p>There was an error loading the streams...</p>} + + {allDeprecatingStreams.length > 0 ? ( + <SectionWrapper title="Deprecating Streams" depth={2}> + <div className={feedList.tableWrapper}> + <table className={clsx(tableStyles.table)}> + <StreamsTHead /> + <tbody> + {allDeprecatingStreams.map((stream, index) => ( + <StreamsTr key={`${stream.feedId}-${index}`} metadata={stream} isMainnet={true} /> + ))} + </tbody> + </table> + </div> + </SectionWrapper> + ) : ( + !chainMetadata.loading && <p>No deprecating streams found at this time.</p> + )} + </> + ) + } + + // Regular streams view (non-deprecating) const mainnetFeeds: ChainNetwork[] = [] const testnetFeeds: ChainNetwork[] = [] @@ -759,20 +807,24 @@ export const FeedList = ({ return ( <> - {allowNetworkTableExpansion ? ( - <div style={{ marginBottom: "var(--space-2x)" }}> - <StreamsNetworkAddressesTable - allowExpansion={allowNetworkTableExpansion} - defaultExpanded={defaultNetworkTableExpanded} - /> - </div> - ) : ( - <SectionWrapper title="Streams Verifier Network Addresses" depth={2}> - <StreamsNetworkAddressesTable - allowExpansion={allowNetworkTableExpansion} - defaultExpanded={defaultNetworkTableExpanded} - /> - </SectionWrapper> + {!isDeprecating && ( + <> + {allowNetworkTableExpansion ? ( + <div style={{ marginBottom: "var(--space-2x)" }}> + <StreamsNetworkAddressesTable + allowExpansion={allowNetworkTableExpansion} + defaultExpanded={defaultNetworkTableExpanded} + /> + </div> + ) : ( + <SectionWrapper title="Streams Verifier Network Addresses" depth={2}> + <StreamsNetworkAddressesTable + allowExpansion={allowNetworkTableExpansion} + defaultExpanded={defaultNetworkTableExpanded} + /> + </SectionWrapper> + )} + </> )} <SectionWrapper @@ -1057,7 +1109,8 @@ export const FeedList = ({ .filter((network: any) => { let foundDeprecated = false network.metadata?.forEach((feed: any) => { - if (feed.feedCategory === "deprecating") { + // Only include actual feeds (not streams) with deprecating status + if (feed.feedCategory === "deprecating" && !(feed.contractType === "verifier" && feed.feedId)) { foundDeprecated = true } }) @@ -1083,7 +1136,10 @@ export const FeedList = ({ } network={{ ...network, - metadata: network.metadata.filter((feed: any) => feed.feedCategory === "deprecating"), + metadata: network.metadata.filter( + (feed: any) => + feed.feedCategory === "deprecating" && !(feed.contractType === "verifier" && feed.feedId) + ), }} showExtraDetails={showExtraDetails} showOnlySVR={showOnlySVR} @@ -1108,7 +1164,8 @@ export const FeedList = ({ if (isDeprecating) { let foundDeprecated = false network.metadata?.forEach((feed: any) => { - if (feed.feedCategory === "deprecating") { + // Only include actual feeds (not streams) with deprecating status + if (feed.feedCategory === "deprecating" && !(feed.contractType === "verifier" && feed.feedId)) { foundDeprecated = true } }) diff --git a/src/features/feeds/components/FeedPage.astro b/src/features/feeds/components/FeedPage.astro index f48355afa8b..821d173d482 100644 --- a/src/features/feeds/components/FeedPage.astro +++ b/src/features/feeds/components/FeedPage.astro @@ -25,7 +25,9 @@ import { FeedDataItem, monitoredFeeds } from "~/features/data" const { initialNetwork, ecosystem, dataFeedType, allowNetworkTableExpansion, defaultNetworkTableExpanded } = Astro.props -const initialCache = await getServerSideChainMetadata([...CHAINS, ...ALL_CHAINS]) +// Skip cache for deprecating page to always fetch fresh data +const isDeprecating = ecosystem === "deprecating" +const initialCache = await getServerSideChainMetadata([...CHAINS, ...ALL_CHAINS], isDeprecating) const feedItems: FeedDataItem[] = monitoredFeeds.mainnet --- diff --git a/src/features/feeds/components/Tables.tsx b/src/features/feeds/components/Tables.tsx index c4badc54af8..80637922f72 100644 --- a/src/features/feeds/components/Tables.tsx +++ b/src/features/feeds/components/Tables.tsx @@ -842,7 +842,7 @@ export const StreamsNetworkAddressesTable = ({ ) } -const StreamsTHead = () => ( +export const StreamsTHead = () => ( <thead> <tr> <th className={tableStyles.heading}>Stream</th> @@ -862,204 +862,214 @@ const streamsCategoryMap = { }, } -const StreamsTr = ({ metadata, isMainnet }) => ( - <tr> - <td className={tableStyles.pairCol}> - <div className={tableStyles.assetPair}> - {metadata.pair[0]}/{metadata.pair[1]} - {metadata.feedType === "Crypto-DEX" && ( - <a - href="/data-streams/concepts/dex-state-price-streams" - target="_blank" - className={tableStyles.feedVariantBadge} - > - DEX State Price - </a> - )} - </div> - {metadata.docs.shutdownDate && ( - <div className={clsx(feedList.shutDate)}> - <hr /> - Deprecating: - <br /> - {metadata.docs.shutdownDate} - </div> - )} - </td> - <td style="width:80%;"> - <div className={tableStyles.assetAddress}> - <span className={tableStyles.streamAddress}>{metadata.feedId}</span> - <button - className={clsx(tableStyles.copyBtn, "copy-iconbutton")} - style={{ height: "16px", width: "16px" }} - data-clipboard-text={metadata.feedId} - onClick={(e) => - handleClick(e, { - product: "STREAMS", - action: "feedId_copied", - extraInfo1: isMainnet ? "Mainnet" : "Testnet", - extraInfo2: metadata.pair[0], - extraInfo3: metadata.feedId, - }) - } - > - <img src="/assets/icons/copyIcon.svg" alt="copy to clipboard" /> - </button> - </div> - <div> - <dl className={tableStyles.listContainer}> - {isMainnet && metadata.docs.clicProductName && metadata.feedType !== "Tokenized Equities" && ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Full name:</span> - </dt> - <dd>{metadata.docs.clicProductName}</dd> - </div> - )} - {metadata.assetName && ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Asset name:</span> - </dt> - <dd>{metadata.assetName}</dd> - </div> - )} - {metadata.docs.assetClass ? ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Asset class:</span> - </dt> - <dd> - {metadata.docs.assetClass} - {metadata.docs.assetSubClass && - metadata.docs.assetSubClass !== "Crypto" && - metadata.docs.assetSubClass !== "Equities" - ? " - " + metadata.docs.assetSubClass - : ""} - </dd> - </div> - ) : null} - {metadata.docs.marketHours ? ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Market hours:</span> - </dt> - <dd> - <a href="/data-streams/market-hours" target="_blank"> - {metadata.docs.marketHours} - </a> - </dd> - </div> - ) : null} - {streamsCategoryMap[metadata.feedCategory] ? ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Category:</span> - </dt> - <dd> - <a href={streamsCategoryMap[metadata.feedCategory].link}> - {streamsCategoryMap[metadata.feedCategory].text} - </a> - </dd> - </div> - ) : null} - {metadata.decimals ? ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Decimals:</span> - </dt> - <dd>{metadata.decimals}</dd> - </div> - ) : null} +export const StreamsTr = ({ metadata, isMainnet }) => { + // Determine if stream is deprecating + const isDeprecating = !!metadata.docs?.shutdownDate + + return ( + <tr> + <td className={tableStyles.pairCol}> + <div className={tableStyles.assetPair}> + {metadata.pair[0]}/{metadata.pair[1]} {metadata.feedType === "Crypto-DEX" && ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Report Schema:</span> - </dt> - <dd> - <a href="/data-streams/reference/report-schema-v3-dex" rel="noreferrer" target="_blank"> - Report Schema v3 (Crypto DEX) - </a> - </dd> - </div> - )} - {metadata.feedType === "Crypto" && metadata.docs?.productTypeCode !== "ExRate" && ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Report Schema:</span> - </dt> - <dd> - <a href="/data-streams/reference/report-schema-v3" rel="noreferrer" target="_blank"> - Report Schema v3 (Crypto) - </a> - </dd> - </div> - )} - {(metadata.feedType === "Equities" || metadata.feedType === "Forex") && metadata.docs?.schema !== "v11" && ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Report Schema:</span> - </dt> - <dd> - <a href="/data-streams/reference/report-schema-v8" rel="noreferrer" target="_blank"> - Report Schema v8 (RWA) - </a> - </dd> - </div> - )} - {metadata.docs?.productTypeCode === "ExRate" && ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Report Schema:</span> - </dt> - <dd> - <a href="/data-streams/reference/report-schema-v7" rel="noreferrer" target="_blank"> - Report Schema v7 (Redemption Rates) - </a> - </dd> - </div> - )} - {metadata.feedType === "Net Asset Value" && ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Report Schema:</span> - </dt> - <dd> - <a href="/data-streams/reference/report-schema-v9" rel="noreferrer" target="_blank"> - Report Schema v9 (NAV) - </a> - </dd> - </div> - )} - {metadata.feedType === "Tokenized Equities" && ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Report Schema:</span> - </dt> - <dd> - <a href="/data-streams/reference/report-schema-v10" rel="noreferrer" target="_blank"> - Report Schema v10 (Tokenized Assets) - </a> - </dd> - </div> - )} - {metadata.docs?.schema === "v11" && ( - <div className={tableStyles.definitionGroup}> - <dt> - <span className="label">Report Schema:</span> - </dt> - <dd> - <a href="/data-streams/reference/report-schema-v11" rel="noreferrer" target="_blank"> - RWA Advanced (v11) - </a> - </dd> - </div> + <a + href="/data-streams/concepts/dex-state-price-streams" + target="_blank" + className={tableStyles.feedVariantBadge} + > + DEX State Price + </a> )} - </dl> - </div> - </td> - </tr> -) + </div> + {metadata.docs.shutdownDate && ( + <div className={clsx(feedList.shutDate)}> + <hr /> + <a + href="/data-streams/deprecating-streams" + style={{ color: "inherit", textDecoration: "underline dotted" }} + > + Deprecating: + </a> + <br /> + {metadata.docs.shutdownDate} + </div> + )} + </td> + <td style="width:80%;"> + <div className={tableStyles.assetAddress}> + <span className={tableStyles.streamAddress}>{metadata.feedId}</span> + <button + className={clsx(tableStyles.copyBtn, "copy-iconbutton")} + style={{ height: "16px", width: "16px" }} + data-clipboard-text={metadata.feedId} + onClick={(e) => + handleClick(e, { + product: "STREAMS", + action: "feedId_copied", + extraInfo1: isMainnet ? "Mainnet" : "Testnet", + extraInfo2: metadata.pair[0], + extraInfo3: metadata.feedId, + }) + } + > + <img src="/assets/icons/copyIcon.svg" alt="copy to clipboard" /> + </button> + </div> + <div> + <dl className={tableStyles.listContainer}> + {isMainnet && metadata.docs.clicProductName && metadata.feedType !== "Tokenized Equities" && ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Full name:</span> + </dt> + <dd>{metadata.docs.clicProductName}</dd> + </div> + )} + {metadata.assetName && ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Asset name:</span> + </dt> + <dd>{metadata.assetName}</dd> + </div> + )} + {metadata.docs.assetClass ? ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Asset class:</span> + </dt> + <dd> + {metadata.docs.assetClass} + {metadata.docs.assetSubClass && + metadata.docs.assetSubClass !== "Crypto" && + metadata.docs.assetSubClass !== "Equities" + ? " - " + metadata.docs.assetSubClass + : ""} + </dd> + </div> + ) : null} + {metadata.docs.marketHours ? ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Market hours:</span> + </dt> + <dd> + <a href="/data-streams/market-hours" target="_blank"> + {metadata.docs.marketHours} + </a> + </dd> + </div> + ) : null} + {streamsCategoryMap[metadata.feedCategory] ? ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Category:</span> + </dt> + <dd> + <a href={streamsCategoryMap[metadata.feedCategory].link}> + {streamsCategoryMap[metadata.feedCategory].text} + </a> + </dd> + </div> + ) : null} + {metadata.decimals ? ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Decimals:</span> + </dt> + <dd>{metadata.decimals}</dd> + </div> + ) : null} + {metadata.feedType === "Crypto-DEX" && ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Report Schema:</span> + </dt> + <dd> + <a href="/data-streams/reference/report-schema-v3-dex" rel="noreferrer" target="_blank"> + Report Schema v3 (Crypto DEX) + </a> + </dd> + </div> + )} + {metadata.feedType === "Crypto" && metadata.docs?.productTypeCode !== "ExRate" && ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Report Schema:</span> + </dt> + <dd> + <a href="/data-streams/reference/report-schema-v3" rel="noreferrer" target="_blank"> + Report Schema v3 (Crypto) + </a> + </dd> + </div> + )} + {(metadata.feedType === "Equities" || metadata.feedType === "Forex") && metadata.docs?.schema !== "v11" && ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Report Schema:</span> + </dt> + <dd> + <a href="/data-streams/reference/report-schema-v8" rel="noreferrer" target="_blank"> + Report Schema v8 (RWA) + </a> + </dd> + </div> + )} + {metadata.docs?.productTypeCode === "ExRate" && ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Report Schema:</span> + </dt> + <dd> + <a href="/data-streams/reference/report-schema-v7" rel="noreferrer" target="_blank"> + Report Schema v7 (Redemption Rates) + </a> + </dd> + </div> + )} + {metadata.feedType === "Net Asset Value" && ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Report Schema:</span> + </dt> + <dd> + <a href="/data-streams/reference/report-schema-v9" rel="noreferrer" target="_blank"> + Report Schema v9 (NAV) + </a> + </dd> + </div> + )} + {metadata.feedType === "Tokenized Equities" && ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Report Schema:</span> + </dt> + <dd> + <a href="/data-streams/reference/report-schema-v10" rel="noreferrer" target="_blank"> + Report Schema v10 (Tokenized Assets) + </a> + </dd> + </div> + )} + {metadata.docs?.schema === "v11" && ( + <div className={tableStyles.definitionGroup}> + <dt> + <span className="label">Report Schema:</span> + </dt> + <dd> + <a href="/data-streams/reference/report-schema-v11" rel="noreferrer" target="_blank"> + RWA Advanced (v11) + </a> + </dd> + </div> + )} + </dl> + </div> + </td> + </tr> + ) +} export const MainnetTable = ({ network, @@ -1144,7 +1154,10 @@ export const MainnetTable = ({ return false } - if (isDeprecating) return !!metadata.docs.shutdownDate + if (isDeprecating) { + // Only show feeds (not streams) with shutdown dates + return !!metadata.docs.shutdownDate && !(metadata.contractType === "verifier" && metadata.feedId) + } // Use shared visibility logic with filters return isFeedVisible(metadata, dataFeedType as any, ecosystem, { 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" ? ( + <> + <p> + 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. + </p> + <p> + 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. + </p> + <p> + For status updates regarding Data Streams and Data Feeds, users should join the official{" "} + <a href="https://chain.link/discord">Chainlink Discord</a> and subscribe to the{" "} + <a href="https://discord.gg/Dqy5N9UbsR">data-feeds-user-notifications channel</a>. + </p> + <p> + A list of Data Streams feeds designated for deprecation, along with their corresponding shutdown date, can be + found below. + </p> + <Aside type="note" title="Reactivation"> + <p> + <strong>Deprecated Data Streams feeds can be reactivated at any time should new demand emerge</strong>. Teams + interested in re-enabling a deprecated Data Streams feed (or requesting a new one) can{" "} + <a href="https://chainlinkcommunity.typeform.com/datastreams?#ref_id=docs">reach out</a> to discuss + requirements, expected usage, and deployment timelines. + </p> + <p> + Always use caution and perform proper due diligence before integrating Chainlink Data Streams into your + application. Review our <a href="/data-streams/concepts/best-practices">Data Streams Best Practices</a> to + help manage risks, optimize performance, and ensure compliance with market standards. + </p> + </Aside> + </> + ) : ( + <> + <p> + To learn how to use Data Streams, see the{" "} + <a href="/data-streams/tutorials/go-sdk-fetch">Fetch and decode reports</a> tutorial. + </p> + <p> + For LINK token and Faucet details, see the{" "} + <a href="/resources/link-token-contracts?parent=dataFeeds">LINK Token Contracts</a> page. + </p> + + <Aside type="note" title="Talk to an expert"> + <p> + <a href="https://chainlinkcommunity.typeform.com/datastreams?#ref_id=docs">Contact us</a> to talk to an expert + about integrating Chainlink Data Streams with your applications. + </p> + </Aside> + </> + ) +} + +<FeedList + client:idle + initialNetwork={initialNetwork ?? "arbitrum"} + dataFeedType={dataFeedType ?? "streamsCrypto"} + ecosystem={ecosystem ?? ""} + initialCache={initialCache} + allowNetworkTableExpansion={allowNetworkTableExpansion} + defaultNetworkTableExpanded={defaultNetworkTableExpanded} +/> From 0dfc4af71ddb2554f89f335e27fe1be73b926ad5 Mon Sep 17 00:00:00 2001 From: devin distefano <devin.distefano@smartcontract.com> Date: Thu, 4 Dec 2025 09:02:46 -0800 Subject: [PATCH 021/214] Streams: deprecation pagination (#3249) * pagination for deprecating streams page * llm gen * remove test file * revert chains * more improvements, pagination, search, etc * lintfix --- reports/llms-report.json | 18 +- src/content/data-streams/llms-full.txt | 7 + src/features/feeds/components/FeedList.tsx | 214 +++++++++++++++++---- 3 files changed, 195 insertions(+), 44 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index 9ea19cde0fc..867866780a1 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,5 +1,5 @@ { - "startedAt": "2025-12-03T16:54:06.965Z", + "startedAt": "2025-12-04T15:59:59.752Z", "siteBase": "https://docs.chain.link", "sections": [ { @@ -7,8 +7,8 @@ "pagesProcessed": 83, "outputPath": "src/content/cre/llms-full-go.txt", "bytes": 651944, - "prevBytes": 651940, - "deltaBytes": 4 + "prevBytes": 651944, + "deltaBytes": 0 }, { "section": "cre-ts", @@ -31,8 +31,8 @@ "pagesProcessed": 260, "outputPath": "src/content/ccip/llms-full.txt", "bytes": 2849781, - "prevBytes": 2849282, - "deltaBytes": 499 + "prevBytes": 2849781, + "deltaBytes": 0 }, { "section": "data-feeds", @@ -44,11 +44,11 @@ }, { "section": "data-streams", - "pagesProcessed": 54, + "pagesProcessed": 55, "outputPath": "src/content/data-streams/llms-full.txt", - "bytes": 477065, + "bytes": 477217, "prevBytes": 477065, - "deltaBytes": 0 + "deltaBytes": 152 }, { "section": "dta-technical-standard", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-03T16:54:10.581Z" + "finishedAt": "2025-12-04T16:00:03.772Z" } diff --git a/src/content/data-streams/llms-full.txt b/src/content/data-streams/llms-full.txt index cb108052299..4fe902e67dc 100644 --- a/src/content/data-streams/llms-full.txt +++ b/src/content/data-streams/llms-full.txt @@ -609,6 +609,13 @@ Chainlink Data Streams source pricing data from multiple independent aggregators --- +# Deprecation of Chainlink Data Streams +Source: https://docs.chain.link/data-streams/deprecating-streams + +<StreamsPage ecosystem="deprecating" /> + +--- + # Developer Responsibilities: Market Integrity and Application Code Risks Source: https://docs.chain.link/data-streams/developer-responsibilities diff --git a/src/features/feeds/components/FeedList.tsx b/src/features/feeds/components/FeedList.tsx index fee6d1fa4cb..d7877e861d2 100644 --- a/src/features/feeds/components/FeedList.tsx +++ b/src/features/feeds/components/FeedList.tsx @@ -314,15 +314,14 @@ 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 addrPerPage = ecosystem === "deprecating" && isStreams ? 10 : ecosystem === "deprecating" ? 10000 : 8 const lastAddr = Number(currentPage) * 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 testnetAddrPerPage = ecosystem === "deprecating" && isStreams ? 10 : ecosystem === "deprecating" ? 10000 : 8 const testnetLastAddr = Number(testnetCurrentPage) * testnetAddrPerPage const testnetFirstAddr = testnetLastAddr - testnetAddrPerPage @@ -744,49 +743,194 @@ export const FeedList = ({ dataFeedType === "streamsExRate" || dataFeedType === "streamsBacked" ) { - // For deprecating streams, show a consolidated table across all networks + // For deprecating streams, show two separate tables: mainnet and testnet if (isDeprecating) { - const allDeprecatingStreams: any[] = [] - - // Check both chainMetadata and initialCache for deprecating streams - const networksToCheck = - chainMetadata.processedData?.networks || - (initialCache && initialCache.deprecated ? (initialCache.deprecated as any).networks : []) - - networksToCheck.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) { - allDeprecatingStreams.push({ - ...item, - networkName: network.name, + 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 && <p>Loading...</p>} {chainMetadata.error && <p>There was an error loading the streams...</p>} - {allDeprecatingStreams.length > 0 ? ( - <SectionWrapper title="Deprecating Streams" depth={2}> - <div className={feedList.tableWrapper}> - <table className={clsx(tableStyles.table)}> - <StreamsTHead /> - <tbody> - {allDeprecatingStreams.map((stream, index) => ( - <StreamsTr key={`${stream.feedId}-${index}`} metadata={stream} isMainnet={true} /> - ))} - </tbody> - </table> - </div> - </SectionWrapper> - ) : ( - !chainMetadata.loading && <p>No deprecating streams found at this time.</p> - )} + <SectionWrapper title="Mainnet Deprecating Streams" depth={2}> + <form class={feedList.filterDropdown_search}> + <input + id="search" + class={feedList.filterDropdown_searchInput} + placeholder="Search" + value={typeof searchValue === "string" ? searchValue : ""} + onInput={(event) => { + setSearchValue((event.target as HTMLInputElement).value) + setCurrentPage("1") + }} + /> + </form> + {filteredMainnetStreams.length > 0 ? ( + <> + <div className={feedList.tableWrapper}> + <table className={clsx(tableStyles.table)}> + <StreamsTHead /> + <tbody> + {paginatedMainnetStreams.map((stream, index) => ( + <StreamsTr key={`${stream.feedId}-${index}`} metadata={stream} isMainnet={true} /> + ))} + </tbody> + </table> + </div> + {filteredMainnetStreams.length > addrPerPage && ( + <div className={tableStyles.pagination} role="navigation" aria-label="Table pagination"> + <button + className={button.secondary} + disabled={Number(currentPage) === 1} + onClick={() => paginate(Number(currentPage) - 1)} + > + Prev + </button> + <p aria-live="polite"> + {firstAddr + 1}- + {lastAddr > filteredMainnetStreams.length ? filteredMainnetStreams.length : lastAddr} of{" "} + {filteredMainnetStreams.length} + </p> + <button + className={button.secondary} + disabled={lastAddr >= filteredMainnetStreams.length} + onClick={() => paginate(Number(currentPage) + 1)} + > + Next + </button> + </div> + )} + </> + ) : ( + <p>No mainnet deprecating streams found.</p> + )} + </SectionWrapper> + + <SectionWrapper title="Testnet Deprecating Streams" depth={2}> + <form class={feedList.filterDropdown_search}> + <input + id="testnetSearch" + class={feedList.filterDropdown_searchInput} + placeholder="Search" + value={typeof testnetSearchValue === "string" ? testnetSearchValue : ""} + onInput={(event) => { + setTestnetSearchValue((event.target as HTMLInputElement).value) + setTestnetCurrentPage("1") + }} + /> + </form> + {filteredTestnetStreams.length > 0 ? ( + <> + <div className={feedList.tableWrapper}> + <table className={clsx(tableStyles.table)}> + <StreamsTHead /> + <tbody> + {paginatedTestnetStreams.map((stream, index) => ( + <StreamsTr key={`${stream.feedId}-${index}`} metadata={stream} isMainnet={false} /> + ))} + </tbody> + </table> + </div> + {filteredTestnetStreams.length > testnetAddrPerPage && ( + <div className={tableStyles.pagination} role="navigation" aria-label="Table pagination"> + <button + className={button.secondary} + disabled={Number(testnetCurrentPage) === 1} + onClick={() => testnetPaginate(Number(testnetCurrentPage) - 1)} + > + Prev + </button> + <p aria-live="polite"> + {testnetFirstAddr + 1}- + {testnetLastAddr > filteredTestnetStreams.length + ? filteredTestnetStreams.length + : testnetLastAddr}{" "} + of {filteredTestnetStreams.length} + </p> + <button + className={button.secondary} + disabled={testnetLastAddr >= filteredTestnetStreams.length} + onClick={() => testnetPaginate(Number(testnetCurrentPage) + 1)} + > + Next + </button> + </div> + )} + </> + ) : ( + <p>No testnet deprecating streams found.</p> + )} + </SectionWrapper> </> ) } From c7994ec97d939a7b4ea202d625d87132f9fefe08 Mon Sep 17 00:00:00 2001 From: gfletcher-cll <grace.fletcher@smartcontract.com> Date: Thu, 4 Dec 2025 12:13:55 -0800 Subject: [PATCH 022/214] Update redirects.json (#3250) --- src/features/redirects/redirects.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/features/redirects/redirects.json b/src/features/redirects/redirects.json index a059180af4f..62e70bba4e0 100644 --- a/src/features/redirects/redirects.json +++ b/src/features/redirects/redirects.json @@ -2569,6 +2569,11 @@ "source": "ccip/tools-resources/tools", "destination": "ccip/tools-resources/cli", "statusCode": 301 + }, + { + "source": "ccip/concepts/architecture/offchain/risk-management-network", + "destination": "ccip/concepts/architecture/offchain/overview", + "statusCode": 301 } ] } From 881c94b15a912aaec96b07168104858be8d7ad88 Mon Sep 17 00:00:00 2001 From: gfletcher-cll <grace.fletcher@smartcontract.com> Date: Fri, 5 Dec 2025 07:46:28 -0800 Subject: [PATCH 023/214] Update ccip-execution-latency.mdx (#3251) --- src/content/ccip/ccip-execution-latency.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/content/ccip/ccip-execution-latency.mdx b/src/content/ccip/ccip-execution-latency.mdx index 67d9f7d725c..b744e2caa3f 100644 --- a/src/content/ccip/ccip-execution-latency.mdx +++ b/src/content/ccip/ccip-execution-latency.mdx @@ -151,6 +151,7 @@ This section provides an overview of the finality methods CCIP uses to determine | Metis | Finality tag | 2 hours | | Mind Network | Finality tag | 1 hour | | Mode | Finality tag | 37 minutes | +| Monad | [Block depth](#block-depth) (120 blocks) | 48 seconds | | OP | Finality tag | 20 minutes | | Polygon | [Block depth](#block-depth) (500 blocks) | 17 minutes | | Polygon zkEVM | Finality tag | 2 hours | From a60cb917f2c452b7f1450219afed42d2be079c5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 09:37:38 +0000 Subject: [PATCH 024/214] Bump astro from 5.16.3 to 5.16.4 in the astro-framework group (#3255) * Bump astro from 5.16.3 to 5.16.4 in the astro-framework group Bumps the astro-framework group with 1 update: [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro). Updates `astro` from 5.16.3 to 5.16.4 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/astro@5.16.4/packages/astro) --- updated-dependencies: - dependency-name: astro dependency-version: 5.16.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: astro-framework ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index f84902b559a..094721f6938 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "@solana/wallet-adapter-solflare": "^0.6.32", "@solana/wallet-adapter-trust": "^0.1.17", "@supabase/supabase-js": "^2.86.0", - "astro": "^5.16.3", + "astro": "^5.16.4", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", "clipboard": "^2.0.11", @@ -12171,9 +12171,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.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz", + "integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==", "license": "MIT", "optional": true, "peer": true, @@ -16697,9 +16697,9 @@ } }, "node_modules/astro": { - "version": "5.16.3", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.3.tgz", - "integrity": "sha512-KzDk41F9Dspf5fM/Ls4XZhV4/csjJcWBrlenbnp5V3NGwU1zEaJz/HIyrdKdf5yw+FgwCeD2+Yos1Xkx9gnI0A==", + "version": "5.16.4", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.4.tgz", + "integrity": "sha512-rgXI/8/tnO3Y9tfAaUyg/8beKhlIMltbiC8Q6jCoAfEidOyaue4KYKzbe0gJIb6qEdEaG3Kf3BY3EOSLkbWOLg==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.13.0", diff --git a/package.json b/package.json index d3cfcb0d571..6149414bcba 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "@solana/wallet-adapter-solflare": "^0.6.32", "@solana/wallet-adapter-trust": "^0.1.17", "@supabase/supabase-js": "^2.86.0", - "astro": "^5.16.3", + "astro": "^5.16.4", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", "clipboard": "^2.0.11", From e4cad4f761c08dcedc3759aa4726a3751ac67bc1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 12:04:43 +0000 Subject: [PATCH 025/214] Bump pino-pretty from 13.1.2 to 13.1.3 in the utilities group (#3262) * Bump pino-pretty from 13.1.2 to 13.1.3 in the utilities group Bumps the utilities group with 1 update: [pino-pretty](https://github.com/pinojs/pino-pretty). Updates `pino-pretty` from 13.1.2 to 13.1.3 - [Release notes](https://github.com/pinojs/pino-pretty/releases) - [Commits](https://github.com/pinojs/pino-pretty/compare/v13.1.2...v13.1.3) --- updated-dependencies: - dependency-name: pino-pretty dependency-version: 13.1.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: utilities ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 28 +++++++++++++++++++--------- package.json | 2 +- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 094721f6938..983f8bd4055 100644 --- a/package-lock.json +++ b/package-lock.json @@ -95,7 +95,7 @@ "knip": "^5.70.1", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", - "pino-pretty": "^13.1.2", + "pino-pretty": "^13.1.3", "prettier": "^3.7.3", "prettier-plugin-astro": "^0.14.1", "remark-gfm": "^4.0.0", @@ -20793,9 +20793,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" }, @@ -30909,21 +30909,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", @@ -30933,6 +30933,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", diff --git a/package.json b/package.json index 6149414bcba..195a66e4a0c 100644 --- a/package.json +++ b/package.json @@ -140,7 +140,7 @@ "knip": "^5.70.1", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", - "pino-pretty": "^13.1.2", + "pino-pretty": "^13.1.3", "prettier": "^3.7.3", "prettier-plugin-astro": "^0.14.1", "remark-gfm": "^4.0.0", From 689c24cb8118b39d762268ce28b38f27c9a9bef8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 14:17:15 +0000 Subject: [PATCH 026/214] Changelog Update: New data found (#3254) * Data: Update changelog for new data items * fix entries * llm gen --------- Co-authored-by: khadni <98668332+khadni@users.noreply.github.com> --- .github/scripts/data/baseline.json | 22 +- public/changelog.json | 232 ++++++++++++++++++ reports/llms-report.json | 20 +- src/content/ccip/llms-full.txt | 1 + .../building-consumer-contracts.mdx | 6 - src/content/cre/llms-full-go.txt | 6 - src/content/cre/llms-full-ts.txt | 6 - 7 files changed, 264 insertions(+), 29 deletions(-) diff --git a/.github/scripts/data/baseline.json b/.github/scripts/data/baseline.json index aea87e7c8e2..ee0c0471581 100644 --- a/.github/scripts/data/baseline.json +++ b/.github/scripts/data/baseline.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-30T21:03:22Z", + "timestamp": "2025-12-07T21:03:36Z", "knownIds": [ "aptos-apt-usd", "aptos-btc-usd", @@ -18,6 +18,7 @@ "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-abt-usd-streams-equityprice-timestamped-mainnet-production", @@ -58,6 +59,7 @@ "arbitrum-ar-usd-refprice-ds-premium-global-003-prod", "arbitrum-arb-usd", "arbitrum-arb-usd-premium-prod", + "arbitrum-arb-usd-svr", "arbitrum-arkm-usd-premium-prod-v03", "arbitrum-aster-usd-streams-cexprice-mainnet-production", "arbitrum-astr-usd", @@ -110,6 +112,7 @@ "arbitrum-btc-usd", "arbitrum-btc-usd-marketcap", "arbitrum-btc-usd-premium-prod", + "arbitrum-btc-usd-svr", "arbitrum-btr-usd-streams-cexprice-mainnet-production", "arbitrum-btt-usd-refprice-mainnet-production", "arbitrum-c98-usd-premium-prod-v03", @@ -155,6 +158,7 @@ "arbitrum-cyber-usd-premium-prod-v03", "arbitrum-dai-usd", "arbitrum-dai-usd-premium-prod", + "arbitrum-dai-usd-svr", "arbitrum-dash-usd-refprice-mainnet-production", "arbitrum-deep-usd-refprice-mainnet-production", "arbitrum-deusd-usd", @@ -192,6 +196,7 @@ "arbitrum-eur-usd-refprice-timestamped-mainnet-production", "arbitrum-eur-usd-rwa-prod-v04", "arbitrum-eurc-usd", + "arbitrum-eurc-usd-svr", "arbitrum-eusx-usx-streams-exchangerate-mainnet-production", "arbitrum-ewj-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-ezeth-eth", @@ -213,6 +218,7 @@ "arbitrum-fragsol-sol-exchange-rate", "arbitrum-frax-usd", "arbitrum-frax-usd-refprice-mainnet-production", + "arbitrum-frax-usd-svr", "arbitrum-frxeth-eth-high", "arbitrum-frxeth-eth-low", "arbitrum-frxusd-usd", @@ -226,6 +232,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", @@ -323,6 +330,7 @@ "arbitrum-link-eth", "arbitrum-link-usd", "arbitrum-link-usd-premium-prod", + "arbitrum-link-usd-svr", "arbitrum-lista-usd-premium-prod-v03", "arbitrum-lly-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-low-usd-streams-equityprice-timestamped-mainnet-production", @@ -334,6 +342,7 @@ "arbitrum-ltc-usd-premium-prod", "arbitrum-lusd-usd", "arbitrum-lusd-usd-refprice-mainnet-production", + "arbitrum-lusd-usd-svr", "arbitrum-m-nav-arbitrum", "arbitrum-m-usd-streams-cexprice-mainnet-production", "arbitrum-ma-usd-streams-equityprice-timestamped-mainnet-production", @@ -423,6 +432,7 @@ "arbitrum-php-usd", "arbitrum-pi-usd-refprice-mainnet-production", "arbitrum-pixel-usd-premium-prod-v03", + "arbitrum-pltr-usd-streams-equityprice-timestamped-mainnet-production", "arbitrum-plume-usd", "arbitrum-plume-usd-refprice-mainnet-production", "arbitrum-pm-usd-streams-equityprice-timestamped-mainnet-production", @@ -493,6 +503,7 @@ "arbitrum-sol-usd", "arbitrum-sol-usd-premium-prod", "arbitrum-solvbtc-btc", + "arbitrum-solvbtc-btc-streams-exchangerate-mainnet-production", "arbitrum-spell-usd", "arbitrum-spk-usd-refprice-mainnet-production", "arbitrum-spx-usd-refprice-mainnet-production", @@ -588,6 +599,7 @@ "arbitrum-usdai-usd", "arbitrum-usdc-usd", "arbitrum-usdc-usd-premium-prod", + "arbitrum-usdc-usd-svr", "arbitrum-usdd-usd", "arbitrum-usde-usd", "arbitrum-usde-usd-premium-prod", @@ -597,6 +609,7 @@ "arbitrum-usds-usd-refprice-mainnet-production", "arbitrum-usdt-usd", "arbitrum-usdt-usd-premium-prod", + "arbitrum-usdt-usd-svr", "arbitrum-usol-usd-streams-cexprice-mainnet-production", "arbitrum-usr-usd", "arbitrum-usr-usd-exchange-rate", @@ -791,6 +804,7 @@ "base-anon-usd", "base-apt-usd", "base-arkb-reserves", + "base-arsx-base-por", "base-aud-usd", "base-avail-usd", "base-avax-usd", @@ -865,6 +879,7 @@ "base-reth-eth-exchange-rate", "base-rseth-eth", "base-rseth-eth-exchange-rate", + "base-rseth-eth-exchange-rate-svr", "base-rsr-usd", "base-rsweth-eth", "base-rsweth-eth-exchange-rate", @@ -1186,6 +1201,7 @@ "ethereum-c3m-eur", "ethereum-cad-usd", "ethereum-calc-xsushi-eth", + "ethereum-calculated-ethplus-usd", "ethereum-cashplus-nav", "ethereum-cbbtc-por", "ethereum-cbbtc-usd", @@ -1200,6 +1216,7 @@ "ethereum-crv-usd", "ethereum-crvusd-usd", "ethereum-cspx-usd", + "ethereum-cusdo-usd", "ethereum-cvx-eth", "ethereum-cvx-usd", "ethereum-dai-eth", @@ -1549,6 +1566,9 @@ "mantle-real-gdp-level", "mantle-real-gdp-percentage", "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", diff --git a/public/changelog.json b/public/changelog.json index 9cae6c20712..9643b54b57c 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -342,6 +342,238 @@ } }, "data": [ + { + "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", diff --git a/reports/llms-report.json b/reports/llms-report.json index 867866780a1..29acfdc5507 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,22 +1,22 @@ { - "startedAt": "2025-12-04T15:59:59.752Z", + "startedAt": "2025-12-08T14:07:09.016Z", "siteBase": "https://docs.chain.link", "sections": [ { "section": "cre-go", "pagesProcessed": 83, "outputPath": "src/content/cre/llms-full-go.txt", - "bytes": 651944, + "bytes": 651667, "prevBytes": 651944, - "deltaBytes": 0 + "deltaBytes": -277 }, { "section": "cre-ts", "pagesProcessed": 78, "outputPath": "src/content/cre/llms-full-ts.txt", - "bytes": 607447, + "bytes": 607170, "prevBytes": 607447, - "deltaBytes": 0 + "deltaBytes": -277 }, { "section": "vrf", @@ -30,9 +30,9 @@ "section": "ccip", "pagesProcessed": 260, "outputPath": "src/content/ccip/llms-full.txt", - "bytes": 2849781, + "bytes": 2849877, "prevBytes": 2849781, - "deltaBytes": 0 + "deltaBytes": 96 }, { "section": "data-feeds", @@ -47,8 +47,8 @@ "pagesProcessed": 55, "outputPath": "src/content/data-streams/llms-full.txt", "bytes": 477217, - "prevBytes": 477065, - "deltaBytes": 152 + "prevBytes": 477217, + "deltaBytes": 0 }, { "section": "dta-technical-standard", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-04T16:00:03.772Z" + "finishedAt": "2025-12-08T14:07:12.967Z" } diff --git a/src/content/ccip/llms-full.txt b/src/content/ccip/llms-full.txt index 9d0543c7328..b9f490a6d81 100644 --- a/src/content/ccip/llms-full.txt +++ b/src/content/ccip/llms-full.txt @@ -679,6 +679,7 @@ This section provides an overview of the finality methods CCIP uses to determine | Metis | Finality tag | 2 hours | | Mind Network | Finality tag | 1 hour | | Mode | Finality tag | 37 minutes | +| Monad | [Block depth](#block-depth) (120 blocks) | 48 seconds | | OP | Finality tag | 20 minutes | | Polygon | [Block depth](#block-depth) (500 blocks) | 17 minutes | | Polygon zkEVM | Finality tag | 2 hours | diff --git a/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx b/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx index b2bb6349e51..dc21f98ef96 100644 --- a/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx @@ -583,9 +583,3 @@ The deployment and configuration process involves these steps: #### End-to-End Sequence <ClickToZoom src="/images/cre/consumer-contracts-proxy-pattern.png" alt="Building Consumer Contracts: Proxy Pattern" /> - -## Where to go next? - -Now that you know how to build a consumer contract, the next step is to call it from your workflow. - -- **[Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write)**: Learn how to use the `EVMClient` to send data to your new consumer contract. diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index d3c63b7e58e..48722460c70 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -2908,12 +2908,6 @@ The deployment and configuration process involves these steps: #### End-to-End Sequence -## Where to go next? - -Now that you know how to build a consumer contract, the next step is to call it from your workflow. - -- **[Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write)**: Learn how to use the `EVMClient` to send data to your new consumer contract. - --- # Using WriteReportFrom Helpers diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index 4281a43711e..b45ad03814a 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -2497,12 +2497,6 @@ The deployment and configuration process involves these steps: #### End-to-End Sequence -## Where to go next? - -Now that you know how to build a consumer contract, the next step is to call it from your workflow. - -- **[Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write)**: Learn how to use the `EVMClient` to send data to your new consumer contract. - --- # Writing Data Onchain From cad1f809e9b84adbbcdcbba2285376975f14c3c6 Mon Sep 17 00:00:00 2001 From: gfletcher-cll <grace.fletcher@smartcontract.com> Date: Mon, 8 Dec 2025 09:55:56 -0800 Subject: [PATCH 027/214] new chains 12/08 (#3265) * nit * changelog * Update productChainLinks.ts fix * Update productChainLinks.ts * Update productChainLinks.ts * Update productChainLinks.ts * update chains * mainnet * mainnet * mainnet --------- Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- public/assets/chains/morph.svg | 4 + public/assets/chains/stable.svg | 10 + public/changelog.json | 42 + .../QuickLinks/data/productChainLinks.ts | 7 +- src/config/data/ccip/selectors.yml | 12 + .../data/ccip/v1_2_0/mainnet/chains.json | 60 + .../data/ccip/v1_2_0/mainnet/lanes.json | 1748 ++++++++++++++++- .../data/ccip/v1_2_0/mainnet/tokens.json | 322 ++- .../data/ccip/v1_2_0/testnet/chains.json | 20 + .../data/ccip/v1_2_0/testnet/lanes.json | 106 + .../data/ccip/v1_2_0/testnet/tokens.json | 34 + src/config/data/chain-to-technology.json | 7 +- src/config/data/chains.json | 81 + src/config/types.ts | 8 + src/config/web3Providers.ts | 5 + .../resources/link-token-contracts.mdx | 70 +- src/features/utils/index.ts | 20 + src/scripts/reference/chains.json | 145 +- src/scripts/reference/linkNameSymbol.json | 20 + 19 files changed, 2616 insertions(+), 105 deletions(-) create mode 100644 public/assets/chains/morph.svg create mode 100644 public/assets/chains/stable.svg 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 @@ +<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> +<rect width="32" height="32" rx="4" fill="#14A800"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M8 24H13.5097V15.7372C13.5097 15.4701 13.8938 15.4288 13.9506 15.6898L15.2505 21.6563H18.5563V19.6028C18.5563 19.4796 18.6562 19.3798 18.7794 19.3798H24V8H18.4903V10.0535C18.4903 10.1766 18.3905 10.2765 18.2673 10.2765H12.7712L13.2229 12.3497C13.2532 12.4887 13.1473 12.6202 13.005 12.6202H8V24Z" fill="white"/> +</svg> 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 @@ +<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M0 4C0 1.79086 1.79086 0 4 0H28C30.2091 0 32 1.79086 32 4V28C32 30.2091 30.2091 32 28 32H4C1.79086 32 0 30.2091 0 28V4Z" fill="url(#paint0_linear_13955_128882)"/> +<path d="M15.9875 16.9177C16.8129 16.4173 17.99 15.725 18.9156 15.725C20.3969 15.725 21.6355 16.7737 21.6355 18.7661C21.6355 21.9445 17.857 24.8748 12.5178 23.5984C12.5001 23.5942 12.4829 23.6076 12.4829 23.6256V25.0548V25.2288V25.3438C12.4829 25.3554 12.4899 25.3657 12.5008 25.3699C13.2369 25.6452 14.0143 25.8361 14.8209 25.9306C21.0766 26.666 26.4814 21.448 25.9659 15.1703C25.818 13.3702 25.209 11.7149 24.2273 10.3146C24.2199 10.304 24.2068 10.2973 24.1885 10.3069L15.9925 15.0443C15.0609 15.5757 13.9896 16.2405 13.0658 16.2405C11.5845 16.2405 10.3459 15.1918 10.3459 13.1994C10.3459 10.0207 14.1248 7.09072 19.464 8.36744C19.4816 8.37168 19.4985 8.35862 19.4985 8.34027V6.64856C19.4985 6.63692 19.4915 6.62633 19.4806 6.62245C18.3962 6.22017 17.224 5.99997 15.9999 5.99997C10.4772 5.99997 6 10.477 6 15.9999C6 18.0949 6.64469 20.0393 7.74598 21.646C7.75445 21.658 7.77068 21.6618 7.78339 21.6544L15.9875 16.9177Z" fill="#E8FBF7"/> +<defs> +<linearGradient id="paint0_linear_13955_128882" x1="19" y1="17.5" x2="10.5" y2="36" gradientUnits="userSpaceOnUse"> +<stop offset="0.0689475" stop-color="#02201F"/> +<stop offset="0.971058" stop-color="#064131"/> +</linearGradient> +</defs> +</svg> diff --git a/public/changelog.json b/public/changelog.json index 9643b54b57c..ff7bca050b7 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -148,6 +148,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 +224,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" @@ -284,6 +292,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" @@ -342,6 +354,36 @@ } }, "data": [ + { + "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", diff --git a/src/components/QuickLinks/data/productChainLinks.ts b/src/components/QuickLinks/data/productChainLinks.ts index 62e1d4c1a8f..a95a456fb29 100644 --- a/src/components/QuickLinks/data/productChainLinks.ts +++ b/src/components/QuickLinks/data/productChainLinks.ts @@ -99,6 +99,9 @@ export const productChainLinks: ProductChainLinks = { abchain: "/ccip/directory/mainnet/chain/ab-mainnet", henesys: "/ccip/directory/mainnet/chain/nexon-mainnet-henesys", pharos: "/ccip/directory/testnet/chain/pharos-atlantic-testnet", + morph: "/ccip/directory/mainnet/chain/morph-mainnet", + jovay: "/ccip/directory/mainnet/chain/jovay-mainnet", + stable: "/ccip/directory/mainnet/chain/stable-mainnet", }, }, CRE: { @@ -415,7 +418,6 @@ export const chainNames: Record<string, string> = { tac: "Tac", kaia: "Kaia", plasma: "Plasma", - jovay: "Jovay", memento: "Memento", xdc: "XDC", bittensor: "Bittensor EVM", @@ -423,4 +425,7 @@ export const chainNames: Record<string, string> = { abchain: "AB Chain", henesys: "Henesys", pharos: "Pharos", + morph: "Morph", + jovay: "Jovay", + stable: "Stable", } diff --git a/src/config/data/ccip/selectors.yml b/src/config/data/ccip/selectors.yml index b10a86e7cef..072df72383a 100644 --- a/src/config/data/ccip/selectors.yml +++ b/src/config/data/ccip/selectors.yml @@ -433,6 +433,12 @@ selectors: 42429: selector: "3963528237232804922" name: "tempo-testnet" + 10087: + selector: "3667207123485082040" + name: gate-layer-testnet + 85: + selector: "3558960680482140165" + name: gate-chain-testnet-meteora # Mainnets 1: @@ -761,3 +767,9 @@ selectors: 4326: selector: "6093540873831549674" name: "megaeth-mainnet" + 10088: + selector: "9373518659714509671" + name: gate-layer-mainnet + 86: + selector: "9688382747979139404" + name: gate-chain-mainnet diff --git a/src/config/data/ccip/v1_2_0/mainnet/chains.json b/src/config/data/ccip/v1_2_0/mainnet/chains.json index 3ff82daadfb..daf483542d5 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/chains.json +++ b/src/config/data/ccip/v1_2_0/mainnet/chains.json @@ -1018,6 +1018,26 @@ "version": "1.5.1" } }, + "jovay-mainnet": { + "armProxy": { + "address": "0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13", + "version": "1.0.0" + }, + "chainSelector": "1523760397290643893", + "feeTokens": ["LINK", "WETH"], + "registryModule": { + "address": "0xf4a170A36D4C656F614d44453f73308Bdb275196", + "version": "1.6.0" + }, + "router": { + "address": "0x492641F648a4986844848E0beFE66D14817bCE34", + "version": "1.2.0" + }, + "tokenAdminRegistry": { + "address": "0xA27056438FfA1f286AB197488808692F0db93F8B", + "version": "1.5.0" + } + }, "kaia-mainnet": { "armProxy": { "address": "0x98E7867DE8D5904bEda540Ee2Ee4E941Ac1caFD9", @@ -1250,6 +1270,26 @@ "version": "1.5.0" } }, + "morph-mainnet": { + "armProxy": { + "address": "0x15C03488B29e27d62BAf10E30b0c474bf60E0264", + "version": "1.0.0" + }, + "chainSelector": "18164309074156128038", + "feeTokens": ["LINK", "WETH"], + "registryModule": { + "address": "0x9A82E768C885DEF7C4b47451Fd4Db53d8B21ed07", + "version": "1.6.0" + }, + "router": { + "address": "0x3201a20D2a33820C0DaC8Bc93C4819755C2a8c7F", + "version": "1.2.0" + }, + "tokenAdminRegistry": { + "address": "0xEfd5fEFEdE55B5C41B8fa0d171a79ba5BeadD2Aa", + "version": "1.5.0" + } + }, "nexon-mainnet-henesys": { "armProxy": { "address": "0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13", @@ -1524,6 +1564,26 @@ "version": "1.5.1" } }, + "stable-mainnet": { + "armProxy": { + "address": "0x8A76fe7fA6da27f85a626c5C53730B38D13603d7", + "version": "1.0.0" + }, + "chainSelector": "16978377838628290997", + "feeTokens": ["LINK", "WgUSDT"], + "registryModule": { + "address": "0x7CcFb2Fa43637b4858Cb1269CF0d64a99e8C668a", + "version": "1.6.0" + }, + "router": { + "address": "0xECFF67559c0583027A5fbd85136E33bC4D66eeA0", + "version": "1.2.0" + }, + "tokenAdminRegistry": { + "address": "0x3c23e6FB09064e9A64829Fa8FEe27Ad19A27Bfa9", + "version": "1.5.0" + } + }, "superseed-mainnet": { "armProxy": { "address": "0x1A99FF887e5bb3962dA97F409487663B5F539799", diff --git a/src/config/data/ccip/v1_2_0/mainnet/lanes.json b/src/config/data/ccip/v1_2_0/mainnet/lanes.json index e3419d8fb0d..7693213e7e8 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/mainnet/lanes.json @@ -20,6 +20,22 @@ "address": "0xa132F089492CcE5f1D79483a9e4552f37266ed01", "enforceOutOfOrder": false, "version": "1.6.0" + }, + "supportedTokens": { + "W0G": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } } }, "ethereum-mainnet-base-1": { @@ -31,6 +47,22 @@ "address": "0xa132F089492CcE5f1D79483a9e4552f37266ed01", "enforceOutOfOrder": false, "version": "1.6.0" + }, + "supportedTokens": { + "W0G": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } } }, "hyperliquid-mainnet": { @@ -97,6 +129,20 @@ } } }, + "W0G": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "wstETH": { "rateLimiterConfig": { "in": { @@ -113,6 +159,17 @@ } } }, + "monad-mainnet": { + "offRamp": { + "address": "0xb0B4b5847E35033766d5B49CD9C0fC40F459321F", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xa132F089492CcE5f1D79483a9e4552f37266ed01", + "enforceOutOfOrder": false, + "version": "1.6.0" + } + }, "solana-mainnet": { "offRamp": { "address": "0xb0B4b5847E35033766d5B49CD9C0fC40F459321F", @@ -1068,6 +1125,20 @@ } } }, + "Memento": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, "MYST": { "rateLimiterConfig": { "in": { @@ -1166,6 +1237,20 @@ } } }, + "wstLINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "xSolvBTC": { "rateLimiterConfig": { "in": { @@ -1248,6 +1333,20 @@ "version": "1.6.0" }, "supportedTokens": { + "avBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "avETH": { "rateLimiterConfig": { "in": { @@ -1276,6 +1375,34 @@ } } }, + "avUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avUSDx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "savBTC": { "rateLimiterConfig": { "in": { @@ -1518,6 +1645,20 @@ "version": "1.5.0" }, "supportedTokens": { + "avBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "avETH": { "rateLimiterConfig": { "in": { @@ -1546,6 +1687,34 @@ } } }, + "avUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avUSDx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "BETS": { "rateLimiterConfig": { "in": { @@ -1675,14 +1844,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "250000000000000000000000", + "capacity": "1100000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "12731481000000000" }, "out": { - "capacity": "250000000000000000000000", + "capacity": "1000000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "11574000000000000" } } }, @@ -1982,14 +2151,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "250000000000000000000000", + "capacity": "1100000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "12731481000000000" }, "out": { - "capacity": "250000000000000000000000", + "capacity": "1000000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "11574000000000000" } } }, @@ -2361,6 +2530,33 @@ } } }, + "stable-mainnet": { + "offRamp": { + "address": "0xe72d25aDd538E8ef9CeF85622eA8912a6CB98Be6", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x02A4D69cFfeC00Fbf7F3B60c93e3529Dfc58894d", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, "wemix-mainnet": { "offRamp": { "address": "0xFA5CF1bBFe0Ba5c01e60513EF8960945A99B78A4", @@ -3672,9 +3868,9 @@ "rate": "0" }, "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" + "capacity": "0", + "isEnabled": false, + "rate": "0" } } }, @@ -5482,6 +5678,17 @@ } } }, + "kaia-mainnet": { + "offRamp": { + "address": "0xCEC63FD347d053A335B51b68cDeDd08F8563Ab8E", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x77c70012Dc201E89c9E7597D58cD78a73f58dCc3", + "enforceOutOfOrder": false, + "version": "1.5.0" + } + }, "mainnet": { "offRamp": { "address": "0xF616733641D420207b8F30db9C4cE39684768991", @@ -5745,6 +5952,20 @@ } } }, + "JCT": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -6702,6 +6923,20 @@ } } }, + "KNET": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "MEW": { "rateLimiterConfig": { "in": { @@ -6912,6 +7147,33 @@ } } }, + "stable-mainnet": { + "offRamp": { + "address": "0xA27056438FfA1f286AB197488808692F0db93F8B", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, "tac-mainnet": { "offRamp": { "address": "0xA27056438FfA1f286AB197488808692F0db93F8B", @@ -7083,6 +7345,17 @@ "version": "1.5.0" } }, + "kaia-mainnet": { + "offRamp": { + "address": "0x0CAb90fdE075F29341df7A7FB91b792e8Beea676", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x130E86D0eF4368aF31763925e89eE53d3bd7B1C6", + "enforceOutOfOrder": false, + "version": "1.5.0" + } + }, "mainnet": { "offRamp": { "address": "0x1B12D218280DD1767304A00070101a91f7A61470", @@ -7470,6 +7743,22 @@ "address": "0x76a443768A5e3B8d1AED0105FC250877841Deb40", "enforceOutOfOrder": false, "version": "1.6.0" + }, + "supportedTokens": { + "W0G": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } } }, "apechain-mainnet": { @@ -8572,6 +8861,20 @@ } } }, + "W0G": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -8642,6 +8945,20 @@ } } }, + "wstLINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "wUSDx": { "rateLimiterConfig": { "in": { @@ -9300,6 +9617,17 @@ "version": "1.6.0" } }, + "kaia-mainnet": { + "offRamp": { + "address": "0xC1657856cfcb4ecC99Ae263f80550F06D1Ece3f9", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x1Fe0f6bd28dc2b342D79D95BD7A3b4dc6a3Bf1E4", + "enforceOutOfOrder": false, + "version": "1.5.0" + } + }, "mainnet": { "offRamp": { "address": "0x91e46cc5590A4B9182e47f40006140A7077Dec31", @@ -10081,6 +10409,20 @@ } } }, + "W0G": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "WECO": { "rateLimiterConfig": { "in": { @@ -10822,6 +11164,17 @@ } } }, + "stable-mainnet": { + "offRamp": { + "address": "0xee85aEfb15b9489563A6a29891ebe0750AA1A7Ae", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x76a443768A5e3B8d1AED0105FC250877841Deb40", + "enforceOutOfOrder": false, + "version": "1.6.0" + } + }, "wemix-mainnet": { "offRamp": { "address": "0x893c14bA328A49336a188F972f997C0d7286B8E4", @@ -10887,6 +11240,22 @@ "address": "0xee85aEfb15b9489563A6a29891ebe0750AA1A7Ae", "enforceOutOfOrder": false, "version": "1.6.0" + }, + "supportedTokens": { + "W0G": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } } }, "apechain-mainnet": { @@ -11036,6 +11405,20 @@ } } }, + "Memento": { + "rateLimiterConfig": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, "MYST": { "rateLimiterConfig": { "in": { @@ -11134,6 +11517,20 @@ } } }, + "wstLINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "xSolvBTC": { "rateLimiterConfig": { "in": { @@ -12075,6 +12472,20 @@ } } }, + "W0G": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -12145,6 +12556,20 @@ } } }, + "wstLINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "wUSDx": { "rateLimiterConfig": { "in": { @@ -12841,6 +13266,17 @@ "version": "1.6.0" } }, + "kaia-mainnet": { + "offRamp": { + "address": "0xD4736362efd058b0d48359bAD2034E945A5a907C", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x31389D2162B5829EE73ecf5F00299d95534eAC52", + "enforceOutOfOrder": false, + "version": "1.5.0" + } + }, "mainnet": { "offRamp": { "address": "0xCA04169671A81E4fB8768cfaD46c347ae65371F1", @@ -13289,14 +13725,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "250000000000000000000000", + "capacity": "55000000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "636574074000000000" }, "out": { - "capacity": "250000000000000000000000", + "capacity": "50000000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "578703704000000000" } } }, @@ -13734,6 +14170,20 @@ } } }, + "W0G": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -13790,6 +14240,20 @@ } } }, + "wstLINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "wUSDx": { "rateLimiterConfig": { "in": { @@ -14030,14 +14494,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "250000000000000000000000", + "capacity": "1100000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "12731481000000000" }, "out": { - "capacity": "250000000000000000000000", + "capacity": "1000000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "11574000000000000" } } }, @@ -14125,6 +14589,20 @@ } } }, + "wstLINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "xGold": { "rateLimiterConfig": { "in": { @@ -14635,6 +15113,20 @@ } } }, + "pippin": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "USDC": { "rateLimiterConfig": { "in": { @@ -14831,6 +15323,33 @@ } } }, + "stable-mainnet": { + "offRamp": { + "address": "0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xee85aEfb15b9489563A6a29891ebe0750AA1A7Ae", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, "wemix-mainnet": { "offRamp": { "address": "0x9001D632834FAf4c6ce717c5CcAd7e0c4b0803c0", @@ -14868,6 +15387,17 @@ } } } + }, + "xdc-mainnet": { + "offRamp": { + "address": "0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xee85aEfb15b9489563A6a29891ebe0750AA1A7Ae", + "enforceOutOfOrder": false, + "version": "1.6.0" + } } }, "ethereum-mainnet-blast-1": { @@ -15686,6 +16216,33 @@ } } }, + "monad-mainnet": { + "offRamp": { + "address": "0x77FDbd20ED582794b1d9F1a8a94e4a60494D677e", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x530Ae314EC3fA038bd9A215095E37295ec76162a", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "wstETH": { + "rateLimiterConfig": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + } + } + }, "plasma-mainnet": { "offRamp": { "address": "0x77FDbd20ED582794b1d9F1a8a94e4a60494D677e", @@ -15857,6 +16414,20 @@ "version": "1.6.0" }, "supportedTokens": { + "avBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "avETH": { "rateLimiterConfig": { "in": { @@ -15885,6 +16456,34 @@ } } }, + "avUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avUSDx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "savBTC": { "rateLimiterConfig": { "in": { @@ -16375,6 +16974,20 @@ } } }, + "avBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "avETH": { "rateLimiterConfig": { "in": { @@ -16403,6 +17016,34 @@ } } }, + "avUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avUSDx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "BONE": { "rateLimiterConfig": { "in": { @@ -16768,6 +17409,20 @@ } } }, + "syrupUSDT": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "uniBTC": { "rateLimiterConfig": { "in": { @@ -16781,6 +17436,20 @@ "rate": "11574" } } + }, + "USD1": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } } @@ -19815,6 +20484,17 @@ "version": "1.6.0" } }, + "solana-mainnet": { + "offRamp": { + "address": "0xa132F089492CcE5f1D79483a9e4552f37266ed01", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xdd8aF6046349EDFD40123E0b616286cEC08010ed", + "enforceOutOfOrder": true, + "version": "1.6.0" + } + }, "tac-mainnet": { "offRamp": { "address": "0xa132F089492CcE5f1D79483a9e4552f37266ed01", @@ -20138,7 +20818,91 @@ } } }, + "jovay-mainnet": { + "mainnet": { + "offRamp": { + "address": "0x59d32e5Fa8EeD1Fd1510f7E583a2b6e6142DD49F", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x9b04018b5285FF16F3967Af108Bdc72423d547cC", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "offRamp": { + "address": "0x59d32e5Fa8EeD1Fd1510f7E583a2b6e6142DD49F", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x9b04018b5285FF16F3967Af108Bdc72423d547cC", + "enforceOutOfOrder": false, + "version": "1.6.0" + } + } + }, "kaia-mainnet": { + "bsc-mainnet": { + "offRamp": { + "address": "0x55b2d9272511Efe642fA3Fd5Bc0F5aAE21852f56", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x014353cCf0C2932F3Fee5A65fa92368b3BFD36ed", + "enforceOutOfOrder": false, + "version": "1.5.0" + } + }, + "celo-mainnet": { + "offRamp": { + "address": "0x6A849EDe87fd30B89ca88c02ec4705A78Ae46584", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x1D1F8987e77bfe15B0803C6c1667f04E003F8771", + "enforceOutOfOrder": false, + "version": "1.5.0" + } + }, + "ethereum-mainnet-arbitrum-1": { + "offRamp": { + "address": "0x07a0E5E6782B60aD2b0Be9ab6ca44670526Fe217", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x92f05d54E4500f432F26F52aB30F87B6b39F9e26", + "enforceOutOfOrder": false, + "version": "1.5.0" + } + }, + "ethereum-mainnet-base-1": { + "offRamp": { + "address": "0x48C28947b4b4b3231304e1F0D1c96e2bc8de41cd", + "version": "1.5.0" + }, + "onRamp": { + "address": "0xDdf18F563455001791fC3E0a512B417431672a47", + "enforceOutOfOrder": false, + "version": "1.5.0" + } + }, "mainnet": { "offRamp": { "address": "0x59a65c7A78A0757b6e27905f9C0e21831b25df51", @@ -20247,6 +21011,20 @@ } } }, + "W0G": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "wstETH": { "rateLimiterConfig": { "in": { @@ -20406,6 +21184,20 @@ "version": "1.5.0" }, "supportedTokens": { + "avBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "avETH": { "rateLimiterConfig": { "in": { @@ -20434,6 +21226,34 @@ } } }, + "avUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avUSDx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "BETS": { "rateLimiterConfig": { "in": { @@ -20563,14 +21383,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "250000000000000000000000", + "capacity": "1100000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "12731481000000000" }, "out": { - "capacity": "250000000000000000000000", + "capacity": "1000000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "11574000000000000" } } }, @@ -21173,9 +21993,9 @@ "uniBTC": { "rateLimiterConfig": { "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" + "capacity": "0", + "isEnabled": false, + "rate": "0" }, "out": { "capacity": "200000000", @@ -21567,6 +22387,20 @@ } } }, + "JCT": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -23122,6 +23956,20 @@ } } }, + "W0G": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "WECO": { "rateLimiterConfig": { "in": { @@ -23796,14 +24644,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "250000000000000000000000", + "capacity": "55000000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "636574074000000000" }, "out": { - "capacity": "250000000000000000000000", + "capacity": "50000000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "578703704000000000" } } }, @@ -24241,6 +25089,20 @@ } } }, + "W0G": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -24297,6 +25159,20 @@ } } }, + "wstLINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "wUSDx": { "rateLimiterConfig": { "in": { @@ -24657,6 +25533,20 @@ } } }, + "avBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "avETH": { "rateLimiterConfig": { "in": { @@ -24685,6 +25575,34 @@ } } }, + "avUSD": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avUSDx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "BONE": { "rateLimiterConfig": { "in": { @@ -24936,6 +25854,20 @@ } } }, + "syrupUSDT": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "uniBTC": { "rateLimiterConfig": { "in": { @@ -24949,6 +25881,20 @@ "rate": "11574" } } + }, + "USD1": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } }, @@ -26076,6 +27022,33 @@ } } }, + "jovay-mainnet": { + "offRamp": { + "address": "0x26d3681DfC9E4c8C79cfbf461adec8A21d5d73C5", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x913814782144864e523C3FdB78E3ca25D2c2aeCa", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, "kaia-mainnet": { "offRamp": { "address": "0x4676537819a87E9D515D654f8bedf45A744cF214", @@ -26251,14 +27224,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "250000000000000000000000", + "capacity": "1100000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "12731481000000000" }, "out": { - "capacity": "250000000000000000000000", + "capacity": "1000000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "11574000000000000" } } }, @@ -26573,6 +27546,20 @@ } } }, + "SolvBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000000000000", + "isEnabled": true, + "rate": "57870000000000" + }, + "out": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "347220000000000" + } + } + }, "USD1": { "rateLimiterConfig": { "in": { @@ -26600,6 +27587,61 @@ "rate": "23148148140000000" } } + }, + "xSolvBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000000000000", + "isEnabled": true, + "rate": "57870000000000" + }, + "out": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "347220000000000" + } + } + } + } + }, + "morph-mainnet": { + "offRamp": { + "address": "0x26d3681DfC9E4c8C79cfbf461adec8A21d5d73C5", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x913814782144864e523C3FdB78E3ca25D2c2aeCa", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "USD1": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } }, @@ -27357,6 +28399,20 @@ } } }, + "PTsUSDE": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "SolvBTC": { "rateLimiterConfig": { "in": { @@ -27399,6 +28455,20 @@ } } }, + "USD1": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "USDC": { "rateLimiterConfig": { "in": { @@ -27805,6 +28875,47 @@ } } }, + "stable-mainnet": { + "offRamp": { + "address": "0x26d3681DfC9E4c8C79cfbf461adec8A21d5d73C5", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x913814782144864e523C3FdB78E3ca25D2c2aeCa", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "LINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, "superseed-mainnet": { "offRamp": { "address": "0x3c5990484D4D7b728Ae875d001E97469284210C1", @@ -28200,14 +29311,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "250000000000000000000000", + "capacity": "1100000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "12731481000000000" }, "out": { - "capacity": "250000000000000000000000", + "capacity": "1000000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "11574000000000000" } } }, @@ -28915,14 +30026,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "250000000000000000000000", + "capacity": "1100000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "12731481000000000" }, "out": { - "capacity": "250000000000000000000000", + "capacity": "1000000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "11574000000000000" } } }, @@ -29010,6 +30121,20 @@ } } }, + "wstLINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "xGold": { "rateLimiterConfig": { "in": { @@ -29315,6 +30440,17 @@ } } }, + "jovay-mainnet": { + "offRamp": { + "address": "0x77FDbd20ED582794b1d9F1a8a94e4a60494D677e", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x530Ae314EC3fA038bd9A215095E37295ec76162a", + "enforceOutOfOrder": false, + "version": "1.6.0" + } + }, "mainnet": { "offRamp": { "address": "0xa06e68a11d5694316Cc819f2FFD02663e3314C7C", @@ -29441,14 +30577,14 @@ "Memento": { "rateLimiterConfig": { "in": { - "capacity": "250000000000000000000000", + "capacity": "1100000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "12731481000000000" }, "out": { - "capacity": "250000000000000000000000", + "capacity": "1000000000000000000000", "isEnabled": true, - "rate": "138880000000000000000" + "rate": "11574000000000000" } } }, @@ -30105,6 +31241,17 @@ } }, "monad-mainnet": { + "0g-mainnet": { + "offRamp": { + "address": "0xdCc981e12Fd132d9172eb03E8373BE68032588e8", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xcDca5D374e46A6DDDab50bD2D9acB8c796eC35C3", + "enforceOutOfOrder": false, + "version": "1.6.0" + } + }, "avalanche-mainnet": { "offRamp": { "address": "0xdCc981e12Fd132d9172eb03E8373BE68032588e8", @@ -30197,6 +31344,33 @@ } } }, + "ethereum-mainnet-ink-1": { + "offRamp": { + "address": "0xdCc981e12Fd132d9172eb03E8373BE68032588e8", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xcDca5D374e46A6DDDab50bD2D9acB8c796eC35C3", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "wstETH": { + "rateLimiterConfig": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + } + } + }, "ethereum-mainnet-optimism-1": { "offRamp": { "address": "0xdCc981e12Fd132d9172eb03E8373BE68032588e8", @@ -30233,6 +31407,20 @@ } } }, + "SolvBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "347220000000000" + }, + "out": { + "capacity": "5000000000000000000", + "isEnabled": true, + "rate": "57870000000000" + } + } + }, "USD1": { "rateLimiterConfig": { "in": { @@ -30247,6 +31435,47 @@ } } }, + "wstETH": { + "rateLimiterConfig": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "xSolvBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "347220000000000" + }, + "out": { + "capacity": "5000000000000000000", + "isEnabled": true, + "rate": "57870000000000" + } + } + } + } + }, + "plasma-mainnet": { + "offRamp": { + "address": "0xdCc981e12Fd132d9172eb03E8373BE68032588e8", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xcDca5D374e46A6DDDab50bD2D9acB8c796eC35C3", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { "wstETH": { "rateLimiterConfig": { "in": { @@ -30329,6 +31558,49 @@ } } }, + "morph-mainnet": { + "mainnet": { + "offRamp": { + "address": "0x76159c2b43ff6F630193e37EC68452169914C1Bb", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x318Ec96df83AccC18B5EAD5D23e0F022F7Eb5503", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "USD1": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, "nexon-mainnet-henesys": { "avalanche-mainnet": { "offRamp": { @@ -30731,6 +32003,33 @@ } } }, + "monad-mainnet": { + "offRamp": { + "address": "0xc2BE2F77562A6676098e8D363B9d8A33Ea009D4e", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x8FE3B17E6B0863aeEA3D38DF063AEa39D4Ab1602", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "wstETH": { + "rateLimiterConfig": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + } + } + }, "solana-mainnet": { "offRamp": { "address": "0xc2BE2F77562A6676098e8D363B9d8A33Ea009D4e", @@ -31233,6 +32532,33 @@ } } } + }, + "stable-mainnet": { + "offRamp": { + "address": "0x02A4D69cFfeC00Fbf7F3B60c93e3529Dfc58894d", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xc23071a8AE83671f37bdA1DaDBC745a9780f632A", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } } }, "ronin-mainnet": { @@ -32247,6 +33573,20 @@ } } }, + "KNET": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "MEW": { "rateLimiterConfig": { "in": { @@ -32511,6 +33851,20 @@ } } }, + "pippin": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "USDC": { "rateLimiterConfig": { "in": { @@ -32596,7 +33950,34 @@ } } }, - "ethereum-mainnet-unichain-1": { + "ethereum-mainnet-unichain-1": { + "offRamp": { + "address": "offqSMQWgQud6WJz694LRzkeN5kMYpCHTpXQr3Rkcjm", + "version": "1.6.0" + }, + "onRamp": { + "address": "Ccip842gzYHhvdDkSyi2YVCoAWPbYJoApMFzSxQroE9C", + "enforceOutOfOrder": true, + "version": "1.6.0" + }, + "supportedTokens": { + "USDC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-worldchain-1": { "offRamp": { "address": "offqSMQWgQud6WJz694LRzkeN5kMYpCHTpXQr3Rkcjm", "version": "1.6.0" @@ -32605,25 +33986,9 @@ "address": "Ccip842gzYHhvdDkSyi2YVCoAWPbYJoApMFzSxQroE9C", "enforceOutOfOrder": true, "version": "1.6.0" - }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } } }, - "ethereum-mainnet-worldchain-1": { + "everclear-mainnet": { "offRamp": { "address": "offqSMQWgQud6WJz694LRzkeN5kMYpCHTpXQr3Rkcjm", "version": "1.6.0" @@ -32784,6 +34149,20 @@ } } }, + "PTsUSDE": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "SolvBTC": { "rateLimiterConfig": { "in": { @@ -32826,6 +34205,20 @@ } } }, + "USD1": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "USDC": { "rateLimiterConfig": { "in": { @@ -34367,6 +35760,33 @@ } } }, + "stable-mainnet": { + "offRamp": { + "address": "0xee85aEfb15b9489563A6a29891ebe0750AA1A7Ae", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x76a443768A5e3B8d1AED0105FC250877841Deb40", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, "xdai-mainnet": { "offRamp": { "address": "0x8dc1d6233Cc4cA5C90fF4b068Af4d11ca1F38eA2", @@ -34379,6 +35799,195 @@ } } }, + "stable-mainnet": { + "avalanche-mainnet": { + "offRamp": { + "address": "0x3FD9aD7dC98e98c5E3FAB8d20f8aAEe5f7809933", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xD21D5a4e3fA0eBACC3DaBB5258d9C1F4d24dc894", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "bsc-mainnet": { + "offRamp": { + "address": "0x3FD9aD7dC98e98c5E3FAB8d20f8aAEe5f7809933", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xD21D5a4e3fA0eBACC3DaBB5258d9C1F4d24dc894", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "offRamp": { + "address": "0x3FD9aD7dC98e98c5E3FAB8d20f8aAEe5f7809933", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xD21D5a4e3fA0eBACC3DaBB5258d9C1F4d24dc894", + "enforceOutOfOrder": false, + "version": "1.6.0" + } + }, + "ethereum-mainnet-base-1": { + "offRamp": { + "address": "0x3FD9aD7dC98e98c5E3FAB8d20f8aAEe5f7809933", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xD21D5a4e3fA0eBACC3DaBB5258d9C1F4d24dc894", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "mainnet": { + "offRamp": { + "address": "0x3FD9aD7dC98e98c5E3FAB8d20f8aAEe5f7809933", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xD21D5a4e3fA0eBACC3DaBB5258d9C1F4d24dc894", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "LINK": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polygon-mainnet-katana": { + "offRamp": { + "address": "0x3FD9aD7dC98e98c5E3FAB8d20f8aAEe5f7809933", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xD21D5a4e3fA0eBACC3DaBB5258d9C1F4d24dc894", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "sonic-mainnet": { + "offRamp": { + "address": "0x3FD9aD7dC98e98c5E3FAB8d20f8aAEe5f7809933", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xD21D5a4e3fA0eBACC3DaBB5258d9C1F4d24dc894", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + } + }, "superseed-mainnet": { "mainnet": { "offRamp": { @@ -35072,6 +36681,17 @@ } }, "xdc-mainnet": { + "ethereum-mainnet-base-1": { + "offRamp": { + "address": "0xE939C02E92e9E66d1F0D8E4F099E7d3d269a8a11", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x40530f5305d6Fd6912925C5ec2C36453B85d8F5f", + "enforceOutOfOrder": false, + "version": "1.6.0" + } + }, "mainnet": { "offRamp": { "address": "0xE939C02E92e9E66d1F0D8E4F099E7d3d269a8a11", diff --git a/src/config/data/ccip/v1_2_0/mainnet/tokens.json b/src/config/data/ccip/v1_2_0/mainnet/tokens.json index 2ee064ddd20..d44a581e269 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/mainnet/tokens.json @@ -174,6 +174,35 @@ "tokenAddress": "0x594DaaD7D77592a2b97b725A7AD59D7E188b5bFa" } }, + "avBTC": { + "avalanche-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "avBTC", + "poolAddress": "0x5684B0455837d41e47260a31bD954bE72C935E32", + "poolType": "lockRelease", + "symbol": "avBTC", + "tokenAddress": "0xfd2c2A98009d0cBed715882036e43d26C4289053" + }, + "ethereum-mainnet-linea-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "avBTC", + "poolAddress": "0xCE7Eb84463675C6dD219A6A8939Cc36F650808c6", + "poolType": "burnMint", + "symbol": "avBTC", + "tokenAddress": "0x2D4C0d9742cd0F11b3627f103A3dDd9C8AE341b6" + }, + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "avBTC", + "poolAddress": "0x63bd4CC0A4F72cb3a6181604d03633671e5A93d2", + "poolType": "burnMint", + "symbol": "avBTC", + "tokenAddress": "0x84d797c33708E5bDbfdB73481530DCf8c03eC17E" + } + }, "avETH": { "avalanche-mainnet": { "allowListEnabled": false, @@ -232,6 +261,64 @@ "tokenAddress": "0x2E8b7190eE84E7AC757Ddff42Ba14d4EAe24B865" } }, + "avUSD": { + "avalanche-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "avUSD", + "poolAddress": "0xD4fe4186c4A7b089eb849d57b43C5F6a3d3BcCbe", + "poolType": "lockRelease", + "symbol": "avUSD", + "tokenAddress": "0x24dE8771bC5DdB3362Db529Fc3358F2df3A0E346" + }, + "ethereum-mainnet-linea-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "avUSD", + "poolAddress": "0x9F299fbDbB581E55217c15b8439588e16b95018f", + "poolType": "burnMint", + "symbol": "avUSD", + "tokenAddress": "0x37c44fc08e403Efc0946C0623CB1164A52CE1576" + }, + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "avUSD", + "poolAddress": "0x81B72171642FaB457aa815C0B8412A22B63A6aF8", + "poolType": "burnMint", + "symbol": "avUSD", + "tokenAddress": "0xf4c13D631450De6B12a19829E37c8e2826891dC4" + } + }, + "avUSDx": { + "avalanche-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "avUSD MAX", + "poolAddress": "0x89541CE9940DFA3add6D6dc2e20E3F743075DFF5", + "poolType": "lockRelease", + "symbol": "avUSDx", + "tokenAddress": "0xDd1cDFA52E7D8474d434cd016fd346701db6B3B9" + }, + "ethereum-mainnet-linea-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "avUSD MAX", + "poolAddress": "0x2c12313da5465D6da6E0A3574249A30839Fe8766", + "poolType": "burnMint", + "symbol": "avUSDx", + "tokenAddress": "0xC37d32b09B0bB0aa9B2A70372d7Bc1216CB7D903" + }, + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "avUSD MAX", + "poolAddress": "0xD08f814614Fb21bdcdd3Aa92123e2F954F9864b7", + "poolType": "burnMint", + "symbol": "avUSDx", + "tokenAddress": "0xF424a63E4aC41b1faC5074Ccc24c7E5048fcA25D" + } + }, "AXS": { "mainnet": { "allowListEnabled": false, @@ -1961,6 +2048,26 @@ "tokenAddress": "0x7420B4b9a0110cdC71fB720908340C03F9Bc03EC" } }, + "JCT": { + "bsc-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "JANCTION", + "poolAddress": "0xdA1B1B3d3C97974B272E28f70F25Ab7c290e8357", + "poolType": "burnMint", + "symbol": "JCT", + "tokenAddress": "0xeA37A8DE1de2d9D10772EEB569e28Bfa5Cb17707" + }, + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "JANCTION", + "poolAddress": "0x58e53cad56180743aCE00349Ef3E1BFE4EfF5732", + "poolType": "burnMint", + "symbol": "JCT", + "tokenAddress": "0xC477B6dfd26EC2460b3b92de18837Fd476Ea7549" + } + }, "kHYPE": { "hyperliquid-mainnet": { "allowListEnabled": false, @@ -1981,6 +2088,26 @@ "tokenAddress": "0x319053B625e598994Dd1179948771a4C2f66b873" } }, + "KNET": { + "bsc-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Kingnet AI", + "poolAddress": "0x02E5F79eFD3c5e0306fD1127787EA672634AACF1", + "poolType": "burnMint", + "symbol": "KNET", + "tokenAddress": "0x8b24BF9fE8BB1D4D9deA81Eebc9Fed6F0Fc67a46" + }, + "solana-mainnet": { + "allowListEnabled": false, + "decimals": 9, + "name": "Kingnet AI", + "poolAddress": "5skyDWAPgiNe7ttGoEEdn4Z3dHxvkF4vi3wGdebQ76cR", + "poolType": "lockRelease", + "symbol": "KNET", + "tokenAddress": "CfVs3waH2Z9TM397qSkaipTDhA9wWgtt8UchZKfwkYiu" + } + }, "LAND": { "bsc-mainnet": { "allowListEnabled": false, @@ -2101,6 +2228,15 @@ "symbol": "LBTC", "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" }, + "stable-mainnet": { + "allowListEnabled": false, + "decimals": 8, + "name": "Lombard Staked Bitcoin", + "poolAddress": "0xD7F069e67345ED91AC699e7EcFDc211782495888", + "poolType": "burnMint", + "symbol": "LBTC", + "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" + }, "tac-mainnet": { "allowListEnabled": false, "decimals": 8, @@ -2732,6 +2868,15 @@ "symbol": "LINK", "tokenAddress": "0x1AC2EE68b8d038C982C1E1f73F596927dd70De59" }, + "jovay-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "ChainLink Token", + "poolAddress": "0x6E6CBEF068fe546ceA52af587AEd8A2EfDD846bD", + "poolType": "burnMint", + "symbol": "LINK", + "tokenAddress": "0x76a443768A5e3B8d1AED0105FC250877841Deb40" + }, "kaia-mainnet": { "allowListEnabled": false, "decimals": 0, @@ -2813,6 +2958,15 @@ "symbol": "LINK", "tokenAddress": "0x76f257B1DDA5cC71bee4eF637Fbdde4C801310A9" }, + "morph-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "ChainLink Token", + "poolAddress": "0x2E64625FF3b3c9d51A022B28d96935d920a2993A", + "poolType": "burnMint", + "symbol": "LINK", + "tokenAddress": "0x76a443768A5e3B8d1AED0105FC250877841Deb40" + }, "nexon-mainnet-henesys": { "allowListEnabled": false, "decimals": 18, @@ -2915,6 +3069,15 @@ "symbol": "LINK", "tokenAddress": "0x71052BAe71C25C78E37fD12E5ff1101A71d9018F" }, + "stable-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "ChainLink Token", + "poolAddress": "0x0dC94D4E45031f87b7df9e9B749dBB88f67Bcd78", + "poolType": "burnMint", + "symbol": "LINK", + "tokenAddress": "0x985FB0821Eef0056ec26DD8b33dC61b9415B7F4b" + }, "superseed-mainnet": { "allowListEnabled": false, "decimals": 18, @@ -3779,6 +3942,26 @@ "tokenAddress": "0xb4562fDEFD5eD58f7705CE9386D54EE9B53831d1" } }, + "pippin": { + "ethereum-mainnet-base-1": { + "allowListEnabled": false, + "decimals": 6, + "name": "Pippin", + "poolAddress": "0x5Efb8F091d49ce1e138353c75d4AAd07a98D79A5", + "poolType": "burnMint", + "symbol": "pippin", + "tokenAddress": "0x3945Eaaf908d6c743090D4ca1748c057d8A5634a" + }, + "solana-mainnet": { + "allowListEnabled": false, + "decimals": 6, + "name": "Pippin", + "poolAddress": "GFZDNxdQFFoPok1ZX1uwzbbfFNB46kJGNnAa1rd7LUVF", + "poolType": "lockRelease", + "symbol": "pippin", + "tokenAddress": "Dfh5DzRgSvvCFDoYc2ciTkMrbDfRKybA4SoFbPmApump" + } + }, "PIXEL": { "mainnet": { "allowListEnabled": false, @@ -3799,6 +3982,26 @@ "tokenAddress": "0x7EAe20d11Ef8c779433Eb24503dEf900b9d28ad7" } }, + "PTsUSDE": { + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "PT Ethena sUSDE 5FEB2026", + "poolAddress": "0x04790065826123136eB50d9dF1276f98376a6e91", + "poolType": "lockRelease", + "symbol": "PT-sUSDE-5FEB2026", + "tokenAddress": "0xE8483517077afa11A9B07f849cee2552f040d7b2" + }, + "solana-mainnet": { + "allowListEnabled": false, + "decimals": 9, + "name": "ETH PT sUSDe (USDe) 2026Feb", + "poolAddress": "R78LZoZJCfG5dTxPT9bAc6DCgvYQ32Gp8hVrkbjGiF1", + "poolType": "burnMint", + "symbol": "PTsUSDE", + "tokenAddress": "PTSg1sXMujX5bgTM88C2PMksHG5w2bqvXJrG9uUdzpA" + } + }, "pufETH": { "berachain-mainnet": { "allowListEnabled": false, @@ -4858,6 +5061,15 @@ "symbol": "SolvBTC", "tokenAddress": "0xaE4EFbc7736f963982aACb17EFA37fCBAb924cB3" }, + "monad-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Solv BTC", + "poolAddress": "0x4bc35816c1D0B911940894ccd5121eC64Ffd69eb", + "poolType": "burnMint", + "symbol": "SolvBTC", + "tokenAddress": "0xaE4EFbc7736f963982aACb17EFA37fCBAb924cB3" + }, "sei-mainnet": { "allowListEnabled": false, "decimals": 18, @@ -5300,6 +5512,15 @@ } }, "syrupUSDT": { + "ethereum-mainnet-mantle-1": { + "allowListEnabled": false, + "decimals": 6, + "name": "Syrup USDT", + "poolAddress": "0x0aA145a62153190B8f0D3cA00c441e451529f755", + "poolType": "burnMint", + "symbol": "syrupUSDT", + "tokenAddress": "0x051665f2455116e929b9972c36d23070F5054Ce0" + }, "mainnet": { "allowListEnabled": false, "decimals": 6, @@ -5904,6 +6125,15 @@ "symbol": "USD1", "tokenAddress": "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d" }, + "ethereum-mainnet-mantle-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "World Liberty Financial USD", + "poolAddress": "0xf58A2e303e519f6A1b772137995871967e30391a", + "poolType": "burnMint", + "symbol": "USD1", + "tokenAddress": "0x111111d2bf19e43C34263401e0CAd979eD1cdb61" + }, "mainnet": { "allowListEnabled": false, "decimals": 18, @@ -5922,6 +6152,15 @@ "symbol": "USD1", "tokenAddress": "0x111111d2bf19e43C34263401e0CAd979eD1cdb61" }, + "morph-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "World Liberty Financial USD", + "poolAddress": "0x258Fc917b8de98b4aA0d38776E95dcce9e7EC8aC", + "poolType": "burnMint", + "symbol": "USD1", + "tokenAddress": "0x111111d2bf19e43C34263401e0CAd979eD1cdb61" + }, "plume-mainnet": { "allowListEnabled": false, "decimals": 18, @@ -5930,6 +6169,15 @@ "poolType": "burnMint", "symbol": "USD1", "tokenAddress": "0x111111d2bf19e43C34263401e0CAd979eD1cdb61" + }, + "solana-mainnet": { + "allowListEnabled": false, + "decimals": 6, + "name": "World Liberty Financial USD", + "poolAddress": "B4PB9qWUW6R18Gbpk5Km8mJ2GoQgCcVpgdqhU7C2n8fh", + "poolType": "burnMint", + "symbol": "USD1", + "tokenAddress": "USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB" } }, "USDC": { @@ -6501,9 +6749,37 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped 0G", - "poolType": "feeTokenOnly", + "poolAddress": "0xF6839B313671daE8c1B6AbCaB4eBd0bF41259187", + "poolType": "lockRelease", "symbol": "W0G", "tokenAddress": "0x1Cd0690fF9a693f5EF2dD976660a8dAFc81A109c" + }, + "ethereum-mainnet-arbitrum-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped 0G", + "poolAddress": "0x22fF19A7307eee6bd6d38C569f8bcb40fD071Ff4", + "poolType": "burnMint", + "symbol": "W0G", + "tokenAddress": "0x418176040912d11d9445dd4AEc322772A42f2a59" + }, + "ethereum-mainnet-base-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped 0G", + "poolAddress": "0x049DF7Ed53037C58BCAB45510c153D5CD5564830", + "poolType": "burnMint", + "symbol": "W0G", + "tokenAddress": "0x23cd099eB438CcA50349EE2BC809196b1ae00861" + }, + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped 0G", + "poolAddress": "0xE25a97E9e2f1Eeee81d4a7986A018AC3Ae8D857b", + "poolType": "burnMint", + "symbol": "W0G", + "tokenAddress": "0x4C1Dab3Be86347977F3DfC4b9688224ef2272939" } }, "WAB": { @@ -6883,6 +7159,14 @@ "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, + "jovay-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped Ether", + "poolType": "feeTokenOnly", + "symbol": "WETH", + "tokenAddress": "0xeA29Cbb2808CF848C185E4405Bb002F53f92a241" + }, "lisk-mainnet": { "allowListEnabled": false, "decimals": 18, @@ -6932,6 +7216,14 @@ "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, + "morph-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped Ether", + "poolType": "feeTokenOnly", + "symbol": "WETH", + "tokenAddress": "0x5300000000000000000000000000000000000011" + }, "polygon-mainnet-katana": { "allowListEnabled": false, "decimals": 18, @@ -7023,6 +7315,16 @@ "tokenAddress": "0x6bDc36E20D267Ff0dd6097799f82e78907105e2F" } }, + "WgUSDT": { + "stable-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped gUSDT", + "poolType": "feeTokenOnly", + "symbol": "WgUSDT", + "tokenAddress": "0x817997Ca8394E26CCE3dE3A076a4889b27DbF9dE" + } + }, "WHBAR": { "hedera-mainnet": { "allowListEnabled": false, @@ -7538,6 +7840,15 @@ "symbol": "wstLINK", "tokenAddress": "0x3106E2e148525b3DB36795b04691D444c24972fB" }, + "ethereum-mainnet-base-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped stLINK", + "poolAddress": "0xc80088D32830Cdb869eBA08bb25Bb6D7B17467FF", + "poolType": "burnMint", + "symbol": "wstLINK", + "tokenAddress": "0xF2f7901B7bbA5799493B617B06EAd1862F771297" + }, "mainnet": { "allowListEnabled": false, "decimals": 18, @@ -8021,6 +8332,15 @@ "symbol": "xSolvBTC", "tokenAddress": "0xc99F5c922DAE05B6e2ff83463ce705eF7C91F077" }, + "monad-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "xSolvBTC", + "poolAddress": "0x8A76fe7fA6da27f85a626c5C53730B38D13603d7", + "poolType": "burnMint", + "symbol": "xSolvBTC", + "tokenAddress": "0xc99F5c922DAE05B6e2ff83463ce705eF7C91F077" + }, "sei-mainnet": { "allowListEnabled": false, "decimals": 18, diff --git a/src/config/data/ccip/v1_2_0/testnet/chains.json b/src/config/data/ccip/v1_2_0/testnet/chains.json index f18f979bf60..3d718a9b457 100644 --- a/src/config/data/ccip/v1_2_0/testnet/chains.json +++ b/src/config/data/ccip/v1_2_0/testnet/chains.json @@ -1078,6 +1078,26 @@ "version": "1.5.1" } }, + "jovay-testnet": { + "armProxy": { + "address": "0x5Dc49Ec54B92F7D493bC8126c0730DA74605cc00", + "version": "1.0.0" + }, + "chainSelector": "945045181441419236", + "feeTokens": ["LINK", "WETH"], + "registryModule": { + "address": "0xd1CBe8dF481C7a78AaaAfB0466814d13d93bd9b7", + "version": "1.6.0" + }, + "router": { + "address": "0x2016AA303B331bd739Fd072998e579a3052500A6", + "version": "1.2.0" + }, + "tokenAdminRegistry": { + "address": "0xaCc1C3b214CA255918C9Da66Db3bcc933d57188B", + "version": "1.5.0" + } + }, "kaia-testnet-kairos": { "armProxy": { "address": "0x0a57d85E0CE3AafB22079A4c18B4Eb6D3B88BA46", diff --git a/src/config/data/ccip/v1_2_0/testnet/lanes.json b/src/config/data/ccip/v1_2_0/testnet/lanes.json index 03d33e90789..abfe3e32fa6 100644 --- a/src/config/data/ccip/v1_2_0/testnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/testnet/lanes.json @@ -2393,6 +2393,20 @@ "rate": "167000000000000000000" } } + }, + "syrupUSDT": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } }, @@ -2780,6 +2794,33 @@ "version": "1.5.0" } }, + "jovay-testnet": { + "offRamp": { + "address": "0x0820f975ce90EE5c508657F0C58b71D1fcc85cE0", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x23a5084Fa78104F3DF11C63Ae59fcac4f6AD9DeE", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "CCIP-BnM": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, "kaia-testnet-kairos": { "offRamp": { "address": "0x2be11937018B7C9959430EBf8AD784e1aebe1981", @@ -4765,6 +4806,20 @@ "rate": "167000000000000000000" } } + }, + "syrupUSDT": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } } @@ -5755,6 +5810,46 @@ } } }, + "jovay-testnet": { + "ethereum-testnet-sepolia": { + "offRamp": { + "address": "0xFA5F1e092dE0907EE761fad89184B8E8AcC9089D", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x1f5EF38782b6B7C6DE489406b8EE504e46F05a18", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "CCIP-BnM": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polygon-testnet-amoy": { + "offRamp": { + "address": "0xFA5F1e092dE0907EE761fad89184B8E8AcC9089D", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x1f5EF38782b6B7C6DE489406b8EE504e46F05a18", + "enforceOutOfOrder": false, + "version": "1.6.0" + } + } + }, "kaia-testnet-kairos": { "ethereum-testnet-sepolia": { "offRamp": { @@ -6398,6 +6493,17 @@ } } }, + "jovay-testnet": { + "offRamp": { + "address": "0x056A1FAb28562750a54063E37DDc66d506e320d2", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xF4EbCC2c077d3939434C7Ab0572660c5A45e4df5", + "enforceOutOfOrder": false, + "version": "1.6.0" + } + }, "memento-testnet": { "offRamp": { "address": "0x056A1FAb28562750a54063E37DDc66d506e320d2", diff --git a/src/config/data/ccip/v1_2_0/testnet/tokens.json b/src/config/data/ccip/v1_2_0/testnet/tokens.json index 93eb74fcf63..20fcbbe3ba4 100644 --- a/src/config/data/ccip/v1_2_0/testnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/testnet/tokens.json @@ -262,6 +262,15 @@ "symbol": "CCIP-BnM", "tokenAddress": "0x414dbe1d58dd9BA7C84f7Fc0e4f82bc858675d37" }, + "jovay-testnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "CCIP-BnM", + "poolAddress": "0x2bF249E1796D5F3a293dFB0B084f52bF5D3f35CB", + "poolType": "burnMint", + "symbol": "CCIP-BnM", + "tokenAddress": "0xB45B9eb94F25683B47e5AFb0f74A05a58be86311" + }, "memento-testnet": { "allowListEnabled": false, "decimals": 18, @@ -994,6 +1003,14 @@ "symbol": "LINK", "tokenAddress": "0x7311DED199CC28D80E58e81e8589aa160199FCD2" }, + "jovay-testnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "ChainLink Token", + "poolType": "feeTokenOnly", + "symbol": "LINK", + "tokenAddress": "0xd3e461C55676B10634a5F81b747c324B85686Dd1" + }, "kaia-testnet-kairos": { "allowListEnabled": false, "decimals": 18, @@ -1261,6 +1278,15 @@ "symbol": "syrupUSDT", "tokenAddress": "0x7679CBe9aE66298114AC6dAC73487B63ac023c0b" }, + "ethereum-testnet-sepolia-mantle-1": { + "allowListEnabled": false, + "decimals": 6, + "name": "Syrup USDT", + "poolAddress": "0x4F213c8374c4F223eB85d8770Fc76eAd5163FC23", + "poolType": "burnMint", + "symbol": "syrupUSDT", + "tokenAddress": "0x1495CB0831108160405c8F453E1B8e155DbFbEdC" + }, "plasma-testnet": { "allowListEnabled": false, "decimals": 6, @@ -1654,6 +1680,14 @@ "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, + "jovay-testnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped Ether", + "poolType": "feeTokenOnly", + "symbol": "WETH", + "tokenAddress": "0xFe06d41BA962A74209845f938c387b363a931505" + }, "megaeth-testnet": { "allowListEnabled": false, "decimals": 18, diff --git a/src/config/data/chain-to-technology.json b/src/config/data/chain-to-technology.json index 9ca8dd73405..e85e567b058 100644 --- a/src/config/data/chain-to-technology.json +++ b/src/config/data/chain-to-technology.json @@ -157,5 +157,10 @@ "AB_CHAIN_MAINNET": "AB_CHAIN", "MONAD_MAINNET": "MONAD", "NEXON_HENESYS_MAINNET": "HENESYS", - "PHAROS_ATLANTIC_TESTNET": "PHAROS" + "PHAROS_ATLANTIC_TESTNET": "PHAROS", + "MORPH_MAINNET": "MORPH", + "MORPH_TESTNET": "MORPH", + "JOVAY_MAINNET": "JOVAY", + "JOVAY_TESTNET": "JOVAY", + "STABLE_MAINNET": "STABLE" } diff --git a/src/config/data/chains.json b/src/config/data/chains.json index 20b7de2156b..b2efde2a9e0 100644 --- a/src/config/data/chains.json +++ b/src/config/data/chains.json @@ -2514,5 +2514,86 @@ } } } + }, + "MORPH": { + "title": "Morph", + "icon": "/assets/chains/morph.svg", + "chainType": "evm", + "chains": { + "MORPH_MAINNET": { + "chainId": 2818, + "title": "Morph", + "explorer": { + "baseUrl": "https://explorer.morphl2.io" + }, + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + } + }, + "MORPH_HOODI_TESTNET": { + "chainId": 2910, + "title": "Morph Hoodi", + "explorer": { + "baseUrl": "https://explorer-hoodi.morphl2.io" + }, + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + } + } + } + }, + "JOVAY": { + "title": "Jovay", + "icon": "/assets/chains/jovay.svg", + "chainType": "evm", + "chains": { + "JOVAY_MAINNET": { + "chainId": 5734951, + "title": "Jovay", + "explorer": { + "baseUrl": "https://explorer.jovay.io/l2" + }, + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + } + }, + "JOVAY_TESTNET": { + "chainId": 2019775, + "title": "Jovay Sepolia Testnet", + "explorer": { + "baseUrl": "https://sepolia-explorer.jovay.io/l2" + }, + "nativeCurrency": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + } + } + } + }, + "STABLE": { + "title": "Stable", + "icon": "/assets/chains/stable.svg", + "chainType": "evm", + "chains": { + "STABLE_MAINNET": { + "chainId": 988, + "title": "Stable", + "explorer": { + "baseUrl": "https://stablescan.xyz/" + }, + "nativeCurrency": { + "name": "gasUSDT", + "symbol": "gUSDT", + "decimals": 18 + } + } + } } } diff --git a/src/config/types.ts b/src/config/types.ts index 006611c42bb..7037e1d9247 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -77,6 +77,9 @@ export type SupportedTechnology = | "AB_CHAIN" | "PHAROS" | "HENESYS" + | "MORPH" + | "JOVAY" + | "STABLE" export type ChainType = "evm" | "solana" | "aptos" @@ -242,6 +245,11 @@ export type SupportedChain = | "MONAD_MAINNET" | "NEXON_HENESYS_MAINNET" | "PHAROS_ATLANTIC_TESTNET" + | "MORPH_MAINNET" + | "MORPH_TESTNET" + | "JOVAY_MAINNET" + | "JOVAY_TESTNET" + | "STABLE_MAINNET" export type ExplorerInfo = { baseUrl: string diff --git a/src/config/web3Providers.ts b/src/config/web3Providers.ts index 4e4aacb95ef..1bf8dbbcda7 100644 --- a/src/config/web3Providers.ts +++ b/src/config/web3Providers.ts @@ -164,6 +164,11 @@ export const chainToProvider: Record<SupportedChain, () => Provider> = { MONAD_MAINNET: () => new JsonRpcProvider("https://rpc3.monad.xyz"), NEXON_HENESYS_MAINNET: () => new JsonRpcProvider("https://henesys-rpc.msu.io/"), PHAROS_ATLANTIC_TESTNET: () => new JsonRpcProvider("https://atlantic.dplabs-internal.com/"), + MORPH_MAINNET: () => new JsonRpcProvider("https://rpc.morphl2.io"), + MORPH_TESTNET: () => new JsonRpcProvider("https://rpc-hoodi.morphl2.io/"), + JOVAY_MAINNET: () => new JsonRpcProvider("https://rpc.jovay.io"), + JOVAY_TESTNET: () => new JsonRpcProvider("https://api.zan.top/public/jovay-testnet"), + STABLE_MAINNET: () => new JsonRpcProvider("https://rpc.stable.xyz"), } export const getRpcUrlForChain = (chain: SupportedChain): string => { diff --git a/src/content/resources/link-token-contracts.mdx b/src/content/resources/link-token-contracts.mdx index 066e6cfeb7b..f6a39f47120 100644 --- a/src/content/resources/link-token-contracts.mdx +++ b/src/content/resources/link-token-contracts.mdx @@ -770,6 +770,18 @@ Testnet Native and LINK is available at [faucets.chain.link/hedera-testnet](http | Symbol | LINK | | Decimals | 18 | +## <img src="/assets/chains/henesys.svg" style="height: 24px; width: auto; margin-right: 8px;" />Henesys + +### Henesys Mainnet + +| Parameter | Value | +| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `68414` | +| Address | <Address contractUrl="https://subnets.avax.network/henesys/address/0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlId="68414_0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlClass="erc-token-address"/> | +| Name | Chainlink Token on Nexon Henesys Mainnet | +| Symbol | LINK | +| Decimals | 18 | + ## <img src="/assets/chains/hyperliquid.svg" style="height: 24px; width: auto; margin-right: 8px;" />HyperEVM ### HyperEVM Mainnet @@ -826,6 +838,28 @@ Testnet Native and LINK is available at [faucets.chain.link/hedera-testnet](http | Symbol | LINK | | Decimals | 18 | +## <img src="/assets/chains/jovay.svg" style="height: 24px; width: auto; margin-right: 8px;" />Jovay + +### Jovay Mainnet + +| Parameter | Value | +| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `5734951` | +| Address | <Address contractUrl="https://explorer.jovay.io/l2/address/0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlId="5734951_0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlClass="erc-token-address"/> | +| Name | Chainlink Token on Jovay Mainnet | +| Symbol | LINK | +| Decimals | 18 | + +### Jovay Sepolia Testnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `2019775` | +| Address | <Address contractUrl="https://sepolia-explorer.jovay.io/l2/address/0xd3e461C55676B10634a5F81b747c324B85686Dd1" urlId="2019775_0xd3e461C55676B10634a5F81b747c324B85686Dd1" urlClass="erc-token-address"/> | +| Name | Chainlink Token on Jovay Sepolia Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## <img src="/assets/chains/kaia.svg" style="height: 24px; width: auto; margin-right: 8px;" />Kaia ### Kaia Mainnet @@ -1213,6 +1247,18 @@ MOVR is used to pay transaction fees on Moonriver Mainnet. | Decimals | 18 | | Network status | [moonscan.freshstatus.io](https://moonscan.freshstatus.io/) | +## <img src="/assets/chains/morph.svg" style="height: 24px; width: auto; margin-right: 8px;" />Morph + +### Morph Mainnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `2818` | +| Address | <Address contractUrl="https://explorer.morphl2.io/address/0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlId="2818_0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlClass="erc-token-address"/> | +| Name | Chainlink Token on Morph Mainnet | +| Symbol | LINK | +| Decimals | 18 | + ## <img src="/assets/chains/neox.svg" style="height: 24px; width: auto; margin-right: 8px;" />Neo X ### Neo X Mainnet @@ -1235,18 +1281,6 @@ MOVR is used to pay transaction fees on Moonriver Mainnet. | Symbol | LINK | | Decimals | 18 | -## <img src="/assets/chains/henesys.svg" style="height: 24px; width: auto; margin-right: 8px;" />Henesys - -### Henesys Mainnet - -| Parameter | Value | -| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Chain ID | `68414` | -| Address | <Address contractUrl="https://subnets.avax.network/henesys/address/0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlId="68414_0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlClass="erc-token-address"/> | -| Name | Chainlink Token on Nexon Henesys Mainnet | -| Symbol | LINK | -| Decimals | 18 | - ## <img src="/assets/chains/opbnb.svg" style="height: 24px; width: auto; margin-right: 8px;" />OPBNB ### OPBNB Mainnet @@ -1660,6 +1694,18 @@ Testnet S is used to pay for transactions on Sonic Blaze testnet. | Symbol | LINK | | Decimals | 18 | +## <img src="/assets/chains/stable.svg" style="height: 24px; width: auto; margin-right: 8px;" />Stable + +### Stable Mainnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `988` | +| Address | <Address contractUrl="https://stablescan.xyz/address/0x985FB0821Eef0056ec26DD8b33dC61b9415B7F4b" urlId="988_0x985FB0821Eef0056ec26DD8b33dC61b9415B7F4b" urlClass="erc-token-address"/> | +| Name | Chainlink Token on Stable Mainnet | +| Symbol | LINK | +| Decimals | 18 | + ## <img src="/assets/chains/starknet.svg" style="height: 24px; width: auto; margin-right: 8px;" />Starknet ### Starknet Mainnet diff --git a/src/features/utils/index.ts b/src/features/utils/index.ts index 95faa271bc8..a707ef0973d 100644 --- a/src/features/utils/index.ts +++ b/src/features/utils/index.ts @@ -514,6 +514,16 @@ export const directoryToSupportedChain = (chainInRdd: string): SupportedChain => return "NEXON_HENESYS_MAINNET" case "pharos-atlantic-testnet": return "PHAROS_ATLANTIC_TESTNET" + case "morph-mainnet": + return "MORPH_MAINNET" + case "morph-testnet": + return "MORPH_TESTNET" + case "jovay-mainnet": + return "JOVAY_MAINNET" + case "jovay-testnet": + return "JOVAY_TESTNET" + case "stable-mainnet": + return "STABLE_MAINNET" default: throw Error(`Chain not found ${chainInRdd}`) } @@ -827,6 +837,16 @@ export const supportedChainToChainInRdd = (supportedChain: SupportedChain): stri return "nexon-mainnet-henesys" case "PHAROS_ATLANTIC_TESTNET": return "pharos-atlantic-testnet" + case "MORPH_MAINNET": + return "morph-mainnet" + case "MORPH_TESTNET": + return "morph-testnet" + case "JOVAY_MAINNET": + return "jovay-mainnet" + case "JOVAY_TESTNET": + return "jovay-testnet" + case "STABLE_MAINNET": + return "stable-mainnet" default: throw Error(`Chain not found ${supportedChain}`) } diff --git a/src/scripts/reference/chains.json b/src/scripts/reference/chains.json index bcec1605b9d..688e67d1d07 100644 --- a/src/scripts/reference/chains.json +++ b/src/scripts/reference/chains.json @@ -351,32 +351,6 @@ "slip44": 1, "explorers": [{ "name": "monadvision", "url": "https://monadvision.com/", "standard": "EIP3091" }] }, - { - "name": "Nexon Henesys Mainnet", - "chain": "nexon", - "icon": "nexon", - "rpc": ["https://henesys-rpc.msu.io/"], - "faucets": [], - "nativeCurrency": { "name": "NXPC", "symbol": "NXPC", "decimals": 18 }, - "infoURL": "https://henesysstudio.com/", - "shortName": "nexon", - "chainId": 68414, - "networkId": 68414, - "explorers": [{ "name": "avax", "url": "https://subnets.avax.network/henesys", "standard": "EIP3091" }] - }, - { - "name": "Pharos Atlantic Testnet", - "chain": "pharos", - "icon": "pharos", - "rpc": ["https://atlantic.dplabs-internal.com/"], - "faucets": [], - "nativeCurrency": { "name": "PHRS", "symbol": "PHRS", "decimals": 18 }, - "infoURL": "https://www.pharos.xyz/", - "shortName": "pharos", - "chainId": 688689, - "networkId": 688689, - "explorers": [{ "name": "pharosscan", "url": "https://atlantic.pharosscan.xyz/", "standard": "EIP3091" }] - }, { "name": "Sonic Mainnet", "chain": "sonic", @@ -1418,6 +1392,54 @@ ], "parent": { "type": "L2", "chain": "eip155-1", "bridges": [{ "url": "https://portal.mainnet.abs.xyz/bridge" }] } }, + { + "name": "Morph", + "title": "Morph Mainnet", + "chain": "ETH", + "rpc": [ + "https://rpc.morphl2.io", + "wss://rpc.morphl2.io:8443", + "https://rpc-quicknode.morphl2.io", + "wss://rpc-quicknode.morphl2.io" + ], + "faucets": [], + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "infoURL": "https://morphl2.io", + "shortName": "morph", + "chainId": 2818, + "networkId": 2818, + "slip44": 1, + "explorers": [{ "name": "Morph Mainnet Explorer", "url": "https://explorer.morphl2.io", "standard": "EIP3091" }], + "parent": { "type": "L2", "chain": "eip155-1", "bridges": [{ "url": "https://bridge.morphl2.io/" }] } + }, + { + "name": "Morph Hoodi", + "chain": "ETH", + "rpc": ["https://rpc-hoodi.morphl2.io/"], + "faucets": [], + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "infoURL": "https://morphl2.io", + "shortName": "morph", + "chainId": 2910, + "networkId": 2910, + "slip44": 1, + "explorers": [ + { "name": "Morph Hoodi Explorer", "url": "https://explorer-hoodi.morphl2.io", "standard": "EIP3091" } + ], + "parent": { "type": "L2", "chain": "eip155-1", "bridges": [{ "url": "https://bridge.morphl2.io/" }] } + }, + { + "name": "Stable Mainnet", + "chain": "ETH", + "rpc": ["https://rpc.stable.xyz"], + "faucets": [], + "nativeCurrency": { "name": "gasUSDT", "symbol": "gUSDT", "decimals": 18 }, + "infoURL": "https://docs.stable.xyz/", + "shortName": "Stable", + "chainId": 988, + "networkId": 988, + "explorers": [{ "name": "Stable Mainnet Explorer", "url": "https://stablescan.xyz/", "standard": "EIP3091" }] + }, { "name": "Botanix Testnet", "chain": "BOTANIX", @@ -2225,6 +2247,19 @@ ], "parent": { "type": "L2", "chain": "eip155-1", "bridges": [{ "url": "https://app.treasure.lol/chain/bridge" }] } }, + { + "name": "Nexon Henesys Mainnet", + "chain": "nexon", + "icon": "nexon", + "rpc": ["https://henesys-rpc.msu.io/"], + "faucets": [], + "nativeCurrency": { "name": "NXPC", "symbol": "NXPC", "decimals": 18 }, + "infoURL": "https://henesysstudio.com/", + "shortName": "nexon", + "chainId": 68414, + "networkId": 68414, + "explorers": [{ "name": "avax", "url": "https://subnets.avax.network/henesys", "standard": "EIP3091" }] + }, { "name": "Amoy", "title": "Polygon Amoy Testnet", @@ -2597,6 +2632,19 @@ "explorers": [{ "name": "Merlin Testnet", "url": "https://testnet-scan.merlinchain.io/", "standard": "none" }], "infoURL": "https://merlinchain.io/" }, + { + "name": "Pharos Atlantic Testnet", + "chain": "pharos", + "icon": "pharos", + "rpc": ["https://atlantic.dplabs-internal.com/"], + "faucets": [], + "nativeCurrency": { "name": "PHRS", "symbol": "PHRS", "decimals": 18 }, + "infoURL": "https://www.pharos.xyz/", + "shortName": "pharos", + "chainId": 688689, + "networkId": 688689, + "explorers": [{ "name": "pharosscan", "url": "https://atlantic.pharosscan.xyz/", "standard": "EIP3091" }] + }, { "name": "Hemi Sepolia", "chain": "ETH", @@ -2695,6 +2743,51 @@ ], "parent": { "type": "L2", "chain": "eip155-1", "bridges": [{ "url": "https://app.treasure.lol/chain/bridge" }] } }, + { + "name": "Jovay Sepolia Testnet", + "chain": "ETH", + "status": "active", + "rpc": [ + "https://api.zan.top/public/jovay-testnet", + "https://api.zan.top/node/v1/jovay/testnet/${ZAN_API_KEY}", + "wss://api.zan.top/node/ws/v1/jovay/testnet/${ZAN_API_KEY}" + ], + "faucets": ["https://zan.top/faucet/jovay"], + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "infoURL": "https://jovay.io", + "shortName": "jovay-sepolia", + "chainId": 2019775, + "networkId": 2019775, + "icon": "jovay", + "slip44": 1, + "explorers": [ + { "name": "Jovay Testnet Explorer", "url": "https://sepolia-explorer.jovay.io/l2", "standard": "none" } + ], + "parent": { + "type": "L2", + "chain": "eip155-11155111", + "bridges": [{ "url": "https://docs.jovay.io/guide/developer-quickstart" }] + } + }, + { + "name": "Jovay Mainnet", + "chain": "ETH", + "status": "active", + "rpc": [ + "https://rpc.jovay.io", + "https://api.zan.top/node/v1/jovay/mainnet/${ZAN_API_KEY}", + "wss://api.zan.top/node/ws/v1/jovay/mainnet/${ZAN_API_KEY}" + ], + "faucets": [], + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "infoURL": "https://jovay.io", + "shortName": "jovay", + "chainId": 5734951, + "networkId": 5734951, + "icon": "jovay", + "explorers": [{ "name": "Jovay Explorer", "url": "https://explorer.jovay.io/l2", "standard": "none" }], + "parent": { "type": "L2", "chain": "eip155-1", "bridges": [] } + }, { "name": "Zora", "chain": "ETH", diff --git a/src/scripts/reference/linkNameSymbol.json b/src/scripts/reference/linkNameSymbol.json index ae28aa575cb..9862ef0959e 100644 --- a/src/scripts/reference/linkNameSymbol.json +++ b/src/scripts/reference/linkNameSymbol.json @@ -623,5 +623,25 @@ "68414": { "name": "ChainLink Token", "symbol": "LINK" + }, + "5734951": { + "name": "ChainLink Token", + "symbol": "LINK" + }, + "2019775": { + "name": "ChainLink Token", + "symbol": "LINK" + }, + "2818": { + "name": "ChainLink Token", + "symbol": "LINK" + }, + "2910": { + "name": "ChainLink Token", + "symbol": "LINK" + }, + "988": { + "name": "ChainLink Token", + "symbol": "LINK" } } From 38ea325f7751ffd9d1d3f8281e5edbb9e3f08beb Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Mon, 8 Dec 2025 17:49:40 -0600 Subject: [PATCH 028/214] Update binary location (#3267) * update binary location * update binary location --- reports/llms-report.json | 24 +++---- .../cli-installation/macos-linux.mdx | 8 +-- .../cli-installation/windows.mdx | 2 +- src/content/cre/llms-full-go.txt | 8 +-- src/content/cre/llms-full-ts.txt | 8 +-- src/content/resources/llms-full.txt | 70 +++++++++++++++---- 6 files changed, 83 insertions(+), 37 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index 29acfdc5507..9c11962211e 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,22 +1,22 @@ { - "startedAt": "2025-12-08T14:07:09.016Z", + "startedAt": "2025-12-08T23:38:57.949Z", "siteBase": "https://docs.chain.link", "sections": [ { "section": "cre-go", "pagesProcessed": 83, "outputPath": "src/content/cre/llms-full-go.txt", - "bytes": 651667, - "prevBytes": 651944, - "deltaBytes": -277 + "bytes": 651595, + "prevBytes": 651667, + "deltaBytes": -72 }, { "section": "cre-ts", "pagesProcessed": 78, "outputPath": "src/content/cre/llms-full-ts.txt", - "bytes": 607170, - "prevBytes": 607447, - "deltaBytes": -277 + "bytes": 607098, + "prevBytes": 607170, + "deltaBytes": -72 }, { "section": "vrf", @@ -31,8 +31,8 @@ "pagesProcessed": 260, "outputPath": "src/content/ccip/llms-full.txt", "bytes": 2849877, - "prevBytes": 2849781, - "deltaBytes": 96 + "prevBytes": 2849877, + "deltaBytes": 0 }, { "section": "data-feeds", @@ -86,9 +86,9 @@ "section": "resources", "pagesProcessed": 12, "outputPath": "src/content/resources/llms-full.txt", - "bytes": 331970, + "bytes": 338205, "prevBytes": 331970, - "deltaBytes": 0 + "deltaBytes": 6235 }, { "section": "architecture-overview", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-08T14:07:12.967Z" + "finishedAt": "2025-12-08T23:39:02.321Z" } diff --git a/src/content/cre/getting-started/cli-installation/macos-linux.mdx b/src/content/cre/getting-started/cli-installation/macos-linux.mdx index 2c618ed3736..8f4179d3d1f 100644 --- a/src/content/cre/getting-started/cli-installation/macos-linux.mdx +++ b/src/content/cre/getting-started/cli-installation/macos-linux.mdx @@ -57,7 +57,7 @@ This script will: - Detect your operating system and architecture automatically - Download the correct binary for your system - Verify the binary's integrity -- Install it to `/usr/local/bin` (or prompt you for a custom location) +- Install it to `$HOME/.cre` - Make the binary executable After the script completes, verify the installation: @@ -70,7 +70,7 @@ cre version <Aside type="note" title="macOS Gatekeeper"> If you see warnings about "unrecognized developer/source" on macOS, run:{" "} - <CopyText text="xattr -c /usr/local/bin/cre" code /> + <CopyText text="xattr -c $HOME/.cre/cre" code /> </Aside> ### Manual installation @@ -221,8 +221,8 @@ You should see version information: `cre version v1.0.2`. **If it doesn't work:** - Make sure you opened a **new terminal window** after making PATH changes -- Check the binary location: `which cre` should return `/usr/local/bin/cre` (or your custom path) -- Check that the binary has execute permissions: `ls -la /usr/local/bin/cre` +- Check the binary location: `which cre` should return the path to your installation +- Check that the binary has execute permissions: `ls -la $(which cre)` - Verify your PATH includes the correct directory: `echo $PATH` #### 5. Confirm your PATH (troubleshooting) diff --git a/src/content/cre/getting-started/cli-installation/windows.mdx b/src/content/cre/getting-started/cli-installation/windows.mdx index 69b24a01b66..e89db7362a0 100644 --- a/src/content/cre/getting-started/cli-installation/windows.mdx +++ b/src/content/cre/getting-started/cli-installation/windows.mdx @@ -56,7 +56,7 @@ This script will: - Download the correct binary for Windows - Verify the binary's integrity -- Install it to a location in your PATH +- Install it to `$HOME/.cre` - Make the binary executable After the script completes, **open a new PowerShell window** and verify the installation: diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 48722460c70..22417d1871b 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -553,7 +553,7 @@ This script will: - Detect your operating system and architecture automatically - Download the correct binary for your system - Verify the binary's integrity -- Install it to `/usr/local/bin` (or prompt you for a custom location) +- Install it to `$HOME/.cre` - Make the binary executable After the script completes, verify the installation: @@ -711,8 +711,8 @@ You should see version information: `cre version v1.0.2`. **If it doesn't work:** - Make sure you opened a **new terminal window** after making PATH changes -- Check the binary location: `which cre` should return `/usr/local/bin/cre` (or your custom path) -- Check that the binary has execute permissions: `ls -la /usr/local/bin/cre` +- Check the binary location: `which cre` should return the path to your installation +- Check that the binary has execute permissions: `ls -la $(which cre)` - Verify your PATH includes the correct directory: `echo $PATH` #### 5. Confirm your PATH (troubleshooting) @@ -766,7 +766,7 @@ This script will: - Download the correct binary for Windows - Verify the binary's integrity -- Install it to a location in your PATH +- Install it to `$HOME/.cre` - Make the binary executable After the script completes, **open a new PowerShell window** and verify the installation: diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index b45ad03814a..f6a78640d2e 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -553,7 +553,7 @@ This script will: - Detect your operating system and architecture automatically - Download the correct binary for your system - Verify the binary's integrity -- Install it to `/usr/local/bin` (or prompt you for a custom location) +- Install it to `$HOME/.cre` - Make the binary executable After the script completes, verify the installation: @@ -711,8 +711,8 @@ You should see version information: `cre version v1.0.2`. **If it doesn't work:** - Make sure you opened a **new terminal window** after making PATH changes -- Check the binary location: `which cre` should return `/usr/local/bin/cre` (or your custom path) -- Check that the binary has execute permissions: `ls -la /usr/local/bin/cre` +- Check the binary location: `which cre` should return the path to your installation +- Check that the binary has execute permissions: `ls -la $(which cre)` - Verify your PATH includes the correct directory: `echo $PATH` #### 5. Confirm your PATH (troubleshooting) @@ -766,7 +766,7 @@ This script will: - Download the correct binary for Windows - Verify the binary's integrity -- Install it to a location in your PATH +- Install it to `$HOME/.cre` - Make the binary executable After the script completes, **open a new PowerShell window** and verify the installation: diff --git a/src/content/resources/llms-full.txt b/src/content/resources/llms-full.txt index e039241fa49..dd00f71e5fc 100644 --- a/src/content/resources/llms-full.txt +++ b/src/content/resources/llms-full.txt @@ -1534,6 +1534,18 @@ Testnet Native and LINK is available at [faucets.chain.link/hedera-testnet](http | Symbol | LINK | | Decimals | 18 | +## <img src="/assets/chains/henesys.svg" style="height: 24px; width: auto; margin-right: 8px;" />Henesys + +### Henesys Mainnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Chain ID | `68414` | +| Address | <Address contractUrl="https://subnets.avax.network/henesys/address/0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlId="68414_0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlClass="erc-token-address" /> | +| Name | Chainlink Token on Nexon Henesys Mainnet | +| Symbol | LINK | +| Decimals | 18 | + ## <img src="/assets/chains/hyperliquid.svg" style="height: 24px; width: auto; margin-right: 8px;" />HyperEVM ### HyperEVM Mainnet @@ -1590,6 +1602,28 @@ Testnet Native and LINK is available at [faucets.chain.link/hedera-testnet](http | Symbol | LINK | | Decimals | 18 | +## <img src="/assets/chains/jovay.svg" style="height: 24px; width: auto; margin-right: 8px;" />Jovay + +### Jovay Mainnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Chain ID | `5734951` | +| Address | <Address contractUrl="https://explorer.jovay.io/l2/address/0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlId="5734951_0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlClass="erc-token-address" /> | +| Name | Chainlink Token on Jovay Mainnet | +| Symbol | LINK | +| Decimals | 18 | + +### Jovay Sepolia Testnet + +| Parameter | Value | +| :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `2019775` | +| Address | <Address contractUrl="https://sepolia-explorer.jovay.io/l2/address/0xd3e461C55676B10634a5F81b747c324B85686Dd1" urlId="2019775_0xd3e461C55676B10634a5F81b747c324B85686Dd1" urlClass="erc-token-address" /> | +| Name | Chainlink Token on Jovay Sepolia Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## <img src="/assets/chains/kaia.svg" style="height: 24px; width: auto; margin-right: 8px;" />Kaia ### Kaia Mainnet @@ -1977,6 +2011,18 @@ MOVR is used to pay transaction fees on Moonriver Mainnet. | Decimals | 18 | | Network status | [moonscan.freshstatus.io](https://moonscan.freshstatus.io/) | +## <img src="/assets/chains/morph.svg" style="height: 24px; width: auto; margin-right: 8px;" />Morph + +### Morph Mainnet + +| Parameter | Value | +| :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `2818` | +| Address | <Address contractUrl="https://explorer.morphl2.io/address/0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlId="2818_0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlClass="erc-token-address" /> | +| Name | Chainlink Token on Morph Mainnet | +| Symbol | LINK | +| Decimals | 18 | + ## <img src="/assets/chains/neox.svg" style="height: 24px; width: auto; margin-right: 8px;" />Neo X ### Neo X Mainnet @@ -1999,18 +2045,6 @@ MOVR is used to pay transaction fees on Moonriver Mainnet. | Symbol | LINK | | Decimals | 18 | -## <img src="/assets/chains/henesys.svg" style="height: 24px; width: auto; margin-right: 8px;" />Henesys - -### Henesys Mainnet - -| Parameter | Value | -| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Chain ID | `68414` | -| Address | <Address contractUrl="https://subnets.avax.network/henesys/address/0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlId="68414_0x76a443768A5e3B8d1AED0105FC250877841Deb40" urlClass="erc-token-address" /> | -| Name | Chainlink Token on Nexon Henesys Mainnet | -| Symbol | LINK | -| Decimals | 18 | - ## <img src="/assets/chains/opbnb.svg" style="height: 24px; width: auto; margin-right: 8px;" />OPBNB ### OPBNB Mainnet @@ -2425,6 +2459,18 @@ Testnet S is used to pay for transactions on Sonic Blaze testnet. | Symbol | LINK | | Decimals | 18 | +## <img src="/assets/chains/stable.svg" style="height: 24px; width: auto; margin-right: 8px;" />Stable + +### Stable Mainnet + +| Parameter | Value | +| :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `988` | +| Address | <Address contractUrl="https://stablescan.xyz/address/0x985FB0821Eef0056ec26DD8b33dC61b9415B7F4b" urlId="988_0x985FB0821Eef0056ec26DD8b33dC61b9415B7F4b" urlClass="erc-token-address" /> | +| Name | Chainlink Token on Stable Mainnet | +| Symbol | LINK | +| Decimals | 18 | + ## <img src="/assets/chains/starknet.svg" style="height: 24px; width: auto; margin-right: 8px;" />Starknet ### Starknet Mainnet From 843dc5bc694e2d6482a5c5e2fa1094591ae9b251 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 12:26:56 +0000 Subject: [PATCH 029/214] Bump @supabase/supabase-js from 2.86.0 to 2.86.2 (#3263) * Bump @supabase/supabase-js from 2.86.0 to 2.86.2 Bumps [@supabase/supabase-js](https://github.com/supabase/supabase-js/tree/HEAD/packages/core/supabase-js) from 2.86.0 to 2.86.2. - [Release notes](https://github.com/supabase/supabase-js/releases) - [Changelog](https://github.com/supabase/supabase-js/blob/master/packages/core/supabase-js/CHANGELOG.md) - [Commits](https://github.com/supabase/supabase-js/commits/v2.86.2/packages/core/supabase-js) --- updated-dependencies: - dependency-name: "@supabase/supabase-js" dependency-version: 2.86.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * update --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 54 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 983f8bd4055..aad86f3b497 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "@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.86.0", + "@supabase/supabase-js": "^2.86.2", "astro": "^5.16.4", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", @@ -14125,9 +14125,9 @@ "license": "MIT" }, "node_modules/@supabase/auth-js": { - "version": "2.86.0", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.86.0.tgz", - "integrity": "sha512-3xPqMvBWC6Haqpr6hEWmSUqDq+6SA1BAEdbiaHdAZM9QjZ5uiQJ+6iD9pZOzOa6MVXZh4GmwjhC9ObIG0K1NcA==", + "version": "2.86.2", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.86.2.tgz", + "integrity": "sha512-7k8IAhgSnZuD9Zex2+ohHKY3aWGDd4ls0xlxMGl3/jPyHSSXrIYfmtJyUH0+DPd4B3psBqHC0Ev0/nZEHdW58w==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14137,9 +14137,9 @@ } }, "node_modules/@supabase/functions-js": { - "version": "2.86.0", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.86.0.tgz", - "integrity": "sha512-AlOoVfeaq9XGlBFIyXTmb+y+CZzxNO4wWbfgRM6iPpNU5WCXKawtQYSnhivi3UVxS7GA0rWovY4d6cIAxZAojA==", + "version": "2.86.2", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.86.2.tgz", + "integrity": "sha512-OLpy3NIlj7q3yGMFwUpPkDPJbRx4aU+u73SiXqiMnA5ARwzVcOReSzI2u4oOqioE+3ud0fRx7sRsfoklBwYOmg==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14149,9 +14149,9 @@ } }, "node_modules/@supabase/postgrest-js": { - "version": "2.86.0", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.86.0.tgz", - "integrity": "sha512-QVf+wIXILcZJ7IhWhWn+ozdf8B+oO0Ulizh2AAPxD/6nQL+x3r9lJ47a+fpc/jvAOGXMbkeW534Kw6jz7e8iIA==", + "version": "2.86.2", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.86.2.tgz", + "integrity": "sha512-KVgOF2QASvUfQnzMGAmxR7f3ZF/eZ8PFp2F5Q7SAPQlmB83FEaZ7C/QMzfVXXqkMbotfh96xcaBNSKnxowFObA==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14161,9 +14161,9 @@ } }, "node_modules/@supabase/realtime-js": { - "version": "2.86.0", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.86.0.tgz", - "integrity": "sha512-dyS8bFoP29R/sj5zLi0AP3JfgG8ar1nuImcz5jxSx7UIW7fbFsXhUCVrSY2Ofo0+Ev6wiATiSdBOzBfWaiFyPA==", + "version": "2.86.2", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.86.2.tgz", + "integrity": "sha512-uLUYrOMeK1qXHISxdMFVfBs0sGV5PmqYewIHvLBnMYbb//LERojxfKlVSJBgZ+aAwxANmtQKcprjGZI7DJ6lNQ==", "license": "MIT", "dependencies": { "@types/phoenix": "^1.6.6", @@ -14176,9 +14176,9 @@ } }, "node_modules/@supabase/storage-js": { - "version": "2.86.0", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.86.0.tgz", - "integrity": "sha512-PM47jX/Mfobdtx7NNpoj9EvlrkapAVTQBZgGGslEXD6NS70EcGjhgRPBItwHdxZPM5GwqQ0cGMN06uhjeY2mHQ==", + "version": "2.86.2", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.86.2.tgz", + "integrity": "sha512-zyR4PkO7R4f4/xRBVJho3Dm7y4512BoCqGmD7LjNV2GVtWt8vEmambiuMB2Ty3l76mqw+ynQyHY8yFWSERrHXA==", "license": "MIT", "dependencies": { "iceberg-js": "^0.8.0", @@ -14189,16 +14189,16 @@ } }, "node_modules/@supabase/supabase-js": { - "version": "2.86.0", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.86.0.tgz", - "integrity": "sha512-BaC9sv5+HGNy1ulZwY8/Ev7EjfYYmWD4fOMw9bDBqTawEj6JHAiOHeTwXLRzVaeSay4p17xYLN2NSCoGgXMQnw==", + "version": "2.86.2", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.86.2.tgz", + "integrity": "sha512-KXoiqFf7zZhL/+lj7oBFFUvVDQ6gy03v9wQ5E++f7xiJUuqmI4DuBhrv8uFo6B2EGTQTA3vkXjbxmYIug/zfWw==", "license": "MIT", "dependencies": { - "@supabase/auth-js": "2.86.0", - "@supabase/functions-js": "2.86.0", - "@supabase/postgrest-js": "2.86.0", - "@supabase/realtime-js": "2.86.0", - "@supabase/storage-js": "2.86.0" + "@supabase/auth-js": "2.86.2", + "@supabase/functions-js": "2.86.2", + "@supabase/postgrest-js": "2.86.2", + "@supabase/realtime-js": "2.86.2", + "@supabase/storage-js": "2.86.2" }, "engines": { "node": ">=20.0.0" @@ -22465,9 +22465,9 @@ } }, "node_modules/iceberg-js": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.0.tgz", - "integrity": "sha512-kmgmea2nguZEvRqW79gDqNXyxA3OS5WIgMVffrHpqXV4F/J4UmNIw2vstixioLTNSkd5rFB8G0s3Lwzogm6OFw==", + "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" diff --git a/package.json b/package.json index 195a66e4a0c..1ed0c35686e 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@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.86.0", + "@supabase/supabase-js": "^2.86.2", "astro": "^5.16.4", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", From 7ef63632cc52a672f2cbe5e5c2465cc5feb40dcd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 12:39:51 +0000 Subject: [PATCH 030/214] Bump react-instantsearch in the documentation group (#3261) Bumps the documentation group with 1 update: [react-instantsearch](https://github.com/algolia/instantsearch). Updates `react-instantsearch` from 7.20.0 to 7.20.1 - [Release notes](https://github.com/algolia/instantsearch/releases) - [Commits](https://github.com/algolia/instantsearch/compare/react-instantsearch@7.20.0...react-instantsearch@7.20.1) --- updated-dependencies: - dependency-name: react-instantsearch dependency-version: 7.20.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: documentation ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> --- package-lock.json | 264 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 133 insertions(+), 133 deletions(-) diff --git a/package-lock.json b/package-lock.json index aad86f3b497..4371573636c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ "nanostores": "^0.11.4", "pino": "^9.14.0", "preact": "^10.27.2", - "react-instantsearch": "^7.20.0", + "react-instantsearch": "^7.20.1", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "rehype-wrap-all": "^1.1.0", @@ -142,13 +142,13 @@ "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==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.18.tgz", + "integrity": "sha512-sDQcW+6ck2m0pTIHW6BPHD7S125WD3qNkx/B8sEzJp/hurocmJ5Cni0ybExg6sQMGo+fr/GWOwpHF1cmCdg5rQ==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.17", + "@ai-sdk/provider-utils": "3.0.18", "@vercel/oidc": "3.0.5" }, "engines": { @@ -180,9 +180,9 @@ } }, "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==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.0", @@ -197,120 +197,120 @@ } }, "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.12.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.12.0.tgz", + "integrity": "sha512-EfW0bfxjPs+C7ANkJDw2TATntfBKsFiy7APh+KO0pQ8A6HYa5I0NjFuCGCXWfzzzLXNZta3QUl3n5Kmm6aJo9Q==", "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.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-abtesting": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.45.0.tgz", - "integrity": "sha512-WTW0VZA8xHMbzuQD5b3f41ovKZ0MNTIXkWfm0F2PU+XGcLxmxX15UqODzF2sWab0vSbi3URM1xLhJx+bXbd1eQ==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.46.0.tgz", + "integrity": "sha512-eG5xV8rujK4ZIHXrRshvv9O13NmU/k42Rnd3w43iKH5RaQ2zWuZO6Q7XjaoJjAFVCsJWqRbXzbYyPGrbF3wGNg==", "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.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.45.0.tgz", - "integrity": "sha512-I3g7VtvG/QJOH3tQO7E7zWTwBfK/nIQXShFLR8RvPgWburZ626JNj332M3wHCYcaAMivN9WJG66S2JNXhm6+Xg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.46.0.tgz", + "integrity": "sha512-AYh2uL8IUW9eZrbbT+wZElyb7QkkeV3US2NEKY7doqMlyPWE8lErNfkVN1NvZdVcY4/SVic5GDbeDz2ft8YIiQ==", "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.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.45.0.tgz", - "integrity": "sha512-/nTqm1tLiPtbUr+8kHKyFiCOfhRfgC+JxLvOCq471gFZZOlsh6VtFRiKI60/zGmHTojFC6B0mD80PB7KeK94og==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.46.0.tgz", + "integrity": "sha512-0emZTaYOeI9WzJi0TcNd2k3SxiN6DZfdWc2x2gHt855Jl9jPUOzfVTL6gTvCCrOlT4McvpDGg5nGO+9doEjjig==", "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.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.46.0.tgz", + "integrity": "sha512-wrBJ8fE+M0TDG1As4DDmwPn2TXajrvmvAN72Qwpuv8e2JOKNohF7+JxBoF70ZLlvP1A1EiH8DBu+JpfhBbNphQ==", "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.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.45.0.tgz", - "integrity": "sha512-CId/dbjpzI3eoUhPU6rt/z4GrRsDesqFISEMOwrqWNSrf4FJhiUIzN42Ac+Gzg69uC0RnzRYy60K1y4Na5VSMw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.46.0.tgz", + "integrity": "sha512-LnkeX4p0ENt0DoftDJJDzQQJig/sFQmD1eQifl/iSjhUOGUIKC/7VTeXRcKtQB78naS8njUAwpzFvxy1CDDXDQ==", "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.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.45.0.tgz", - "integrity": "sha512-tjbBKfA8fjAiFtvl9g/MpIPiD6pf3fj7rirVfh1eMIUi8ybHP4ovDzIaE216vHuRXoePQVCkMd2CokKvYq1CLw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.0.tgz", + "integrity": "sha512-aF9tc4ex/smypXw+W3lBPB1jjKoaGHpZezTqofvDOI/oK1dR2sdTpFpK2Ru+7IRzYgwtRqHF3znmTlyoNs9dpA==", "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.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.45.0.tgz", - "integrity": "sha512-nxuCid+Nszs4xqwIMDw11pRJPes2c+Th1yup/+LtpjFH8QWXkr3SirNYSD3OXAeM060HgWWPLA8/Fxk+vwxQOA==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", + "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "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.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" @@ -323,84 +323,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.46.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.46.0.tgz", + "integrity": "sha512-2LT0/Z+/sFwEpZLH6V17WSZ81JX2uPjgvv5eNlxgU7rPyup4NXXfuMbtCJ+6uc4RO/LQpEJd3Li59ke3wtyAsA==", "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.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.45.0.tgz", - "integrity": "sha512-IaX3ZX1A/0wlgWZue+1BNWlq5xtJgsRo7uUk/aSiYD7lPbJ7dFuZ+yTLFLKgbl4O0QcyHTj1/mSBj9ryF1Lizg==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.46.0.tgz", + "integrity": "sha512-uivZ9wSWZ8mz2ZU0dgDvQwvVZV8XBv6lYBXf8UtkQF3u7WeTqBPeU8ZoeTyLpf0jAXCYOvc1mAVmK0xPLuEwOQ==", "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.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.45.0.tgz", - "integrity": "sha512-1jeMLoOhkgezCCPsOqkScwYzAAc1Jr5T2hisZl0s32D94ZV7d1OHozBukgOjf8Dw+6Hgi6j52jlAdUWTtkX9Mg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.46.0.tgz", + "integrity": "sha512-O2BB8DuySuddgOAbhyH4jsGbL+KyDGpzJRtkDZkv091OMomqIA78emhhMhX9d/nIRrzS1wNLWB/ix7Hb2eV5rg==", "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.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.45.0.tgz", - "integrity": "sha512-46FIoUkQ9N7wq4/YkHS5/W9Yjm4Ab+q5kfbahdyMpkBPJ7IBlwuNEGnWUZIQ6JfUZuJVojRujPRHMihX4awUMg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.0.tgz", + "integrity": "sha512-eW6xyHCyYrJD0Kjk9Mz33gQ40LfWiEA51JJTVfJy3yeoRSw/NXhAL81Pljpa0qslTs6+LO/5DYPZddct6HvISQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.45.0" + "@algolia/client-common": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.45.0.tgz", - "integrity": "sha512-XFTSAtCwy4HdBhSReN2rhSyH/nZOM3q3qe5ERG2FLbYId62heIlJBGVyAPRbltRwNlotlydbvSJ+SQ0ruWC2cw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.46.0.tgz", + "integrity": "sha512-Vn2+TukMGHy4PIxmdvP667tN/MhS7MPT8EEvEhS6JyFLPx3weLcxSa1F9gVvrfHWCUJhLWoMVJVB2PT8YfRGcw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.45.0" + "@algolia/client-common": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.45.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.45.0.tgz", - "integrity": "sha512-8mTg6lHx5i44raCU52APsu0EqMsdm4+7Hch/e4ZsYZw0hzwkuaMFh826ngnkYf9XOl58nHoou63aZ874m8AbpQ==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.46.0.tgz", + "integrity": "sha512-xaqXyna5yBZ+r1SJ9my/DM6vfTqJg9FJgVydRJ0lnO+D5NhqGW/qaRG/iBGKr/d4fho34el6WakV7BqJvrl/HQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.45.0" + "@algolia/client-common": "5.46.0" }, "engines": { "node": ">= 14.0.0" @@ -16239,14 +16239,14 @@ } }, "node_modules/ai": { - "version": "5.0.101", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.101.tgz", - "integrity": "sha512-/P4fgs2PGYTBaZi192YkPikOudsl9vccA65F7J7LvoNTOoP5kh1yAsJPsKAy6FXU32bAngai7ft1UDyC3u7z5g==", + "version": "5.0.108", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.108.tgz", + "integrity": "sha512-Jex3Lb7V41NNpuqJHKgrwoU6BCLHdI1Pg4qb4GJH4jRIDRXUBySJErHjyN4oTCwbiYCeb/8II9EnqSRPq9EifA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/gateway": "2.0.15", + "@ai-sdk/gateway": "2.0.18", "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.17", + "@ai-sdk/provider-utils": "3.0.18", "@opentelemetry/api": "1.9.0" }, "engines": { @@ -16299,26 +16299,26 @@ } }, "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.46.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", + "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "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.12.0", + "@algolia/client-abtesting": "5.46.0", + "@algolia/client-analytics": "5.46.0", + "@algolia/client-common": "5.46.0", + "@algolia/client-insights": "5.46.0", + "@algolia/client-personalization": "5.46.0", + "@algolia/client-query-suggestions": "5.46.0", + "@algolia/client-search": "5.46.0", + "@algolia/ingestion": "1.46.0", + "@algolia/monitoring": "1.46.0", + "@algolia/recommend": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" @@ -22639,9 +22639,9 @@ "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.15.1", + "resolved": "https://registry.npmjs.org/instantsearch-ui-components/-/instantsearch-ui-components-0.15.1.tgz", + "integrity": "sha512-IpBtPYt4HHAd8lCPziMIqfvcAIeSQD8teZxhGfzCj6520GHwucYr37fMWjUPlLs/bygS+2a6zwQf3amfeekaag==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", @@ -22661,9 +22661,9 @@ } }, "node_modules/instantsearch.js": { - "version": "4.84.0", - "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.84.0.tgz", - "integrity": "sha512-7ThTNzBgyFJgZT2ng/0lwGmCXZnK3nq5476bu0hL5u6Nc+AuKFGtAMKlNozXI/Nel3i3WJkoWwxO+37OxfqQmw==", + "version": "4.85.0", + "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.85.0.tgz", + "integrity": "sha512-46WIVx5A6nFnRKpGiXidJS7NUFbB6TFK21h9z7sRu9YltnZw/RsUwtHwb/TVzAUnSgjqACM4pRAgqNvidGvydg==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1", @@ -22675,7 +22675,7 @@ "algoliasearch-helper": "3.26.1", "hogan.js": "^3.0.2", "htm": "^3.0.0", - "instantsearch-ui-components": "0.15.0", + "instantsearch-ui-components": "0.15.1", "preact": "^10.10.0", "qs": "^6.5.1 < 6.10", "react": ">= 0.14.0", @@ -31816,15 +31816,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.20.1", + "resolved": "https://registry.npmjs.org/react-instantsearch/-/react-instantsearch-7.20.1.tgz", + "integrity": "sha512-AiK7cyNhAdsduDnmiKa/16dTbC7aJGG86CLF/A7Nj+hiNFDm0ELUxu120cfeHOPw8WZFKkTUmnI6Og0x4S56yg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", - "instantsearch-ui-components": "0.15.0", - "instantsearch.js": "4.84.0", - "react-instantsearch-core": "7.20.0" + "instantsearch-ui-components": "0.15.1", + "instantsearch.js": "4.85.0", + "react-instantsearch-core": "7.20.1" }, "peerDependencies": { "algoliasearch": ">= 3.1 < 6", @@ -31833,15 +31833,15 @@ } }, "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.20.1", + "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-7.20.1.tgz", + "integrity": "sha512-GMC/F2RldOKyiWP5Sie00W+eC8lvE/CiNZ0tYJoChr9vbSzzpA88zhRl+j9LTnMMsaq4vM13/R/1ENA7/AXgdQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", "ai": "^5.0.18", "algoliasearch-helper": "3.26.1", - "instantsearch.js": "4.84.0", + "instantsearch.js": "4.85.0", "use-sync-external-store": "^1.0.0", "zod": "^3.25.76 || ^4", "zod-to-json-schema": "3.24.6" diff --git a/package.json b/package.json index 1ed0c35686e..8a216a671b6 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "nanostores": "^0.11.4", "pino": "^9.14.0", "preact": "^10.27.2", - "react-instantsearch": "^7.20.0", + "react-instantsearch": "^7.20.1", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "rehype-wrap-all": "^1.1.0", From 1ad35bf90ab09eb4420a7ac7899081052241f712 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 13:02:44 +0000 Subject: [PATCH 031/214] Bump ts-jest from 29.4.5 to 29.4.6 in the testing-tools group (#3260) * Bump ts-jest from 29.4.5 to 29.4.6 in the testing-tools group Bumps the testing-tools group with 1 update: [ts-jest](https://github.com/kulshekhar/ts-jest). Updates `ts-jest` from 29.4.5 to 29.4.6 - [Release notes](https://github.com/kulshekhar/ts-jest/releases) - [Changelog](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/kulshekhar/ts-jest/compare/v29.4.5...v29.4.6) --- updated-dependencies: - dependency-name: ts-jest dependency-version: 29.4.6 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: testing-tools ... Signed-off-by: dependabot[bot] <support@github.com> * update --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4371573636c..af188589e8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,7 +104,7 @@ "remark-stringify": "^11.0.0", "solhint": "^6.0.1", "solhint-plugin-chainlink-solidity": "github:smartcontractkit/chainlink-solhint-rules#v1.3.0", - "ts-jest": "^29.4.5", + "ts-jest": "^29.4.6", "tsconfig-paths": "^4.2.0", "tsx": "^4.21.0", "typescript": "^5.9.3", @@ -35237,9 +35237,9 @@ "license": "Apache-2.0" }, "node_modules/ts-jest": { - "version": "29.4.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.5.tgz", - "integrity": "sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==", + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 8a216a671b6..12b9a0fc123 100644 --- a/package.json +++ b/package.json @@ -149,7 +149,7 @@ "remark-stringify": "^11.0.0", "solhint": "^6.0.1", "solhint-plugin-chainlink-solidity": "github:smartcontractkit/chainlink-solhint-rules#v1.3.0", - "ts-jest": "^29.4.5", + "ts-jest": "^29.4.6", "tsconfig-paths": "^4.2.0", "tsx": "^4.21.0", "typescript": "^5.9.3", From fc00628fbb9eb56cdb5dcaf39e6b32cae2b4d45a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 13:20:31 +0000 Subject: [PATCH 032/214] Bump preact from 10.27.2 to 10.28.0 in the ui-frameworks group (#3259) * Bump preact from 10.27.2 to 10.28.0 in the ui-frameworks group Bumps the ui-frameworks group with 1 update: [preact](https://github.com/preactjs/preact). Updates `preact` from 10.27.2 to 10.28.0 - [Release notes](https://github.com/preactjs/preact/releases) - [Commits](https://github.com/preactjs/preact/compare/10.27.2...10.28.0) --- updated-dependencies: - dependency-name: preact dependency-version: 10.28.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: ui-frameworks ... Signed-off-by: dependabot[bot] <support@github.com> * update --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index af188589e8a..2b737af6337 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "marked": "^15.0.12", "nanostores": "^0.11.4", "pino": "^9.14.0", - "preact": "^10.27.2", + "preact": "^10.28.0", "react-instantsearch": "^7.20.1", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", @@ -31172,9 +31172,9 @@ "license": "MIT" }, "node_modules/preact": { - "version": "10.27.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", - "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", + "version": "10.28.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.0.tgz", + "integrity": "sha512-rytDAoiXr3+t6OIP3WGlDd0ouCUG1iCWzkcY3++Nreuoi17y6T5i/zRhe6uYfoVcxq6YU+sBtJouuRDsq8vvqA==", "license": "MIT", "funding": { "type": "opencollective", diff --git a/package.json b/package.json index 12b9a0fc123..4b75eee9381 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "marked": "^15.0.12", "nanostores": "^0.11.4", "pino": "^9.14.0", - "preact": "^10.27.2", + "preact": "^10.28.0", "react-instantsearch": "^7.20.1", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", From 8c29eb540a82d12f9238edae6189f7c4384aa791 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:44:00 +0100 Subject: [PATCH 033/214] Bump ethers from 6.15.0 to 6.16.0 in the blockchain group (#3258) * Bump ethers from 6.15.0 to 6.16.0 in the blockchain group Bumps the blockchain group with 1 update: [ethers](https://github.com/ethers-io/ethers.js). Updates `ethers` from 6.15.0 to 6.16.0 - [Release notes](https://github.com/ethers-io/ethers.js/releases) - [Changelog](https://github.com/ethers-io/ethers.js/blob/main/CHANGELOG.md) - [Commits](https://github.com/ethers-io/ethers.js/compare/v6.15.0...v6.16.0) --- updated-dependencies: - dependency-name: ethers dependency-version: 6.16.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: blockchain ... Signed-off-by: dependabot[bot] <support@github.com> * update --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2b737af6337..bc1ed8c3bd3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,7 @@ "bs58": "^6.0.0", "clipboard": "^2.0.11", "dotenv": "^16.6.1", - "ethers": "^6.15.0", + "ethers": "^6.16.0", "focus-trap-react": "^11.0.4", "github-slugger": "^2.0.0", "lodash": "^4.17.21", @@ -20533,9 +20533,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", diff --git a/package.json b/package.json index 4b75eee9381..9786e8cea74 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "bs58": "^6.0.0", "clipboard": "^2.0.11", "dotenv": "^16.6.1", - "ethers": "^6.15.0", + "ethers": "^6.16.0", "focus-trap-react": "^11.0.4", "github-slugger": "^2.0.0", "lodash": "^4.17.21", From 09e9a2c67c0e0a7265ad5beb18977f2408c118c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:00:23 +0000 Subject: [PATCH 034/214] Bump the linting-tools group across 1 directory with 2 updates (#3257) * Bump the linting-tools group across 1 directory with 2 updates Bumps the linting-tools group with 2 updates in the / directory: [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) and [prettier](https://github.com/prettier/prettier). Updates `knip` from 5.70.2 to 5.71.0 - [Release notes](https://github.com/webpro-nl/knip/releases) - [Commits](https://github.com/webpro-nl/knip/commits/5.71.0/packages/knip) Updates `prettier` from 3.7.3 to 3.7.4 - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.7.3...3.7.4) --- updated-dependencies: - dependency-name: knip dependency-version: 5.71.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: linting-tools - dependency-name: prettier dependency-version: 3.7.4 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: linting-tools ... Signed-off-by: dependabot[bot] <support@github.com> * update --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 203 +++++++++++++++++++++++++--------------------- package.json | 4 +- 2 files changed, 111 insertions(+), 96 deletions(-) diff --git a/package-lock.json b/package-lock.json index bc1ed8c3bd3..82c8118a6c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,11 +92,11 @@ "eslint-plugin-promise": "^6.1.1", "husky": "^9.1.7", "jest-yaml-transform": "^0.2.0", - "knip": "^5.70.1", + "knip": "^5.72.0", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", "pino-pretty": "^13.1.3", - "prettier": "^3.7.3", + "prettier": "^3.7.4", "prettier-plugin-astro": "^0.14.1", "remark-gfm": "^4.0.0", "remark-mdx": "^3.1.0", @@ -8474,15 +8474,15 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", - "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", + "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, @@ -8793,9 +8793,9 @@ "license": "MIT" }, "node_modules/@oxc-resolver/binding-android-arm-eabi": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.14.0.tgz", - "integrity": "sha512-jB47iZ/thvhE+USCLv+XY3IknBbkKr/p7OBsQDTHode/GPw+OHRlit3NQ1bjt1Mj8V2CS7iHdSDYobZ1/0gagQ==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.15.0.tgz", + "integrity": "sha512-Q+lWuFfq7whNelNJIP1dhXaVz4zO9Tu77GcQHyxDWh3MaCoO2Bisphgzmsh4ZoUe2zIchQh6OvQL99GlWHg9Tw==", "cpu": [ "arm" ], @@ -8807,9 +8807,9 @@ ] }, "node_modules/@oxc-resolver/binding-android-arm64": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.14.0.tgz", - "integrity": "sha512-XFJ9t7d/Cz+dWLyqtTy3Xrekz+qqN4hmOU2iOUgr7u71OQsPUHIIeS9/wKanEK0l413gPwapIkyc5x9ltlOtyw==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.15.0.tgz", + "integrity": "sha512-vbdBttesHR0W1oJaxgWVTboyMUuu+VnPsHXJ6jrXf4czELzB6GIg5DrmlyhAmFBhjwov+yJH/DfTnHS+2sDgOw==", "cpu": [ "arm64" ], @@ -8821,9 +8821,9 @@ ] }, "node_modules/@oxc-resolver/binding-darwin-arm64": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.14.0.tgz", - "integrity": "sha512-gwehBS9smA1mzK8frDsmUCHz+6baJVwkKF6qViHhoqA3kRKvIZ3k6WNP4JmF19JhOiGxRcoPa8gZRfzNgXwP2A==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.15.0.tgz", + "integrity": "sha512-R67lsOe1UzNjqVBCwCZX1rlItTsj/cVtBw4Uy19CvTicqEWvwaTn8t34zLD75LQwDDPCY3C8n7NbD+LIdw+ZoA==", "cpu": [ "arm64" ], @@ -8835,9 +8835,9 @@ ] }, "node_modules/@oxc-resolver/binding-darwin-x64": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.14.0.tgz", - "integrity": "sha512-5wwJvfuoahKiAqqAsMLOI28rqdh3P2K7HkjIWUXNMWAZq6ErX0L5rwJzu6T32+Zxw3k18C7R9IS4wDq/3Ar+6w==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.15.0.tgz", + "integrity": "sha512-77mya5F8WV0EtCxI0MlVZcqkYlaQpfNwl/tZlfg4jRsoLpFbaTeWv75hFm6TE84WULVlJtSgvf7DhoWBxp9+ZQ==", "cpu": [ "x64" ], @@ -8849,9 +8849,9 @@ ] }, "node_modules/@oxc-resolver/binding-freebsd-x64": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.14.0.tgz", - "integrity": "sha512-MWTt+LOQNcQ6fa+Uu5VikkihLi1PSIrQqqp0QD44k2AORasNWl0jRGBTcMSBIgNe82qEQWYvlGzvOEEOBp01Og==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.15.0.tgz", + "integrity": "sha512-X1Sz7m5PC+6D3KWIDXMUtux+0Imj6HfHGdBStSvgdI60OravzI1t83eyn6eN0LPTrynuPrUgjk7tOnOsBzSWHw==", "cpu": [ "x64" ], @@ -8863,9 +8863,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.14.0.tgz", - "integrity": "sha512-b6/IBqYrS3o0XiLVBsnex/wK8pTTK+hbGfAMOHVU6p7DBpwPPLgC/tav4IXoOIUCssTFz7aWh/xtUok0swn8VQ==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.15.0.tgz", + "integrity": "sha512-L1x/wCaIRre+18I4cH/lTqSAymlV0k4HqfSYNNuI9oeL28Ks86lI6O5VfYL6sxxWYgjuWB98gNGo7tq7d4GarQ==", "cpu": [ "arm" ], @@ -8877,9 +8877,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm-musleabihf": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.14.0.tgz", - "integrity": "sha512-o2Qh5+y5YoqVK6YfzkalHdpmQ5bkbGGxuLg1pZLQ1Ift0x+Vix7DaFEpdCl5Z9xvYXogd/TwOlL0TPl4+MTFLA==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.15.0.tgz", + "integrity": "sha512-abGXd/zMGa0tH8nKlAXdOnRy4G7jZmkU0J85kMKWns161bxIgGn/j7zxqh3DKEW98wAzzU9GofZMJ0P5YCVPVw==", "cpu": [ "arm" ], @@ -8891,9 +8891,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.14.0.tgz", - "integrity": "sha512-lk8mCSg0Tg4sEG73RiPjb7keGcEPwqQnBHX3Z+BR2SWe+qNHpoHcyFMNafzSvEC18vlxC04AUSoa6kJl/C5zig==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.15.0.tgz", + "integrity": "sha512-SVjjjtMW66Mza76PBGJLqB0KKyFTBnxmtDXLJPbL6ZPGSctcXVmujz7/WAc0rb9m2oV0cHQTtVjnq6orQnI/jg==", "cpu": [ "arm64" ], @@ -8905,9 +8905,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm64-musl": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.14.0.tgz", - "integrity": "sha512-KykeIVhCM7pn93ABa0fNe8vk4XvnbfZMELne2s6P9tdJH9KMBsCFBi7a2BmSdUtTqWCAJokAcm46lpczU52Xaw==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.15.0.tgz", + "integrity": "sha512-JDv2/AycPF2qgzEiDeMJCcSzKNDm3KxNg0KKWipoKEMDFqfM7LxNwwSVyAOGmrYlE4l3dg290hOMsr9xG7jv9g==", "cpu": [ "arm64" ], @@ -8919,9 +8919,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-ppc64-gnu": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.14.0.tgz", - "integrity": "sha512-QqPPWAcZU/jHAuam4f3zV8OdEkYRPD2XR0peVet3hoMMgsihR3Lhe7J/bLclmod297FG0+OgBYQVMh2nTN6oWA==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.15.0.tgz", + "integrity": "sha512-zbu9FhvBLW4KJxo7ElFvZWbSt4vP685Qc/Gyk/Ns3g2gR9qh2qWXouH8PWySy+Ko/qJ42+HJCLg+ZNcxikERfg==", "cpu": [ "ppc64" ], @@ -8933,9 +8933,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.14.0.tgz", - "integrity": "sha512-DunWA+wafeG3hj1NADUD3c+DRvmyVNqF5LSHVUWA2bzswqmuEZXl3VYBSzxfD0j+UnRTFYLxf27AMptoMsepYg==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.15.0.tgz", + "integrity": "sha512-Kfleehe6B09C2qCnyIU01xLFqFXCHI4ylzkicfX/89j+gNHh9xyNdpEvit88Kq6i5tTGdavVnM6DQfOE2qNtlg==", "cpu": [ "riscv64" ], @@ -8947,9 +8947,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-riscv64-musl": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.14.0.tgz", - "integrity": "sha512-4SRvwKTTk2k67EQr9Ny4NGf/BhlwggCI1CXwBbA9IV4oP38DH8b+NAPxDY0ySGRsWbPkG92FYOqM4AWzG4GSgA==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.15.0.tgz", + "integrity": "sha512-J7LPiEt27Tpm8P+qURDwNc8q45+n+mWgyys4/V6r5A8v5gDentHRGUx3iVk5NxdKhgoGulrzQocPTZVosq25Eg==", "cpu": [ "riscv64" ], @@ -8961,9 +8961,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.14.0.tgz", - "integrity": "sha512-hZKvkbsurj4JOom//R1Ab2MlC4cGeVm5zzMt4IsS3XySQeYjyMJ5TDZ3J5rQ8bVj3xi4FpJU2yFZ72GApsHQ6A==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.15.0.tgz", + "integrity": "sha512-+8/d2tAScPjVJNyqa7GPGnqleTB/XW9dZJQ2D/oIM3wpH3TG+DaFEXBbk4QFJ9K9AUGBhvQvWU2mQyhK/yYn3Q==", "cpu": [ "s390x" ], @@ -8975,9 +8975,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-x64-gnu": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.14.0.tgz", - "integrity": "sha512-hABxQXFXJurivw+0amFdeEcK67cF1BGBIN1+sSHzq3TRv4RoG8n5q2JE04Le2n2Kpt6xg4Y5+lcv+rb2mCJLgQ==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.15.0.tgz", + "integrity": "sha512-xtvSzH7Nr5MCZI2FKImmOdTl9kzuQ51RPyLh451tvD2qnkg3BaqI9Ox78bTk57YJhlXPuxWSOL5aZhKAc9J6qg==", "cpu": [ "x64" ], @@ -8989,9 +8989,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-x64-musl": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.14.0.tgz", - "integrity": "sha512-Ln73wUB5migZRvC7obAAdqVwvFvk7AUs2JLt4g9QHr8FnqivlsjpUC9Nf2ssrybdjyQzEMjttUxPZz6aKPSAHw==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.15.0.tgz", + "integrity": "sha512-14YL1zuXj06+/tqsuUZuzL0T425WA/I4nSVN1kBXeC5WHxem6lQ+2HGvG+crjeJEqHgZUT62YIgj88W+8E7eyg==", "cpu": [ "x64" ], @@ -9002,10 +9002,24 @@ "linux" ] }, + "node_modules/@oxc-resolver/binding-openharmony-arm64": { + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.15.0.tgz", + "integrity": "sha512-/7Qli+1Wk93coxnrQaU8ySlICYN8HsgyIrzqjgIkQEpI//9eUeaeIHZptNl2fMvBGeXa7k2QgLbRNaBRgpnvMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@oxc-resolver/binding-wasm32-wasi": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.14.0.tgz", - "integrity": "sha512-z+NbELmCOKNtWOqEB5qDfHXOSWB3kGQIIehq6nHtZwHLzdVO2oBq6De/ayhY3ygriC1XhgaIzzniY7jgrNl4Kw==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.15.0.tgz", + "integrity": "sha512-q5rn2eIMQLuc/AVGR2rQKb2EVlgreATGG8xXg8f4XbbYCVgpxaq+dgMbiPStyNywW1MH8VU2T09UEm30UtOQvg==", "cpu": [ "wasm32" ], @@ -9013,16 +9027,16 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.7" + "@napi-rs/wasm-runtime": "^1.1.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.14.0.tgz", - "integrity": "sha512-Ft0+qd7HSO61qCTLJ4LCdBGZkpKyDj1rG0OVSZL1DxWQoh97m7vEHd7zAvUtw8EcWjOMBQuX4mfRap/x2MOCpQ==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.15.0.tgz", + "integrity": "sha512-yCAh2RWjU/8wWTxQDgGPgzV9QBv0/Ojb5ej1c/58iOjyTuy/J1ZQtYi2SpULjKmwIxLJdTiCHpMilauWimE31w==", "cpu": [ "arm64" ], @@ -9034,9 +9048,9 @@ ] }, "node_modules/@oxc-resolver/binding-win32-ia32-msvc": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-11.14.0.tgz", - "integrity": "sha512-o54jYNSfGdPxHSvXEhZg8FOV3K99mJ1f7hb1alRFb+Yec1GQXNrJXxZPIxNMYeFT13kwAWB7zuQ0HZLnDHFxfw==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-11.15.0.tgz", + "integrity": "sha512-lmXKb6lvA6M6QIbtYfgjd+AryJqExZVSY2bfECC18OPu7Lv1mHFF171Mai5l9hG3r4IhHPPIwT10EHoilSCYeA==", "cpu": [ "ia32" ], @@ -9048,9 +9062,9 @@ ] }, "node_modules/@oxc-resolver/binding-win32-x64-msvc": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.14.0.tgz", - "integrity": "sha512-j97icaORyM6A7GjgmUzfn7V+KGzVvctRA+eAlJb0c2OQNaETFxl6BXZdnGBDb+6oA0Y4Sr/wnekd1kQ0aVyKGg==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.15.0.tgz", + "integrity": "sha512-HZsfne0s/tGOcJK9ZdTGxsNU2P/dH0Shf0jqrPvsC6wX0Wk+6AyhSpHFLQCnLOuFQiHHU0ePfM8iYsoJb5hHpQ==", "cpu": [ "x64" ], @@ -27007,9 +27021,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.72.0", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.72.0.tgz", + "integrity": "sha512-rlyoXI8FcggNtM/QXd/GW0sbsYvNuA/zPXt7bsuVi6kVQogY2PDCr81bPpzNnl0CP8AkFm2Z2plVeL5QQSis2w==", "dev": true, "funding": [ { @@ -27029,7 +27043,7 @@ "jiti": "^2.6.0", "js-yaml": "^4.1.1", "minimist": "^1.2.8", - "oxc-resolver": "^11.13.2", + "oxc-resolver": "^11.15.0", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", @@ -30272,34 +30286,35 @@ } }, "node_modules/oxc-resolver": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.14.0.tgz", - "integrity": "sha512-i4wNrqhOd+4YdHJfHglHtFiqqSxXuzFA+RUqmmWN1aMD3r1HqUSrIhw17tSO4jwKfhLs9uw1wzFPmvMsWacStg==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.15.0.tgz", + "integrity": "sha512-Hk2J8QMYwmIO9XTCUiOH00+Xk2/+aBxRUnhrSlANDyCnLYc32R1WSIq1sU2yEdlqd53FfMpPEpnBYIKQMzliJw==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxc-resolver/binding-android-arm-eabi": "11.14.0", - "@oxc-resolver/binding-android-arm64": "11.14.0", - "@oxc-resolver/binding-darwin-arm64": "11.14.0", - "@oxc-resolver/binding-darwin-x64": "11.14.0", - "@oxc-resolver/binding-freebsd-x64": "11.14.0", - "@oxc-resolver/binding-linux-arm-gnueabihf": "11.14.0", - "@oxc-resolver/binding-linux-arm-musleabihf": "11.14.0", - "@oxc-resolver/binding-linux-arm64-gnu": "11.14.0", - "@oxc-resolver/binding-linux-arm64-musl": "11.14.0", - "@oxc-resolver/binding-linux-ppc64-gnu": "11.14.0", - "@oxc-resolver/binding-linux-riscv64-gnu": "11.14.0", - "@oxc-resolver/binding-linux-riscv64-musl": "11.14.0", - "@oxc-resolver/binding-linux-s390x-gnu": "11.14.0", - "@oxc-resolver/binding-linux-x64-gnu": "11.14.0", - "@oxc-resolver/binding-linux-x64-musl": "11.14.0", - "@oxc-resolver/binding-wasm32-wasi": "11.14.0", - "@oxc-resolver/binding-win32-arm64-msvc": "11.14.0", - "@oxc-resolver/binding-win32-ia32-msvc": "11.14.0", - "@oxc-resolver/binding-win32-x64-msvc": "11.14.0" + "@oxc-resolver/binding-android-arm-eabi": "11.15.0", + "@oxc-resolver/binding-android-arm64": "11.15.0", + "@oxc-resolver/binding-darwin-arm64": "11.15.0", + "@oxc-resolver/binding-darwin-x64": "11.15.0", + "@oxc-resolver/binding-freebsd-x64": "11.15.0", + "@oxc-resolver/binding-linux-arm-gnueabihf": "11.15.0", + "@oxc-resolver/binding-linux-arm-musleabihf": "11.15.0", + "@oxc-resolver/binding-linux-arm64-gnu": "11.15.0", + "@oxc-resolver/binding-linux-arm64-musl": "11.15.0", + "@oxc-resolver/binding-linux-ppc64-gnu": "11.15.0", + "@oxc-resolver/binding-linux-riscv64-gnu": "11.15.0", + "@oxc-resolver/binding-linux-riscv64-musl": "11.15.0", + "@oxc-resolver/binding-linux-s390x-gnu": "11.15.0", + "@oxc-resolver/binding-linux-x64-gnu": "11.15.0", + "@oxc-resolver/binding-linux-x64-musl": "11.15.0", + "@oxc-resolver/binding-openharmony-arm64": "11.15.0", + "@oxc-resolver/binding-wasm32-wasi": "11.15.0", + "@oxc-resolver/binding-win32-arm64-msvc": "11.15.0", + "@oxc-resolver/binding-win32-ia32-msvc": "11.15.0", + "@oxc-resolver/binding-win32-x64-msvc": "11.15.0" } }, "node_modules/p-cancelable": { @@ -31201,9 +31216,9 @@ } }, "node_modules/prettier": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.3.tgz", - "integrity": "sha512-QgODejq9K3OzoBbuyobZlUhznP5SKwPqp+6Q6xw6o8gnhr4O85L2U915iM2IDcfF2NPXVaM9zlo9tdwipnYwzg==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", "bin": { diff --git a/package.json b/package.json index 9786e8cea74..04bab6311b8 100644 --- a/package.json +++ b/package.json @@ -137,11 +137,11 @@ "eslint-plugin-promise": "^6.1.1", "husky": "^9.1.7", "jest-yaml-transform": "^0.2.0", - "knip": "^5.70.1", + "knip": "^5.72.0", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", "pino-pretty": "^13.1.3", - "prettier": "^3.7.3", + "prettier": "^3.7.4", "prettier-plugin-astro": "^0.14.1", "remark-gfm": "^4.0.0", "remark-mdx": "^3.1.0", From fdf02a8f4c2ab0c2c2c6e28bc5d520d0ec048a30 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Tue, 9 Dec 2025 08:13:21 -0600 Subject: [PATCH 035/214] Bin loc win (#3269) * update win bin location * update win bin location --- reports/llms-report.json | 20 +++++++++---------- .../cli-installation/windows.mdx | 2 +- src/content/cre/llms-full-go.txt | 2 +- src/content/cre/llms-full-ts.txt | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index 9c11962211e..12f5a2a1310 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,22 +1,22 @@ { - "startedAt": "2025-12-08T23:38:57.949Z", + "startedAt": "2025-12-09T14:01:39.057Z", "siteBase": "https://docs.chain.link", "sections": [ { "section": "cre-go", "pagesProcessed": 83, "outputPath": "src/content/cre/llms-full-go.txt", - "bytes": 651595, - "prevBytes": 651667, - "deltaBytes": -72 + "bytes": 651615, + "prevBytes": 651595, + "deltaBytes": 20 }, { "section": "cre-ts", "pagesProcessed": 78, "outputPath": "src/content/cre/llms-full-ts.txt", - "bytes": 607098, - "prevBytes": 607170, - "deltaBytes": -72 + "bytes": 607118, + "prevBytes": 607098, + "deltaBytes": 20 }, { "section": "vrf", @@ -87,8 +87,8 @@ "pagesProcessed": 12, "outputPath": "src/content/resources/llms-full.txt", "bytes": 338205, - "prevBytes": 331970, - "deltaBytes": 6235 + "prevBytes": 338205, + "deltaBytes": 0 }, { "section": "architecture-overview", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-08T23:39:02.321Z" + "finishedAt": "2025-12-09T14:01:43.169Z" } diff --git a/src/content/cre/getting-started/cli-installation/windows.mdx b/src/content/cre/getting-started/cli-installation/windows.mdx index e89db7362a0..6d62a29af7e 100644 --- a/src/content/cre/getting-started/cli-installation/windows.mdx +++ b/src/content/cre/getting-started/cli-installation/windows.mdx @@ -56,7 +56,7 @@ This script will: - Download the correct binary for Windows - Verify the binary's integrity -- Install it to `$HOME/.cre` +- Install it to `$env:LOCALAPPDATA\Programs\cre` - Make the binary executable After the script completes, **open a new PowerShell window** and verify the installation: diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 22417d1871b..7d6c63e89fd 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -766,7 +766,7 @@ This script will: - Download the correct binary for Windows - Verify the binary's integrity -- Install it to `$HOME/.cre` +- Install it to `$env:LOCALAPPDATA\Programs\cre` - Make the binary executable After the script completes, **open a new PowerShell window** and verify the installation: diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index f6a78640d2e..4c686b4fe36 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -766,7 +766,7 @@ This script will: - Download the correct binary for Windows - Verify the binary's integrity -- Install it to `$HOME/.cre` +- Install it to `$env:LOCALAPPDATA\Programs\cre` - Make the binary executable After the script completes, **open a new PowerShell window** and verify the installation: From 6b88810b9d7a24b7ba9fd756157531e75a7af69c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:24:32 +0000 Subject: [PATCH 036/214] Bump peter-evans/create-pull-request in the github-actions group (#3256) Bumps the github-actions group with 1 update: [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request). Updates `peter-evans/create-pull-request` from 7.0.9 to 7.0.11 - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/84ae59a2cdc2258d6fa0732dd66352dddae2a412...22a9089034f40e5a961c8808d113e2c98fb63676) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-version: 7.0.11 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> --- .github/workflows/chainlink-automation-config.yml | 2 +- .github/workflows/chains-metadata.yml | 2 +- .github/workflows/detect-new-data.yml | 2 +- .github/workflows/detect-new-tokens.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/chainlink-automation-config.yml b/.github/workflows/chainlink-automation-config.yml index 7094367496a..25baa736d3b 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@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11 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..7b37b893318 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@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11 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..8487eb0fe84 100644 --- a/.github/workflows/detect-new-data.yml +++ b/.github/workflows/detect-new-data.yml @@ -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@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: "Data: Update changelog for new data items" diff --git a/.github/workflows/detect-new-tokens.yml b/.github/workflows/detect-new-tokens.yml index 5cae81f718e..399662b3774 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@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: "CCT: Update changelog with new tokens" From 1613468ea7a9264cbe67ba400f37c2ef67fa2b84 Mon Sep 17 00:00:00 2001 From: "Amine E." <aelmanaa@users.noreply.github.com> Date: Tue, 9 Dec 2025 18:19:02 +0100 Subject: [PATCH 037/214] morph hoodi (#3270) --- public/changelog.json | 15 +++++ .../data/ccip/v1_2_0/testnet/chains.json | 20 +++++++ .../data/ccip/v1_2_0/testnet/lanes.json | 56 +++++++++++++++++++ .../data/ccip/v1_2_0/testnet/tokens.json | 25 +++++++++ src/config/data/chain-to-technology.json | 2 +- src/config/types.ts | 2 +- src/config/web3Providers.ts | 2 +- .../resources/link-token-contracts.mdx | 10 ++++ src/features/utils/index.ts | 8 +-- 9 files changed, 133 insertions(+), 7 deletions(-) diff --git a/public/changelog.json b/public/changelog.json index ff7bca050b7..dd1a8395884 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -354,6 +354,21 @@ } }, "data": [ + { + "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", diff --git a/src/config/data/ccip/v1_2_0/testnet/chains.json b/src/config/data/ccip/v1_2_0/testnet/chains.json index 3d718a9b457..fee00700444 100644 --- a/src/config/data/ccip/v1_2_0/testnet/chains.json +++ b/src/config/data/ccip/v1_2_0/testnet/chains.json @@ -470,6 +470,26 @@ "version": "1.5.1" } }, + "ethereum-testnet-hoodi-morph": { + "armProxy": { + "address": "0x9A60462e4CA802E3E945663930Be0d162e662091", + "version": "1.0.0" + }, + "chainSelector": "1064004874793747259", + "feeTokens": ["LINK", "WETH"], + "registryModule": { + "address": "0x5Dc49Ec54B92F7D493bC8126c0730DA74605cc00", + "version": "1.6.0" + }, + "router": { + "address": "0xd1CBe8dF481C7a78AaaAfB0466814d13d93bd9b7", + "version": "1.2.0" + }, + "tokenAdminRegistry": { + "address": "0x65B023D3D4Ea880B835BF2CDE48B296Ee7157EcE", + "version": "1.5.0" + } + }, "ethereum-testnet-sepolia": { "armProxy": { "address": "0xba3f6251de62dED61Ff98590cB2fDf6871FbB991", diff --git a/src/config/data/ccip/v1_2_0/testnet/lanes.json b/src/config/data/ccip/v1_2_0/testnet/lanes.json index abfe3e32fa6..567cbe4b92e 100644 --- a/src/config/data/ccip/v1_2_0/testnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/testnet/lanes.json @@ -1563,6 +1563,35 @@ } } }, + "ethereum-testnet-hoodi-morph": { + "ethereum-testnet-sepolia": { + "offRamp": { + "address": "0xa1312a58873fb9a16008E259c3eB972038ba46D9", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xAE7D1b3D8466718378038de45D4D376E73A04EB6", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "CCIP-BnM": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, "ethereum-testnet-sepolia": { "0g-testnet-galileo": { "offRamp": { @@ -2032,6 +2061,33 @@ } } }, + "ethereum-testnet-hoodi-morph": { + "offRamp": { + "address": "0x0820f975ce90EE5c508657F0C58b71D1fcc85cE0", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x23a5084Fa78104F3DF11C63Ae59fcac4f6AD9DeE", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "CCIP-BnM": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, "ethereum-testnet-sepolia-andromeda-1": { "offRamp": { "address": "0x46DE6201c258f5948135cd0262f91e48Cb8e3828", diff --git a/src/config/data/ccip/v1_2_0/testnet/tokens.json b/src/config/data/ccip/v1_2_0/testnet/tokens.json index 20fcbbe3ba4..3f0963c8f72 100644 --- a/src/config/data/ccip/v1_2_0/testnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/testnet/tokens.json @@ -127,6 +127,15 @@ "symbol": "CCIP-BnM", "tokenAddress": "0x54B50385e417469dbdb697f40651e8864664D992" }, + "ethereum-testnet-hoodi-morph": { + "allowListEnabled": false, + "decimals": 18, + "name": "CCIP-BnM", + "poolAddress": "0x693926456C8b210f56E29Bc5b4514B32A5224c88", + "poolType": "burnMint", + "symbol": "CCIP-BnM", + "tokenAddress": "0x69521081Fd90669b59b1Cb3F67a2229D36a7De00" + }, "ethereum-testnet-sepolia": { "allowListEnabled": false, "decimals": 18, @@ -795,6 +804,14 @@ "symbol": "LINK", "tokenAddress": "0x01fcdEedbA59bc68b0914D92277678dAB6827e2c" }, + "ethereum-testnet-hoodi-morph": { + "allowListEnabled": false, + "decimals": 18, + "name": "ChainLink Token", + "poolType": "feeTokenOnly", + "symbol": "LINK", + "tokenAddress": "0xe5e3a4fF1773d043a387b16Ceb3c91cC49bAFD54" + }, "ethereum-testnet-sepolia": { "allowListEnabled": false, "decimals": 18, @@ -1536,6 +1553,14 @@ "symbol": "WETH", "tokenAddress": "0xae2C46ddb314B9Ba743C6dEE4878F151881333D9" }, + "ethereum-testnet-hoodi-morph": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped Ether", + "poolType": "feeTokenOnly", + "symbol": "WETH", + "tokenAddress": "0x5300000000000000000000000000000000000011" + }, "ethereum-testnet-sepolia": { "allowListEnabled": false, "decimals": 18, diff --git a/src/config/data/chain-to-technology.json b/src/config/data/chain-to-technology.json index e85e567b058..e0f867250af 100644 --- a/src/config/data/chain-to-technology.json +++ b/src/config/data/chain-to-technology.json @@ -159,7 +159,7 @@ "NEXON_HENESYS_MAINNET": "HENESYS", "PHAROS_ATLANTIC_TESTNET": "PHAROS", "MORPH_MAINNET": "MORPH", - "MORPH_TESTNET": "MORPH", + "MORPH_HOODI_TESTNET": "MORPH", "JOVAY_MAINNET": "JOVAY", "JOVAY_TESTNET": "JOVAY", "STABLE_MAINNET": "STABLE" diff --git a/src/config/types.ts b/src/config/types.ts index 7037e1d9247..5ecab27d036 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -246,7 +246,7 @@ export type SupportedChain = | "NEXON_HENESYS_MAINNET" | "PHAROS_ATLANTIC_TESTNET" | "MORPH_MAINNET" - | "MORPH_TESTNET" + | "MORPH_HOODI_TESTNET" | "JOVAY_MAINNET" | "JOVAY_TESTNET" | "STABLE_MAINNET" diff --git a/src/config/web3Providers.ts b/src/config/web3Providers.ts index 1bf8dbbcda7..f4e1b08977b 100644 --- a/src/config/web3Providers.ts +++ b/src/config/web3Providers.ts @@ -165,7 +165,7 @@ export const chainToProvider: Record<SupportedChain, () => Provider> = { NEXON_HENESYS_MAINNET: () => new JsonRpcProvider("https://henesys-rpc.msu.io/"), PHAROS_ATLANTIC_TESTNET: () => new JsonRpcProvider("https://atlantic.dplabs-internal.com/"), MORPH_MAINNET: () => new JsonRpcProvider("https://rpc.morphl2.io"), - MORPH_TESTNET: () => new JsonRpcProvider("https://rpc-hoodi.morphl2.io/"), + MORPH_HOODI_TESTNET: () => new JsonRpcProvider("https://rpc-hoodi.morphl2.io/"), JOVAY_MAINNET: () => new JsonRpcProvider("https://rpc.jovay.io"), JOVAY_TESTNET: () => new JsonRpcProvider("https://api.zan.top/public/jovay-testnet"), STABLE_MAINNET: () => new JsonRpcProvider("https://rpc.stable.xyz"), diff --git a/src/content/resources/link-token-contracts.mdx b/src/content/resources/link-token-contracts.mdx index f6a39f47120..5d6fb00873e 100644 --- a/src/content/resources/link-token-contracts.mdx +++ b/src/content/resources/link-token-contracts.mdx @@ -1259,6 +1259,16 @@ MOVR is used to pay transaction fees on Moonriver Mainnet. | Symbol | LINK | | Decimals | 18 | +### Morph Hoodi Testnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `2910` | +| Address | <Address contractUrl="https://explorer-hoodi.morphl2.io/address/0xe5e3a4fF1773d043a387b16Ceb3c91cC49bAFD54" urlId="2910_0xe5e3a4fF1773d043a387b16Ceb3c91cC49bAFD54" urlClass="erc-token-address"/> | +| Name | Chainlink Token on Morph Hoodi Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## <img src="/assets/chains/neox.svg" style="height: 24px; width: auto; margin-right: 8px;" />Neo X ### Neo X Mainnet diff --git a/src/features/utils/index.ts b/src/features/utils/index.ts index a707ef0973d..3a6fe212dde 100644 --- a/src/features/utils/index.ts +++ b/src/features/utils/index.ts @@ -516,8 +516,8 @@ export const directoryToSupportedChain = (chainInRdd: string): SupportedChain => return "PHAROS_ATLANTIC_TESTNET" case "morph-mainnet": return "MORPH_MAINNET" - case "morph-testnet": - return "MORPH_TESTNET" + case "ethereum-testnet-hoodi-morph": + return "MORPH_HOODI_TESTNET" case "jovay-mainnet": return "JOVAY_MAINNET" case "jovay-testnet": @@ -839,8 +839,8 @@ export const supportedChainToChainInRdd = (supportedChain: SupportedChain): stri return "pharos-atlantic-testnet" case "MORPH_MAINNET": return "morph-mainnet" - case "MORPH_TESTNET": - return "morph-testnet" + case "MORPH_HOODI_TESTNET": + return "ethereum-testnet-hoodi-morph" case "JOVAY_MAINNET": return "jovay-mainnet" case "JOVAY_TESTNET": From 87c9d14f1fd144c328772b02d86344a260c28aea Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Tue, 9 Dec 2025 12:20:56 -0600 Subject: [PATCH 038/214] ReceiverTemplate update (#3252) * apply CL style guide + Receiver update * llm gen --- reports/llms-report.json | 20 +- .../part-4-writing-onchain-go.mdx | 10 +- .../part-4-writing-onchain-ts.mdx | 10 +- .../building-consumer-contracts.mdx | 237 ++++++++++++----- src/content/cre/llms-full-go.txt | 247 ++++++++++++------ src/content/cre/llms-full-ts.txt | 247 ++++++++++++------ src/content/resources/llms-full.txt | 10 + 7 files changed, 541 insertions(+), 240 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index 12f5a2a1310..286d662ad42 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,22 +1,22 @@ { - "startedAt": "2025-12-09T14:01:39.057Z", + "startedAt": "2025-12-09T18:04:32.521Z", "siteBase": "https://docs.chain.link", "sections": [ { "section": "cre-go", "pagesProcessed": 83, "outputPath": "src/content/cre/llms-full-go.txt", - "bytes": 651615, - "prevBytes": 651595, - "deltaBytes": 20 + "bytes": 655973, + "prevBytes": 651615, + "deltaBytes": 4358 }, { "section": "cre-ts", "pagesProcessed": 78, "outputPath": "src/content/cre/llms-full-ts.txt", - "bytes": 607118, - "prevBytes": 607098, - "deltaBytes": 20 + "bytes": 611476, + "prevBytes": 607118, + "deltaBytes": 4358 }, { "section": "vrf", @@ -86,9 +86,9 @@ "section": "resources", "pagesProcessed": 12, "outputPath": "src/content/resources/llms-full.txt", - "bytes": 338205, + "bytes": 339715, "prevBytes": 338205, - "deltaBytes": 0 + "deltaBytes": 1510 }, { "section": "architecture-overview", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-09T14:01:43.169Z" + "finishedAt": "2025-12-09T18:04:37.177Z" } diff --git a/src/content/cre/getting-started/part-4-writing-onchain-go.mdx b/src/content/cre/getting-started/part-4-writing-onchain-go.mdx index 530d5a03092..c0f777f4439 100644 --- a/src/content/cre/getting-started/part-4-writing-onchain-go.mdx +++ b/src/content/cre/getting-started/part-4-writing-onchain-go.mdx @@ -39,16 +39,16 @@ Here is the source code for the contract so you can see how it works: // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import { IReceiverTemplate } from "./keystone/IReceiverTemplate.sol"; +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 This version uses IReceiverTemplate without configuring any security checks, making it compatible + * @dev This version uses ReceiverTemplate without configuring any security checks, making it compatible * with the mock Forwarder used during simulation. All permission fields remain at their default zero * values (disabled). */ -contract CalculatorConsumer is IReceiverTemplate { +contract CalculatorConsumer is ReceiverTemplate { // Struct to hold the data sent in a report from the workflow struct CalculatorResult { uint256 offchainValue; @@ -66,13 +66,13 @@ contract CalculatorConsumer is IReceiverTemplate { /** * @dev The constructor doesn't set any security checks. - * The IReceiverTemplate parent constructor will initialize all permission fields to zero (disabled). + * The ReceiverTemplate parent constructor will initialize all permission fields to zero (disabled). */ constructor() {} /** * @notice Implements the core business logic for processing reports. - * @dev This is called automatically by IReceiverTemplate's onReport function after security checks. + * @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 diff --git a/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx b/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx index 5fbfb1fc583..979ca288de3 100644 --- a/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx +++ b/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx @@ -39,16 +39,16 @@ Here is the source code for the contract so you can see how it works: // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import { IReceiverTemplate } from "./keystone/IReceiverTemplate.sol"; +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 This version uses IReceiverTemplate without configuring any security checks, making it compatible + * @dev This version uses ReceiverTemplate without configuring any security checks, making it compatible * with the mock Forwarder used during simulation. All permission fields remain at their default zero * values (disabled). */ -contract CalculatorConsumer is IReceiverTemplate { +contract CalculatorConsumer is ReceiverTemplate { // Struct to hold the data sent in a report from the workflow struct CalculatorResult { uint256 offchainValue; @@ -66,13 +66,13 @@ contract CalculatorConsumer is IReceiverTemplate { /** * @dev The constructor doesn't set any security checks. - * The IReceiverTemplate parent constructor will initialize all permission fields to zero (disabled). + * The ReceiverTemplate parent constructor will initialize all permission fields to zero (disabled). */ constructor() {} /** * @notice Implements the core business logic for processing reports. - * @dev This is called automatically by IReceiverTemplate's onReport function after security checks. + * @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 diff --git a/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx b/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx index dc21f98ef96..a9570305ce9 100644 --- a/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx @@ -18,7 +18,7 @@ This guide explains how to build a consumer contract that can securely receive a - [Core Concepts: The Onchain Data Flow](#1-core-concepts-the-onchain-data-flow) - [The IReceiver Standard](#2-the-ireceiver-standard) -- [Using IReceiverTemplate](#3-using-ireceivertemplate) +- [Using ReceiverTemplate](#3-using-receivertemplate) - [Working with Simulation](#4-working-with-simulation) - [Advanced Usage](#5-advanced-usage-optional) - [Complete Examples](#6-complete-examples) @@ -44,18 +44,18 @@ interface IReceiver is IERC165 { } ``` -- `metadata`: Contains information about the workflow (ID, name, owner). +- `metadata`: Contains information about the workflow (ID, name, owner). This is encoded by the Forwarder using `abi.encodePacked` with the following structure: `bytes32 workflowId`, `bytes10 workflowName`, `address workflowOwner`. - `report`: The raw, ABI-encoded data payload from your workflow. ### 2.2 Support ERC165 Interface Detection [ERC165](https://eips.ethereum.org/EIPS/eip-165) is a standard that allows contracts to publish the interfaces they support. The `KeystoneForwarder` uses this to check if your contract supports the `IReceiver` interface before sending a report. -## 3. Using `IReceiverTemplate` +## 3. Using `ReceiverTemplate` ### 3.1 Overview -While you can implement these standards manually, we provide an abstract contract, `IReceiverTemplate.sol`, that does the heavy lifting for you. Inheriting from it is the recommended best practice. +While you can implement these standards manually, we provide an abstract contract, `ReceiverTemplate.sol`, that does the heavy lifting for you. Inheriting from it is the recommended best practice. **Key features:** @@ -76,15 +76,18 @@ import {IERC165} from "./IERC165.sol"; import {IReceiver} from "./IReceiver.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -/// @title IReceiverTemplate - Abstract receiver with optional permission controls +/// @title ReceiverTemplate - Abstract receiver with optional permission controls /// @notice Provides flexible, updatable security checks for receiving workflow reports /// @dev All permission fields default to zero (disabled). Use setter functions to enable checks. -abstract contract IReceiverTemplate is IReceiver, Ownable { +abstract contract ReceiverTemplate is IReceiver, Ownable { // Optional permission fields (all default to zero = disabled) - address public forwarderAddress; // If set, only this address can call onReport - address public expectedAuthor; // If set, only reports from this workflow owner are accepted - bytes10 public expectedWorkflowName; // If set, only reports with this workflow name are accepted - bytes32 public expectedWorkflowId; // If set, only reports from this specific workflow ID are accepted + address private s_forwarderAddress; // If set, only this address can call onReport + address private s_expectedAuthor; // If set, only reports from this workflow owner are accepted + bytes10 private s_expectedWorkflowName; // If set, only reports with this workflow name are accepted + 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 InvalidSender(address sender, address expected); @@ -92,30 +95,60 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { error InvalidWorkflowName(bytes10 received, bytes10 expected); error InvalidWorkflowId(bytes32 received, bytes32 expected); + // 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); + /// @notice Constructor sets msg.sender as the owner /// @dev All permission fields are initialized to zero (disabled by default) constructor() Ownable(msg.sender) {} + /// @notice Returns the configured forwarder address + /// @return The forwarder address (address(0) if not set) + 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 (forwarderAddress != address(0) && msg.sender != forwarderAddress) { - revert InvalidSender(msg.sender, forwarderAddress); + 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 (expectedWorkflowId != bytes32(0) || expectedAuthor != address(0) || expectedWorkflowName != bytes10(0)) { + if (s_expectedWorkflowId != bytes32(0) || s_expectedAuthor != address(0) || s_expectedWorkflowName != bytes10(0)) { (bytes32 workflowId, bytes10 workflowName, address workflowOwner) = _decodeMetadata(metadata); - if (expectedWorkflowId != bytes32(0) && workflowId != expectedWorkflowId) { - revert InvalidWorkflowId(workflowId, expectedWorkflowId); + if (s_expectedWorkflowId != bytes32(0) && workflowId != s_expectedWorkflowId) { + revert InvalidWorkflowId(workflowId, s_expectedWorkflowId); } - if (expectedAuthor != address(0) && workflowOwner != expectedAuthor) { - revert InvalidAuthor(workflowOwner, expectedAuthor); + if (s_expectedAuthor != address(0) && workflowOwner != s_expectedAuthor) { + revert InvalidAuthor(workflowOwner, s_expectedAuthor); } - if (expectedWorkflowName != bytes10(0) && workflowName != expectedWorkflowName) { - revert InvalidWorkflowName(workflowName, expectedWorkflowName); + if (s_expectedWorkflowName != bytes10(0) && workflowName != s_expectedWorkflowName) { + revert InvalidWorkflowName(workflowName, s_expectedWorkflowName); } } @@ -125,21 +158,28 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { /// @notice Updates the forwarder address that is allowed to call onReport /// @param _forwarder The new forwarder address (use address(0) to disable this check) function setForwarderAddress(address _forwarder) external onlyOwner { - forwarderAddress = _forwarder; + address previousForwarder = s_forwarderAddress; + 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 { - expectedAuthor = _author; + 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 The name is hashed using SHA256 and truncated function setExpectedWorkflowName(string calldata _name) external onlyOwner { + bytes10 previousName = s_expectedWorkflowName; + if (bytes(_name).length == 0) { - expectedWorkflowName = bytes10(0); + s_expectedWorkflowName = bytes10(0); + emit ExpectedWorkflowNameUpdated(previousName, bytes10(0)); return; } @@ -148,35 +188,37 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { bytes32 hash = sha256(bytes(_name)); bytes memory hexString = _bytesToHexString(abi.encodePacked(hash)); bytes memory first10 = new bytes(10); - for (uint i = 0; i < 10; i++) { + for (uint256 i = 0; i < 10; i++) { first10[i] = hexString[i]; } - expectedWorkflowName = bytes10(first10); + 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 { - expectedWorkflowId = _id; + 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 hexChars = "0123456789abcdef"; bytes memory hexString = new bytes(data.length * 2); for (uint256 i = 0; i < data.length; i++) { - hexString[i * 2] = hexChars[uint8(data[i] >> 4)]; - hexString[i * 2 + 1] = hexChars[uint8(data[i] & 0x0f)]; + 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 in bytes format + /// @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 @@ -185,7 +227,7 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { pure returns (bytes32 workflowId, bytes10 workflowName, address workflowOwner) { - // Metadata structure: + // 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) @@ -195,6 +237,7 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { 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 @@ -211,24 +254,24 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { ### 3.3 Quick Start -The simplest way to use `IReceiverTemplate` is to inherit from it and implement the `_processReport` function: +The simplest way to use `ReceiverTemplate` is to inherit from it and implement the `_processReport` function: ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.26; -import { IReceiverTemplate } from "./IReceiverTemplate.sol"; +import { ReceiverTemplate } from "./ReceiverTemplate.sol"; -contract MyConsumer is IReceiverTemplate { - uint256 public storedValue; +contract MyConsumer is ReceiverTemplate { + uint256 public s_storedValue; event ValueUpdated(uint256 newValue); // Simple constructor - no parameters needed - constructor() IReceiverTemplate() {} + constructor() ReceiverTemplate() {} // Implement your business logic here function _processReport(bytes calldata report) internal override { uint256 newValue = abi.decode(report, (uint256)); - storedValue = newValue; + s_storedValue = newValue; emit ValueUpdated(newValue); } } @@ -287,7 +330,7 @@ myConsumer.setExpectedWorkflowName(""); // Empty string disables the check #### How workflow names are encoded -The `workflowName` field in the metadata uses the **`bytes10`** type rather than plaintext strings. When you call `setExpectedWorkflowName("my_workflow")`, the `IReceiverTemplate` automatically encodes it using the same algorithm as the CRE engine: +The `workflowName` field in the metadata uses the **`bytes10`** type rather than plaintext strings. When you call `setExpectedWorkflowName("my_workflow")`, the `ReceiverTemplate` automatically encodes it using the same algorithm as the CRE engine: 1. Compute SHA256 hash of the workflow name 1. Convert hash to hex string (64 characters) @@ -366,25 +409,27 @@ See [Configuring Permissions](#34-configuring-permissions) for complete details. You can override `onReport` to add your own validation logic before or after the standard checks: ```solidity -import { IReceiverTemplate } from "./IReceiverTemplate.sol"; +import { ReceiverTemplate } from "./ReceiverTemplate.sol"; -contract AdvancedConsumer is IReceiverTemplate { - uint256 public minReportInterval = 1 hours; - uint256 public lastReportTime; +contract AdvancedConsumer is ReceiverTemplate { + uint256 private s_minReportInterval = 1 hours; + uint256 private s_lastReportTime; error ReportTooFrequent(uint256 timeSinceLastReport, uint256 minInterval); + event MinReportIntervalUpdated(uint256 previousInterval, uint256 newInterval); + // Add custom validation before parent's checks function onReport(bytes calldata metadata, bytes calldata report) external override { // Custom check: Rate limiting - if (block.timestamp < lastReportTime + minReportInterval) { - revert ReportTooFrequent(block.timestamp - lastReportTime, minReportInterval); + if (block.timestamp < s_lastReportTime + s_minReportInterval) { + revert ReportTooFrequent(block.timestamp - s_lastReportTime, s_minReportInterval); } // Call parent implementation for standard permission checks super.onReport(metadata, report); - lastReportTime = block.timestamp; + s_lastReportTime = block.timestamp; } function _processReport(bytes calldata report) internal override { @@ -393,9 +438,24 @@ contract AdvancedConsumer is IReceiverTemplate { // ... store or process the value ... } - // Allow owner to update rate limit + /// @notice Returns the minimum interval between reports + /// @return The minimum interval in seconds + function getMinReportInterval() external view returns (uint256) { + return s_minReportInterval; + } + + /// @notice Returns the timestamp of the last report + /// @return The last report timestamp + function getLastReportTime() external view returns (uint256) { + return s_lastReportTime; + } + + /// @notice Updates the minimum interval between reports + /// @param _interval The new minimum interval in seconds function setMinReportInterval(uint256 _interval) external onlyOwner { - minReportInterval = _interval; + uint256 previousInterval = s_minReportInterval; + s_minReportInterval = _interval; + emit MinReportIntervalUpdated(previousInterval, _interval); } } ``` @@ -405,8 +465,8 @@ contract AdvancedConsumer is IReceiverTemplate { The `_decodeMetadata` helper function is available for use in your `_processReport` implementation. This allows you to access workflow metadata for custom business logic: ```solidity -contract MetadataAwareConsumer is IReceiverTemplate { - mapping(bytes32 => uint256) public reportCountByWorkflow; +contract MetadataAwareConsumer is ReceiverTemplate { + mapping(bytes32 => uint256) public s_reportCountByWorkflow; function _processReport(bytes calldata report) internal override { // Access the metadata to get workflow ID @@ -414,7 +474,7 @@ contract MetadataAwareConsumer is IReceiverTemplate { (bytes32 workflowId, , ) = _decodeMetadata(metadata); // Use workflow ID in your business logic - reportCountByWorkflow[workflowId]++; + s_reportCountByWorkflow[workflowId]++; // Process the report data uint256 value = abi.decode(report, (uint256)); @@ -432,23 +492,23 @@ contract MetadataAwareConsumer is IReceiverTemplate { ### Example 1: Simple Consumer Contract -This example inherits from `IReceiverTemplate` to store a temperature value. +This example inherits from `ReceiverTemplate` to store a temperature value. ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.26; -import { IReceiverTemplate } from "./IReceiverTemplate.sol"; +import { ReceiverTemplate } from "./ReceiverTemplate.sol"; -contract TemperatureConsumer is IReceiverTemplate { - int256 public currentTemperature; +contract TemperatureConsumer is ReceiverTemplate { + int256 public s_currentTemperature; event TemperatureUpdated(int256 newTemperature); // Simple constructor - no parameters needed - constructor() IReceiverTemplate() {} + constructor() ReceiverTemplate() {} function _processReport(bytes calldata report) internal override { int256 newTemperature = abi.decode(report, (int256)); - currentTemperature = newTemperature; + s_currentTemperature = newTemperature; emit TemperatureUpdated(newTemperature); } } @@ -469,7 +529,7 @@ temperatureConsumer.setExpectedWorkflowId(0xYourWorkflowId...); For more complex scenarios, it's best to separate your Chainlink-aware code from your core business logic. The **Proxy Pattern** is a robust architecture that uses two contracts to achieve this: - **A Logic Contract**: Holds the state and the core functions of your application. It knows nothing about the Forwarder contract or the `onReport` function. -- **A Proxy Contract**: Acts as the secure entry point. It inherits from `IReceiverTemplate` and forwards validated reports to the Logic Contract. +- **A Proxy Contract**: Acts as the secure entry point. It inherits from `ReceiverTemplate` and forwards validated reports to the Logic Contract. This separation makes your business logic more modular and reusable. @@ -489,28 +549,59 @@ contract ReserveManager is Ownable { uint256 btcPrice; } - address public proxyAddress; - uint256 public lastEthPrice; - uint256 public lastBtcPrice; - uint256 public lastUpdateTime; + address private s_proxyAddress; + uint256 private s_lastEthPrice; + uint256 private s_lastBtcPrice; + uint256 private s_lastUpdateTime; event ReservesUpdated(uint256 ethPrice, uint256 btcPrice, uint256 updateTime); + event ProxyAddressUpdated(address indexed previousProxy, address indexed newProxy); modifier onlyProxy() { - require(msg.sender == proxyAddress, "Caller is not the authorized proxy"); + require(msg.sender == s_proxyAddress, "Caller is not the authorized proxy"); _; } constructor() Ownable(msg.sender) {} + /// @notice Returns the proxy address + /// @return The authorized proxy address + function getProxyAddress() external view returns (address) { + return s_proxyAddress; + } + + /// @notice Returns the last ETH price + /// @return The last recorded ETH price + function getLastEthPrice() external view returns (uint256) { + return s_lastEthPrice; + } + + /// @notice Returns the last BTC price + /// @return The last recorded BTC price + function getLastBtcPrice() external view returns (uint256) { + return s_lastBtcPrice; + } + + /// @notice Returns the last update timestamp + /// @return The timestamp of the last update + function getLastUpdateTime() external view returns (uint256) { + return s_lastUpdateTime; + } + + /// @notice Updates the authorized proxy address + /// @param _proxyAddress The new proxy address function setProxyAddress(address _proxyAddress) external onlyOwner { - proxyAddress = _proxyAddress; + address previousProxy = s_proxyAddress; + s_proxyAddress = _proxyAddress; + emit ProxyAddressUpdated(previousProxy, _proxyAddress); } + /// @notice Updates the reserve prices + /// @param data The new reserve data containing ETH and BTC prices function updateReserves(UpdateReserves memory data) external onlyProxy { - lastEthPrice = data.ethPrice; - lastBtcPrice = data.btcPrice; - lastUpdateTime = block.timestamp; + s_lastEthPrice = data.ethPrice; + s_lastBtcPrice = data.btcPrice; + s_lastUpdateTime = block.timestamp; emit ReservesUpdated(data.ethPrice, data.btcPrice, block.timestamp); } } @@ -518,23 +609,29 @@ contract ReserveManager is Ownable { #### The Proxy Contract (`UpdateReservesProxy.sol`) -This contract, our "bouncer", is the only contract that interacts with the Chainlink platform. It inherits `IReceiverTemplate` to validate incoming reports and then calls the `ReserveManager`. +This contract, our "bouncer", is the only contract that interacts with the Chainlink platform. It inherits `ReceiverTemplate` to validate incoming reports and then calls the `ReserveManager`. ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import { ReserveManager } from "./ReserveManager.sol"; -import { IReceiverTemplate } from "./keystone/IReceiverTemplate.sol"; +import { ReceiverTemplate } from "./ReceiverTemplate.sol"; -contract UpdateReservesProxy is IReceiverTemplate { - ReserveManager public s_reserveManager; +contract UpdateReservesProxy is ReceiverTemplate { + ReserveManager private s_reserveManager; constructor(address reserveManagerAddress) { s_reserveManager = ReserveManager(reserveManagerAddress); } - /// @inheritdoc IReceiverTemplate + /// @notice Returns the reserve manager contract address + /// @return The ReserveManager contract instance + function getReserveManager() external view returns (ReserveManager) { + return s_reserveManager; + } + + /// @inheritdoc ReceiverTemplate function _processReport(bytes calldata report) internal override { ReserveManager.UpdateReserves memory updateReservesData = abi.decode(report, (ReserveManager.UpdateReserves)); s_reserveManager.updateReserves(updateReservesData); diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 7d6c63e89fd..be883d85541 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -2344,7 +2344,7 @@ This guide explains how to build a consumer contract that can securely receive a - [Core Concepts: The Onchain Data Flow](#1-core-concepts-the-onchain-data-flow) - [The IReceiver Standard](#2-the-ireceiver-standard) -- [Using IReceiverTemplate](#3-using-ireceivertemplate) +- [Using ReceiverTemplate](#3-using-receivertemplate) - [Working with Simulation](#4-working-with-simulation) - [Advanced Usage](#5-advanced-usage-optional) - [Complete Examples](#6-complete-examples) @@ -2370,18 +2370,18 @@ interface IReceiver is IERC165 { } ``` -- `metadata`: Contains information about the workflow (ID, name, owner). +- `metadata`: Contains information about the workflow (ID, name, owner). This is encoded by the Forwarder using `abi.encodePacked` with the following structure: `bytes32 workflowId`, `bytes10 workflowName`, `address workflowOwner`. - `report`: The raw, ABI-encoded data payload from your workflow. ### 2.2 Support ERC165 Interface Detection [ERC165](https://eips.ethereum.org/EIPS/eip-165) is a standard that allows contracts to publish the interfaces they support. The `KeystoneForwarder` uses this to check if your contract supports the `IReceiver` interface before sending a report. -## 3. Using `IReceiverTemplate` +## 3. Using `ReceiverTemplate` ### 3.1 Overview -While you can implement these standards manually, we provide an abstract contract, `IReceiverTemplate.sol`, that does the heavy lifting for you. Inheriting from it is the recommended best practice. +While you can implement these standards manually, we provide an abstract contract, `ReceiverTemplate.sol`, that does the heavy lifting for you. Inheriting from it is the recommended best practice. **Key features:** @@ -2402,15 +2402,18 @@ import {IERC165} from "./IERC165.sol"; import {IReceiver} from "./IReceiver.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -/// @title IReceiverTemplate - Abstract receiver with optional permission controls +/// @title ReceiverTemplate - Abstract receiver with optional permission controls /// @notice Provides flexible, updatable security checks for receiving workflow reports /// @dev All permission fields default to zero (disabled). Use setter functions to enable checks. -abstract contract IReceiverTemplate is IReceiver, Ownable { +abstract contract ReceiverTemplate is IReceiver, Ownable { // Optional permission fields (all default to zero = disabled) - address public forwarderAddress; // If set, only this address can call onReport - address public expectedAuthor; // If set, only reports from this workflow owner are accepted - bytes10 public expectedWorkflowName; // If set, only reports with this workflow name are accepted - bytes32 public expectedWorkflowId; // If set, only reports from this specific workflow ID are accepted + address private s_forwarderAddress; // If set, only this address can call onReport + address private s_expectedAuthor; // If set, only reports from this workflow owner are accepted + bytes10 private s_expectedWorkflowName; // If set, only reports with this workflow name are accepted + 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 InvalidSender(address sender, address expected); @@ -2418,30 +2421,60 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { error InvalidWorkflowName(bytes10 received, bytes10 expected); error InvalidWorkflowId(bytes32 received, bytes32 expected); + // 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); + /// @notice Constructor sets msg.sender as the owner /// @dev All permission fields are initialized to zero (disabled by default) constructor() Ownable(msg.sender) {} + /// @notice Returns the configured forwarder address + /// @return The forwarder address (address(0) if not set) + 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 (forwarderAddress != address(0) && msg.sender != forwarderAddress) { - revert InvalidSender(msg.sender, forwarderAddress); + 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 (expectedWorkflowId != bytes32(0) || expectedAuthor != address(0) || expectedWorkflowName != bytes10(0)) { + if (s_expectedWorkflowId != bytes32(0) || s_expectedAuthor != address(0) || s_expectedWorkflowName != bytes10(0)) { (bytes32 workflowId, bytes10 workflowName, address workflowOwner) = _decodeMetadata(metadata); - if (expectedWorkflowId != bytes32(0) && workflowId != expectedWorkflowId) { - revert InvalidWorkflowId(workflowId, expectedWorkflowId); + if (s_expectedWorkflowId != bytes32(0) && workflowId != s_expectedWorkflowId) { + revert InvalidWorkflowId(workflowId, s_expectedWorkflowId); } - if (expectedAuthor != address(0) && workflowOwner != expectedAuthor) { - revert InvalidAuthor(workflowOwner, expectedAuthor); + if (s_expectedAuthor != address(0) && workflowOwner != s_expectedAuthor) { + revert InvalidAuthor(workflowOwner, s_expectedAuthor); } - if (expectedWorkflowName != bytes10(0) && workflowName != expectedWorkflowName) { - revert InvalidWorkflowName(workflowName, expectedWorkflowName); + if (s_expectedWorkflowName != bytes10(0) && workflowName != s_expectedWorkflowName) { + revert InvalidWorkflowName(workflowName, s_expectedWorkflowName); } } @@ -2451,21 +2484,28 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { /// @notice Updates the forwarder address that is allowed to call onReport /// @param _forwarder The new forwarder address (use address(0) to disable this check) function setForwarderAddress(address _forwarder) external onlyOwner { - forwarderAddress = _forwarder; + address previousForwarder = s_forwarderAddress; + 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 { - expectedAuthor = _author; + 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 The name is hashed using SHA256 and truncated function setExpectedWorkflowName(string calldata _name) external onlyOwner { + bytes10 previousName = s_expectedWorkflowName; + if (bytes(_name).length == 0) { - expectedWorkflowName = bytes10(0); + s_expectedWorkflowName = bytes10(0); + emit ExpectedWorkflowNameUpdated(previousName, bytes10(0)); return; } @@ -2474,35 +2514,37 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { bytes32 hash = sha256(bytes(_name)); bytes memory hexString = _bytesToHexString(abi.encodePacked(hash)); bytes memory first10 = new bytes(10); - for (uint i = 0; i < 10; i++) { + for (uint256 i = 0; i < 10; i++) { first10[i] = hexString[i]; } - expectedWorkflowName = bytes10(first10); + 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 { - expectedWorkflowId = _id; + 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 hexChars = "0123456789abcdef"; bytes memory hexString = new bytes(data.length * 2); for (uint256 i = 0; i < data.length; i++) { - hexString[i * 2] = hexChars[uint8(data[i] >> 4)]; - hexString[i * 2 + 1] = hexChars[uint8(data[i] & 0x0f)]; + 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 in bytes format + /// @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 @@ -2511,7 +2553,7 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { pure returns (bytes32 workflowId, bytes10 workflowName, address workflowOwner) { - // Metadata structure: + // 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) @@ -2521,6 +2563,7 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { 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 @@ -2537,24 +2580,24 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { ### 3.3 Quick Start -The simplest way to use `IReceiverTemplate` is to inherit from it and implement the `_processReport` function: +The simplest way to use `ReceiverTemplate` is to inherit from it and implement the `_processReport` function: ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.26; -import { IReceiverTemplate } from "./IReceiverTemplate.sol"; +import { ReceiverTemplate } from "./ReceiverTemplate.sol"; -contract MyConsumer is IReceiverTemplate { - uint256 public storedValue; +contract MyConsumer is ReceiverTemplate { + uint256 public s_storedValue; event ValueUpdated(uint256 newValue); // Simple constructor - no parameters needed - constructor() IReceiverTemplate() {} + constructor() ReceiverTemplate() {} // Implement your business logic here function _processReport(bytes calldata report) internal override { uint256 newValue = abi.decode(report, (uint256)); - storedValue = newValue; + s_storedValue = newValue; emit ValueUpdated(newValue); } } @@ -2613,7 +2656,7 @@ myConsumer.setExpectedWorkflowName(""); // Empty string disables the check #### How workflow names are encoded -The `workflowName` field in the metadata uses the **`bytes10`** type rather than plaintext strings. When you call `setExpectedWorkflowName("my_workflow")`, the `IReceiverTemplate` automatically encodes it using the same algorithm as the CRE engine: +The `workflowName` field in the metadata uses the **`bytes10`** type rather than plaintext strings. When you call `setExpectedWorkflowName("my_workflow")`, the `ReceiverTemplate` automatically encodes it using the same algorithm as the CRE engine: 1. Compute SHA256 hash of the workflow name 2. Convert hash to hex string (64 characters) @@ -2692,25 +2735,27 @@ See [Configuring Permissions](#34-configuring-permissions) for complete details. You can override `onReport` to add your own validation logic before or after the standard checks: ```solidity -import { IReceiverTemplate } from "./IReceiverTemplate.sol"; +import { ReceiverTemplate } from "./ReceiverTemplate.sol"; -contract AdvancedConsumer is IReceiverTemplate { - uint256 public minReportInterval = 1 hours; - uint256 public lastReportTime; +contract AdvancedConsumer is ReceiverTemplate { + uint256 private s_minReportInterval = 1 hours; + uint256 private s_lastReportTime; error ReportTooFrequent(uint256 timeSinceLastReport, uint256 minInterval); + event MinReportIntervalUpdated(uint256 previousInterval, uint256 newInterval); + // Add custom validation before parent's checks function onReport(bytes calldata metadata, bytes calldata report) external override { // Custom check: Rate limiting - if (block.timestamp < lastReportTime + minReportInterval) { - revert ReportTooFrequent(block.timestamp - lastReportTime, minReportInterval); + if (block.timestamp < s_lastReportTime + s_minReportInterval) { + revert ReportTooFrequent(block.timestamp - s_lastReportTime, s_minReportInterval); } // Call parent implementation for standard permission checks super.onReport(metadata, report); - lastReportTime = block.timestamp; + s_lastReportTime = block.timestamp; } function _processReport(bytes calldata report) internal override { @@ -2719,9 +2764,24 @@ contract AdvancedConsumer is IReceiverTemplate { // ... store or process the value ... } - // Allow owner to update rate limit + /// @notice Returns the minimum interval between reports + /// @return The minimum interval in seconds + function getMinReportInterval() external view returns (uint256) { + return s_minReportInterval; + } + + /// @notice Returns the timestamp of the last report + /// @return The last report timestamp + function getLastReportTime() external view returns (uint256) { + return s_lastReportTime; + } + + /// @notice Updates the minimum interval between reports + /// @param _interval The new minimum interval in seconds function setMinReportInterval(uint256 _interval) external onlyOwner { - minReportInterval = _interval; + uint256 previousInterval = s_minReportInterval; + s_minReportInterval = _interval; + emit MinReportIntervalUpdated(previousInterval, _interval); } } ``` @@ -2731,8 +2791,8 @@ contract AdvancedConsumer is IReceiverTemplate { The `_decodeMetadata` helper function is available for use in your `_processReport` implementation. This allows you to access workflow metadata for custom business logic: ```solidity -contract MetadataAwareConsumer is IReceiverTemplate { - mapping(bytes32 => uint256) public reportCountByWorkflow; +contract MetadataAwareConsumer is ReceiverTemplate { + mapping(bytes32 => uint256) public s_reportCountByWorkflow; function _processReport(bytes calldata report) internal override { // Access the metadata to get workflow ID @@ -2740,7 +2800,7 @@ contract MetadataAwareConsumer is IReceiverTemplate { (bytes32 workflowId, , ) = _decodeMetadata(metadata); // Use workflow ID in your business logic - reportCountByWorkflow[workflowId]++; + s_reportCountByWorkflow[workflowId]++; // Process the report data uint256 value = abi.decode(report, (uint256)); @@ -2758,23 +2818,23 @@ contract MetadataAwareConsumer is IReceiverTemplate { ### Example 1: Simple Consumer Contract -This example inherits from `IReceiverTemplate` to store a temperature value. +This example inherits from `ReceiverTemplate` to store a temperature value. ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.26; -import { IReceiverTemplate } from "./IReceiverTemplate.sol"; +import { ReceiverTemplate } from "./ReceiverTemplate.sol"; -contract TemperatureConsumer is IReceiverTemplate { - int256 public currentTemperature; +contract TemperatureConsumer is ReceiverTemplate { + int256 public s_currentTemperature; event TemperatureUpdated(int256 newTemperature); // Simple constructor - no parameters needed - constructor() IReceiverTemplate() {} + constructor() ReceiverTemplate() {} function _processReport(bytes calldata report) internal override { int256 newTemperature = abi.decode(report, (int256)); - currentTemperature = newTemperature; + s_currentTemperature = newTemperature; emit TemperatureUpdated(newTemperature); } } @@ -2795,7 +2855,7 @@ temperatureConsumer.setExpectedWorkflowId(0xYourWorkflowId...); For more complex scenarios, it's best to separate your Chainlink-aware code from your core business logic. The **Proxy Pattern** is a robust architecture that uses two contracts to achieve this: - **A Logic Contract**: Holds the state and the core functions of your application. It knows nothing about the Forwarder contract or the `onReport` function. -- **A Proxy Contract**: Acts as the secure entry point. It inherits from `IReceiverTemplate` and forwards validated reports to the Logic Contract. +- **A Proxy Contract**: Acts as the secure entry point. It inherits from `ReceiverTemplate` and forwards validated reports to the Logic Contract. This separation makes your business logic more modular and reusable. @@ -2815,28 +2875,59 @@ contract ReserveManager is Ownable { uint256 btcPrice; } - address public proxyAddress; - uint256 public lastEthPrice; - uint256 public lastBtcPrice; - uint256 public lastUpdateTime; + address private s_proxyAddress; + uint256 private s_lastEthPrice; + uint256 private s_lastBtcPrice; + uint256 private s_lastUpdateTime; event ReservesUpdated(uint256 ethPrice, uint256 btcPrice, uint256 updateTime); + event ProxyAddressUpdated(address indexed previousProxy, address indexed newProxy); modifier onlyProxy() { - require(msg.sender == proxyAddress, "Caller is not the authorized proxy"); + require(msg.sender == s_proxyAddress, "Caller is not the authorized proxy"); _; } constructor() Ownable(msg.sender) {} + /// @notice Returns the proxy address + /// @return The authorized proxy address + function getProxyAddress() external view returns (address) { + return s_proxyAddress; + } + + /// @notice Returns the last ETH price + /// @return The last recorded ETH price + function getLastEthPrice() external view returns (uint256) { + return s_lastEthPrice; + } + + /// @notice Returns the last BTC price + /// @return The last recorded BTC price + function getLastBtcPrice() external view returns (uint256) { + return s_lastBtcPrice; + } + + /// @notice Returns the last update timestamp + /// @return The timestamp of the last update + function getLastUpdateTime() external view returns (uint256) { + return s_lastUpdateTime; + } + + /// @notice Updates the authorized proxy address + /// @param _proxyAddress The new proxy address function setProxyAddress(address _proxyAddress) external onlyOwner { - proxyAddress = _proxyAddress; + address previousProxy = s_proxyAddress; + s_proxyAddress = _proxyAddress; + emit ProxyAddressUpdated(previousProxy, _proxyAddress); } + /// @notice Updates the reserve prices + /// @param data The new reserve data containing ETH and BTC prices function updateReserves(UpdateReserves memory data) external onlyProxy { - lastEthPrice = data.ethPrice; - lastBtcPrice = data.btcPrice; - lastUpdateTime = block.timestamp; + s_lastEthPrice = data.ethPrice; + s_lastBtcPrice = data.btcPrice; + s_lastUpdateTime = block.timestamp; emit ReservesUpdated(data.ethPrice, data.btcPrice, block.timestamp); } } @@ -2844,23 +2935,29 @@ contract ReserveManager is Ownable { #### The Proxy Contract (`UpdateReservesProxy.sol`) -This contract, our "bouncer", is the only contract that interacts with the Chainlink platform. It inherits `IReceiverTemplate` to validate incoming reports and then calls the `ReserveManager`. +This contract, our "bouncer", is the only contract that interacts with the Chainlink platform. It inherits `ReceiverTemplate` to validate incoming reports and then calls the `ReserveManager`. ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import { ReserveManager } from "./ReserveManager.sol"; -import { IReceiverTemplate } from "./keystone/IReceiverTemplate.sol"; +import { ReceiverTemplate } from "./ReceiverTemplate.sol"; -contract UpdateReservesProxy is IReceiverTemplate { - ReserveManager public s_reserveManager; +contract UpdateReservesProxy is ReceiverTemplate { + ReserveManager private s_reserveManager; constructor(address reserveManagerAddress) { s_reserveManager = ReserveManager(reserveManagerAddress); } - /// @inheritdoc IReceiverTemplate + /// @notice Returns the reserve manager contract address + /// @return The ReserveManager contract instance + function getReserveManager() external view returns (ReserveManager) { + return s_reserveManager; + } + + /// @inheritdoc ReceiverTemplate function _processReport(bytes calldata report) internal override { ReserveManager.UpdateReserves memory updateReservesData = abi.decode(report, (ReserveManager.UpdateReserves)); s_reserveManager.updateReserves(updateReservesData); @@ -9227,16 +9324,16 @@ Here is the source code for the contract so you can see how it works: // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import { IReceiverTemplate } from "./keystone/IReceiverTemplate.sol"; +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 This version uses IReceiverTemplate without configuring any security checks, making it compatible + * @dev This version uses ReceiverTemplate without configuring any security checks, making it compatible * with the mock Forwarder used during simulation. All permission fields remain at their default zero * values (disabled). */ -contract CalculatorConsumer is IReceiverTemplate { +contract CalculatorConsumer is ReceiverTemplate { // Struct to hold the data sent in a report from the workflow struct CalculatorResult { uint256 offchainValue; @@ -9254,13 +9351,13 @@ contract CalculatorConsumer is IReceiverTemplate { /** * @dev The constructor doesn't set any security checks. - * The IReceiverTemplate parent constructor will initialize all permission fields to zero (disabled). + * The ReceiverTemplate parent constructor will initialize all permission fields to zero (disabled). */ constructor() {} /** * @notice Implements the core business logic for processing reports. - * @dev This is called automatically by IReceiverTemplate's onReport function after security checks. + * @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 diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index 4c686b4fe36..4c79ca12976 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -1933,7 +1933,7 @@ This guide explains how to build a consumer contract that can securely receive a - [Core Concepts: The Onchain Data Flow](#1-core-concepts-the-onchain-data-flow) - [The IReceiver Standard](#2-the-ireceiver-standard) -- [Using IReceiverTemplate](#3-using-ireceivertemplate) +- [Using ReceiverTemplate](#3-using-receivertemplate) - [Working with Simulation](#4-working-with-simulation) - [Advanced Usage](#5-advanced-usage-optional) - [Complete Examples](#6-complete-examples) @@ -1959,18 +1959,18 @@ interface IReceiver is IERC165 { } ``` -- `metadata`: Contains information about the workflow (ID, name, owner). +- `metadata`: Contains information about the workflow (ID, name, owner). This is encoded by the Forwarder using `abi.encodePacked` with the following structure: `bytes32 workflowId`, `bytes10 workflowName`, `address workflowOwner`. - `report`: The raw, ABI-encoded data payload from your workflow. ### 2.2 Support ERC165 Interface Detection [ERC165](https://eips.ethereum.org/EIPS/eip-165) is a standard that allows contracts to publish the interfaces they support. The `KeystoneForwarder` uses this to check if your contract supports the `IReceiver` interface before sending a report. -## 3. Using `IReceiverTemplate` +## 3. Using `ReceiverTemplate` ### 3.1 Overview -While you can implement these standards manually, we provide an abstract contract, `IReceiverTemplate.sol`, that does the heavy lifting for you. Inheriting from it is the recommended best practice. +While you can implement these standards manually, we provide an abstract contract, `ReceiverTemplate.sol`, that does the heavy lifting for you. Inheriting from it is the recommended best practice. **Key features:** @@ -1991,15 +1991,18 @@ import {IERC165} from "./IERC165.sol"; import {IReceiver} from "./IReceiver.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -/// @title IReceiverTemplate - Abstract receiver with optional permission controls +/// @title ReceiverTemplate - Abstract receiver with optional permission controls /// @notice Provides flexible, updatable security checks for receiving workflow reports /// @dev All permission fields default to zero (disabled). Use setter functions to enable checks. -abstract contract IReceiverTemplate is IReceiver, Ownable { +abstract contract ReceiverTemplate is IReceiver, Ownable { // Optional permission fields (all default to zero = disabled) - address public forwarderAddress; // If set, only this address can call onReport - address public expectedAuthor; // If set, only reports from this workflow owner are accepted - bytes10 public expectedWorkflowName; // If set, only reports with this workflow name are accepted - bytes32 public expectedWorkflowId; // If set, only reports from this specific workflow ID are accepted + address private s_forwarderAddress; // If set, only this address can call onReport + address private s_expectedAuthor; // If set, only reports from this workflow owner are accepted + bytes10 private s_expectedWorkflowName; // If set, only reports with this workflow name are accepted + 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 InvalidSender(address sender, address expected); @@ -2007,30 +2010,60 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { error InvalidWorkflowName(bytes10 received, bytes10 expected); error InvalidWorkflowId(bytes32 received, bytes32 expected); + // 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); + /// @notice Constructor sets msg.sender as the owner /// @dev All permission fields are initialized to zero (disabled by default) constructor() Ownable(msg.sender) {} + /// @notice Returns the configured forwarder address + /// @return The forwarder address (address(0) if not set) + 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 (forwarderAddress != address(0) && msg.sender != forwarderAddress) { - revert InvalidSender(msg.sender, forwarderAddress); + 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 (expectedWorkflowId != bytes32(0) || expectedAuthor != address(0) || expectedWorkflowName != bytes10(0)) { + if (s_expectedWorkflowId != bytes32(0) || s_expectedAuthor != address(0) || s_expectedWorkflowName != bytes10(0)) { (bytes32 workflowId, bytes10 workflowName, address workflowOwner) = _decodeMetadata(metadata); - if (expectedWorkflowId != bytes32(0) && workflowId != expectedWorkflowId) { - revert InvalidWorkflowId(workflowId, expectedWorkflowId); + if (s_expectedWorkflowId != bytes32(0) && workflowId != s_expectedWorkflowId) { + revert InvalidWorkflowId(workflowId, s_expectedWorkflowId); } - if (expectedAuthor != address(0) && workflowOwner != expectedAuthor) { - revert InvalidAuthor(workflowOwner, expectedAuthor); + if (s_expectedAuthor != address(0) && workflowOwner != s_expectedAuthor) { + revert InvalidAuthor(workflowOwner, s_expectedAuthor); } - if (expectedWorkflowName != bytes10(0) && workflowName != expectedWorkflowName) { - revert InvalidWorkflowName(workflowName, expectedWorkflowName); + if (s_expectedWorkflowName != bytes10(0) && workflowName != s_expectedWorkflowName) { + revert InvalidWorkflowName(workflowName, s_expectedWorkflowName); } } @@ -2040,21 +2073,28 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { /// @notice Updates the forwarder address that is allowed to call onReport /// @param _forwarder The new forwarder address (use address(0) to disable this check) function setForwarderAddress(address _forwarder) external onlyOwner { - forwarderAddress = _forwarder; + address previousForwarder = s_forwarderAddress; + 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 { - expectedAuthor = _author; + 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 The name is hashed using SHA256 and truncated function setExpectedWorkflowName(string calldata _name) external onlyOwner { + bytes10 previousName = s_expectedWorkflowName; + if (bytes(_name).length == 0) { - expectedWorkflowName = bytes10(0); + s_expectedWorkflowName = bytes10(0); + emit ExpectedWorkflowNameUpdated(previousName, bytes10(0)); return; } @@ -2063,35 +2103,37 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { bytes32 hash = sha256(bytes(_name)); bytes memory hexString = _bytesToHexString(abi.encodePacked(hash)); bytes memory first10 = new bytes(10); - for (uint i = 0; i < 10; i++) { + for (uint256 i = 0; i < 10; i++) { first10[i] = hexString[i]; } - expectedWorkflowName = bytes10(first10); + 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 { - expectedWorkflowId = _id; + 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 hexChars = "0123456789abcdef"; bytes memory hexString = new bytes(data.length * 2); for (uint256 i = 0; i < data.length; i++) { - hexString[i * 2] = hexChars[uint8(data[i] >> 4)]; - hexString[i * 2 + 1] = hexChars[uint8(data[i] & 0x0f)]; + 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 in bytes format + /// @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 @@ -2100,7 +2142,7 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { pure returns (bytes32 workflowId, bytes10 workflowName, address workflowOwner) { - // Metadata structure: + // 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) @@ -2110,6 +2152,7 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { 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 @@ -2126,24 +2169,24 @@ abstract contract IReceiverTemplate is IReceiver, Ownable { ### 3.3 Quick Start -The simplest way to use `IReceiverTemplate` is to inherit from it and implement the `_processReport` function: +The simplest way to use `ReceiverTemplate` is to inherit from it and implement the `_processReport` function: ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.26; -import { IReceiverTemplate } from "./IReceiverTemplate.sol"; +import { ReceiverTemplate } from "./ReceiverTemplate.sol"; -contract MyConsumer is IReceiverTemplate { - uint256 public storedValue; +contract MyConsumer is ReceiverTemplate { + uint256 public s_storedValue; event ValueUpdated(uint256 newValue); // Simple constructor - no parameters needed - constructor() IReceiverTemplate() {} + constructor() ReceiverTemplate() {} // Implement your business logic here function _processReport(bytes calldata report) internal override { uint256 newValue = abi.decode(report, (uint256)); - storedValue = newValue; + s_storedValue = newValue; emit ValueUpdated(newValue); } } @@ -2202,7 +2245,7 @@ myConsumer.setExpectedWorkflowName(""); // Empty string disables the check #### How workflow names are encoded -The `workflowName` field in the metadata uses the **`bytes10`** type rather than plaintext strings. When you call `setExpectedWorkflowName("my_workflow")`, the `IReceiverTemplate` automatically encodes it using the same algorithm as the CRE engine: +The `workflowName` field in the metadata uses the **`bytes10`** type rather than plaintext strings. When you call `setExpectedWorkflowName("my_workflow")`, the `ReceiverTemplate` automatically encodes it using the same algorithm as the CRE engine: 1. Compute SHA256 hash of the workflow name 2. Convert hash to hex string (64 characters) @@ -2281,25 +2324,27 @@ See [Configuring Permissions](#34-configuring-permissions) for complete details. You can override `onReport` to add your own validation logic before or after the standard checks: ```solidity -import { IReceiverTemplate } from "./IReceiverTemplate.sol"; +import { ReceiverTemplate } from "./ReceiverTemplate.sol"; -contract AdvancedConsumer is IReceiverTemplate { - uint256 public minReportInterval = 1 hours; - uint256 public lastReportTime; +contract AdvancedConsumer is ReceiverTemplate { + uint256 private s_minReportInterval = 1 hours; + uint256 private s_lastReportTime; error ReportTooFrequent(uint256 timeSinceLastReport, uint256 minInterval); + event MinReportIntervalUpdated(uint256 previousInterval, uint256 newInterval); + // Add custom validation before parent's checks function onReport(bytes calldata metadata, bytes calldata report) external override { // Custom check: Rate limiting - if (block.timestamp < lastReportTime + minReportInterval) { - revert ReportTooFrequent(block.timestamp - lastReportTime, minReportInterval); + if (block.timestamp < s_lastReportTime + s_minReportInterval) { + revert ReportTooFrequent(block.timestamp - s_lastReportTime, s_minReportInterval); } // Call parent implementation for standard permission checks super.onReport(metadata, report); - lastReportTime = block.timestamp; + s_lastReportTime = block.timestamp; } function _processReport(bytes calldata report) internal override { @@ -2308,9 +2353,24 @@ contract AdvancedConsumer is IReceiverTemplate { // ... store or process the value ... } - // Allow owner to update rate limit + /// @notice Returns the minimum interval between reports + /// @return The minimum interval in seconds + function getMinReportInterval() external view returns (uint256) { + return s_minReportInterval; + } + + /// @notice Returns the timestamp of the last report + /// @return The last report timestamp + function getLastReportTime() external view returns (uint256) { + return s_lastReportTime; + } + + /// @notice Updates the minimum interval between reports + /// @param _interval The new minimum interval in seconds function setMinReportInterval(uint256 _interval) external onlyOwner { - minReportInterval = _interval; + uint256 previousInterval = s_minReportInterval; + s_minReportInterval = _interval; + emit MinReportIntervalUpdated(previousInterval, _interval); } } ``` @@ -2320,8 +2380,8 @@ contract AdvancedConsumer is IReceiverTemplate { The `_decodeMetadata` helper function is available for use in your `_processReport` implementation. This allows you to access workflow metadata for custom business logic: ```solidity -contract MetadataAwareConsumer is IReceiverTemplate { - mapping(bytes32 => uint256) public reportCountByWorkflow; +contract MetadataAwareConsumer is ReceiverTemplate { + mapping(bytes32 => uint256) public s_reportCountByWorkflow; function _processReport(bytes calldata report) internal override { // Access the metadata to get workflow ID @@ -2329,7 +2389,7 @@ contract MetadataAwareConsumer is IReceiverTemplate { (bytes32 workflowId, , ) = _decodeMetadata(metadata); // Use workflow ID in your business logic - reportCountByWorkflow[workflowId]++; + s_reportCountByWorkflow[workflowId]++; // Process the report data uint256 value = abi.decode(report, (uint256)); @@ -2347,23 +2407,23 @@ contract MetadataAwareConsumer is IReceiverTemplate { ### Example 1: Simple Consumer Contract -This example inherits from `IReceiverTemplate` to store a temperature value. +This example inherits from `ReceiverTemplate` to store a temperature value. ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.26; -import { IReceiverTemplate } from "./IReceiverTemplate.sol"; +import { ReceiverTemplate } from "./ReceiverTemplate.sol"; -contract TemperatureConsumer is IReceiverTemplate { - int256 public currentTemperature; +contract TemperatureConsumer is ReceiverTemplate { + int256 public s_currentTemperature; event TemperatureUpdated(int256 newTemperature); // Simple constructor - no parameters needed - constructor() IReceiverTemplate() {} + constructor() ReceiverTemplate() {} function _processReport(bytes calldata report) internal override { int256 newTemperature = abi.decode(report, (int256)); - currentTemperature = newTemperature; + s_currentTemperature = newTemperature; emit TemperatureUpdated(newTemperature); } } @@ -2384,7 +2444,7 @@ temperatureConsumer.setExpectedWorkflowId(0xYourWorkflowId...); For more complex scenarios, it's best to separate your Chainlink-aware code from your core business logic. The **Proxy Pattern** is a robust architecture that uses two contracts to achieve this: - **A Logic Contract**: Holds the state and the core functions of your application. It knows nothing about the Forwarder contract or the `onReport` function. -- **A Proxy Contract**: Acts as the secure entry point. It inherits from `IReceiverTemplate` and forwards validated reports to the Logic Contract. +- **A Proxy Contract**: Acts as the secure entry point. It inherits from `ReceiverTemplate` and forwards validated reports to the Logic Contract. This separation makes your business logic more modular and reusable. @@ -2404,28 +2464,59 @@ contract ReserveManager is Ownable { uint256 btcPrice; } - address public proxyAddress; - uint256 public lastEthPrice; - uint256 public lastBtcPrice; - uint256 public lastUpdateTime; + address private s_proxyAddress; + uint256 private s_lastEthPrice; + uint256 private s_lastBtcPrice; + uint256 private s_lastUpdateTime; event ReservesUpdated(uint256 ethPrice, uint256 btcPrice, uint256 updateTime); + event ProxyAddressUpdated(address indexed previousProxy, address indexed newProxy); modifier onlyProxy() { - require(msg.sender == proxyAddress, "Caller is not the authorized proxy"); + require(msg.sender == s_proxyAddress, "Caller is not the authorized proxy"); _; } constructor() Ownable(msg.sender) {} + /// @notice Returns the proxy address + /// @return The authorized proxy address + function getProxyAddress() external view returns (address) { + return s_proxyAddress; + } + + /// @notice Returns the last ETH price + /// @return The last recorded ETH price + function getLastEthPrice() external view returns (uint256) { + return s_lastEthPrice; + } + + /// @notice Returns the last BTC price + /// @return The last recorded BTC price + function getLastBtcPrice() external view returns (uint256) { + return s_lastBtcPrice; + } + + /// @notice Returns the last update timestamp + /// @return The timestamp of the last update + function getLastUpdateTime() external view returns (uint256) { + return s_lastUpdateTime; + } + + /// @notice Updates the authorized proxy address + /// @param _proxyAddress The new proxy address function setProxyAddress(address _proxyAddress) external onlyOwner { - proxyAddress = _proxyAddress; + address previousProxy = s_proxyAddress; + s_proxyAddress = _proxyAddress; + emit ProxyAddressUpdated(previousProxy, _proxyAddress); } + /// @notice Updates the reserve prices + /// @param data The new reserve data containing ETH and BTC prices function updateReserves(UpdateReserves memory data) external onlyProxy { - lastEthPrice = data.ethPrice; - lastBtcPrice = data.btcPrice; - lastUpdateTime = block.timestamp; + s_lastEthPrice = data.ethPrice; + s_lastBtcPrice = data.btcPrice; + s_lastUpdateTime = block.timestamp; emit ReservesUpdated(data.ethPrice, data.btcPrice, block.timestamp); } } @@ -2433,23 +2524,29 @@ contract ReserveManager is Ownable { #### The Proxy Contract (`UpdateReservesProxy.sol`) -This contract, our "bouncer", is the only contract that interacts with the Chainlink platform. It inherits `IReceiverTemplate` to validate incoming reports and then calls the `ReserveManager`. +This contract, our "bouncer", is the only contract that interacts with the Chainlink platform. It inherits `ReceiverTemplate` to validate incoming reports and then calls the `ReserveManager`. ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import { ReserveManager } from "./ReserveManager.sol"; -import { IReceiverTemplate } from "./keystone/IReceiverTemplate.sol"; +import { ReceiverTemplate } from "./ReceiverTemplate.sol"; -contract UpdateReservesProxy is IReceiverTemplate { - ReserveManager public s_reserveManager; +contract UpdateReservesProxy is ReceiverTemplate { + ReserveManager private s_reserveManager; constructor(address reserveManagerAddress) { s_reserveManager = ReserveManager(reserveManagerAddress); } - /// @inheritdoc IReceiverTemplate + /// @notice Returns the reserve manager contract address + /// @return The ReserveManager contract instance + function getReserveManager() external view returns (ReserveManager) { + return s_reserveManager; + } + + /// @inheritdoc ReceiverTemplate function _processReport(bytes calldata report) internal override { ReserveManager.UpdateReserves memory updateReservesData = abi.decode(report, (ReserveManager.UpdateReserves)); s_reserveManager.updateReserves(updateReservesData); @@ -7999,16 +8096,16 @@ Here is the source code for the contract so you can see how it works: // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import { IReceiverTemplate } from "./keystone/IReceiverTemplate.sol"; +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 This version uses IReceiverTemplate without configuring any security checks, making it compatible + * @dev This version uses ReceiverTemplate without configuring any security checks, making it compatible * with the mock Forwarder used during simulation. All permission fields remain at their default zero * values (disabled). */ -contract CalculatorConsumer is IReceiverTemplate { +contract CalculatorConsumer is ReceiverTemplate { // Struct to hold the data sent in a report from the workflow struct CalculatorResult { uint256 offchainValue; @@ -8026,13 +8123,13 @@ contract CalculatorConsumer is IReceiverTemplate { /** * @dev The constructor doesn't set any security checks. - * The IReceiverTemplate parent constructor will initialize all permission fields to zero (disabled). + * The ReceiverTemplate parent constructor will initialize all permission fields to zero (disabled). */ constructor() {} /** * @notice Implements the core business logic for processing reports. - * @dev This is called automatically by IReceiverTemplate's onReport function after security checks. + * @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 diff --git a/src/content/resources/llms-full.txt b/src/content/resources/llms-full.txt index dd00f71e5fc..43d5db2917e 100644 --- a/src/content/resources/llms-full.txt +++ b/src/content/resources/llms-full.txt @@ -2023,6 +2023,16 @@ MOVR is used to pay transaction fees on Moonriver Mainnet. | Symbol | LINK | | Decimals | 18 | +### Morph Hoodi Testnet + +| Parameter | Value | +| :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `2910` | +| Address | <Address contractUrl="https://explorer-hoodi.morphl2.io/address/0xe5e3a4fF1773d043a387b16Ceb3c91cC49bAFD54" urlId="2910_0xe5e3a4fF1773d043a387b16Ceb3c91cC49bAFD54" urlClass="erc-token-address" /> | +| Name | Chainlink Token on Morph Hoodi Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## <img src="/assets/chains/neox.svg" style="height: 24px; width: auto; margin-right: 8px;" />Neo X ### Neo X Mainnet From e66fe0cf3e3bd27f6f258901e7b9d3757cb13180 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Tue, 9 Dec 2025 12:56:03 -0600 Subject: [PATCH 039/214] update part4 w/ new consuemr (#3271) --- reports/llms-report.json | 20 +++---- .../cre/getting-started/conclusion.mdx | 2 +- .../part-4-writing-onchain-go.mdx | 50 ++++++++-------- .../part-4-writing-onchain-ts.mdx | 50 ++++++++-------- .../using-evm-client/generating-bindings.mdx | 2 +- .../using-evm-client/onchain-read-ts.mdx | 2 +- .../generating-reports-single-values.mdx | 2 +- .../workflow/using-evm-client/overview-go.mdx | 2 +- src/content/cre/llms-full-go.txt | 58 +++++++++---------- src/content/cre/llms-full-ts.txt | 54 +++++++++-------- 10 files changed, 125 insertions(+), 117 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index 286d662ad42..ed84678ece3 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,22 +1,22 @@ { - "startedAt": "2025-12-09T18:04:32.521Z", + "startedAt": "2025-12-09T18:45:48.237Z", "siteBase": "https://docs.chain.link", "sections": [ { "section": "cre-go", "pagesProcessed": 83, "outputPath": "src/content/cre/llms-full-go.txt", - "bytes": 655973, - "prevBytes": 651615, - "deltaBytes": 4358 + "bytes": 656030, + "prevBytes": 656030, + "deltaBytes": 0 }, { "section": "cre-ts", "pagesProcessed": 78, "outputPath": "src/content/cre/llms-full-ts.txt", - "bytes": 611476, - "prevBytes": 607118, - "deltaBytes": 4358 + "bytes": 612048, + "prevBytes": 611515, + "deltaBytes": 533 }, { "section": "vrf", @@ -87,8 +87,8 @@ "pagesProcessed": 12, "outputPath": "src/content/resources/llms-full.txt", "bytes": 339715, - "prevBytes": 338205, - "deltaBytes": 1510 + "prevBytes": 339715, + "deltaBytes": 0 }, { "section": "architecture-overview", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-09T18:04:37.177Z" + "finishedAt": "2025-12-09T18:45:52.560Z" } diff --git a/src/content/cre/getting-started/conclusion.mdx b/src/content/cre/getting-started/conclusion.mdx index 63eeccd9441..7d62e3c1910 100644 --- a/src/content/cre/getting-started/conclusion.mdx +++ b/src/content/cre/getting-started/conclusion.mdx @@ -103,7 +103,7 @@ Want to dive deeper into specific concepts from the Getting Started guide? Use t - **[EVM Client Overview](/cre/guides/workflow/using-evm-client/overview)** - Introduction to smart contract interactions - **[Onchain Read Guide](/cre/guides/workflow/using-evm-client/onchain-read)** - Reading from a smart contract -- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write)** - Complete write patterns and report generation +- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write/overview)** - Complete write patterns and report generation **Configuration & Secrets** diff --git a/src/content/cre/getting-started/part-4-writing-onchain-go.mdx b/src/content/cre/getting-started/part-4-writing-onchain-go.mdx index c0f777f4439..1a5be2c1733 100644 --- a/src/content/cre/getting-started/part-4-writing-onchain-go.mdx +++ b/src/content/cre/getting-started/part-4-writing-onchain-go.mdx @@ -7,7 +7,7 @@ pageId: "getting-started-part-4" metadata: description: "Getting started Part 4 (Go): write verified workflow results onchain to smart contracts and complete your first end-to-end workflow." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2025-12-09" --- import { Aside } from "@components" @@ -103,7 +103,7 @@ contract CalculatorConsumer is ReceiverTemplate { } ``` -The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54#code" target="_blank" rel="noopener noreferrer">`0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54`</a>. You will use this address in your configuration file. +The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#code" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. You will use this address in your configuration file. ## Step 2: Generate the consumer contract binding @@ -143,7 +143,7 @@ Add the `CalculatorConsumer` contract address to your `config.staging.json`: "evms": [ { "storageAddress": "0xa17CF997C28FF154eDBae1422e6a50BeF23927F4", - "calculatorConsumerAddress": "0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54", + "calculatorConsumerAddress": "0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52", "chainName": "ethereum-testnet-sepolia", "gasLimit": 500000 } @@ -207,34 +207,34 @@ Your workflow will now show the complete end-to-end execution, including the fin ```bash Workflow compiled -2025-11-03T22:48:41Z [SIMULATION] Simulator Initialized - -2025-11-03T22:48:41Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 -2025-11-03T22:48:41Z [USER LOG] msg="Successfully fetched offchain value" result=56 -2025-11-03T22:48:41Z [USER LOG] msg="Successfully read onchain value" result=22 -2025-11-03T22:48:41Z [USER LOG] msg="Final calculated result" result=78 -2025-11-03T22:48:41Z [USER LOG] msg="Updating calculator result" consumerAddress=0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54 -2025-11-03T22:48:41Z [USER LOG] msg="Writing report to consumer contract" offchainValue=56 onchainValue=22 finalResult=78 -2025-11-03T22:48:41Z [USER LOG] msg="Waiting for write report response" -2025-11-03T22:48:48Z [USER LOG] msg="Write report transaction succeeded" txHash=0x86a26f848c83f37b8eace8123ec275a0af9d21b23b1fbba9cc7664b7e474314f -2025-11-03T22:48:48Z [USER LOG] msg="View transaction at" url=https://sepolia.etherscan.io/tx/0x86a26f848c83f37b8eace8123ec275a0af9d21b23b1fbba9cc7664b7e474314f -2025-11-03T22:48:48Z [USER LOG] msg="Workflow finished successfully!" result="&{OffchainValue:+56 OnchainValue:+22 FinalResult:+78 TxHash:0x86a26f848c83f37b8eace8123ec275a0af9d21b23b1fbba9cc7664b7e474314f}" +2025-12-09T13:36:10Z [SIMULATION] Simulator Initialized + +2025-12-09T13:36:10Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 +2025-12-09T13:36:10Z [USER LOG] msg="Successfully fetched offchain value" result=77 +2025-12-09T13:36:10Z [USER LOG] msg="Successfully read onchain value" result=22 +2025-12-09T13:36:10Z [USER LOG] msg="Final calculated result" result=99 +2025-12-09T13:36:10Z [USER LOG] msg="Updating calculator result" consumerAddress=0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52 +2025-12-09T13:36:10Z [USER LOG] msg="Writing report to consumer contract" offchainValue=77 onchainValue=22 finalResult=99 +2025-12-09T13:36:10Z [USER LOG] msg="Waiting for write report response" +2025-12-09T13:36:36Z [USER LOG] msg="Write report transaction succeeded" txHash=0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c +2025-12-09T13:36:36Z [USER LOG] msg="View transaction at" url=https://sepolia.etherscan.io/tx/0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c +2025-12-09T13:36:36Z [USER LOG] msg="Workflow finished successfully!" result="&{OffchainValue:+77 OnchainValue:+22 FinalResult:+99 TxHash:0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c}" Workflow Simulation Result: { - "FinalResult": 78, - "OffchainValue": 56, + "FinalResult": 99, + "OffchainValue": 77, "OnchainValue": 22, - "TxHash": "0x86a26f848c83f37b8eace8123ec275a0af9d21b23b1fbba9cc7664b7e474314f" + "TxHash": "0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c" } -2025-11-03T22:48:48Z [SIMULATION] Execution finished signal received -2025-11-03T22:48:48Z [SIMULATION] Skipping WorkflowEngineV2 +2025-12-09T13:36:36Z [SIMULATION] Execution finished signal received +2025-12-09T13:36:36Z [SIMULATION] Skipping WorkflowEngineV2 ``` -- **`[USER LOG]`**: You can see all of your `logger.Info()` calls showing the complete workflow execution, including the offchain value (`result=56`), onchain value (`result=22`), final calculation (`result=78`), and the transaction hash. +- **`[USER LOG]`**: You can see all of your `logger.Info()` calls showing the complete workflow execution, including the offchain value (`result=77`), onchain value (`result=22`), final calculation (`result=99`), and the transaction hash. - **`[SIMULATION]`**: These are system-level messages from the simulator showing its internal state. -- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` struct contains all the values (56 + 22 = 78) and the transaction hash confirming the write operation succeeded. +- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` struct contains all the values (77 + 22 = 99) and the transaction hash confirming the write operation succeeded. ## Step 7: Verify the result onchain @@ -250,13 +250,13 @@ Click the URL (or copy and paste it into your browser) to see the full details o **What are you seeing on a blockchain explorer?** -You'll notice the transaction's `to` address is not the `CalculatorConsumer` contract you intended to call. Instead, it's to a **Forwarder** contract. Your workflow sends a secure report to the Forwarder, which then verifies the request and makes the final call to the `CalculatorConsumer` on your workflow's behalf. To learn more, see the [Onchain Write guide](/cre/guides/workflow/using-evm-client/onchain-write). +You'll notice the transaction's `to` address is not the `CalculatorConsumer` contract you intended to call. Instead, it's to a **Forwarder** contract. Your workflow sends a secure report to the Forwarder, which then verifies the request and makes the final call to the `CalculatorConsumer` on your workflow's behalf. To learn more, see the [Onchain Write guide](/cre/guides/workflow/using-evm-client/onchain-write/overview). ### **2. Check the contract state** While your wallet interacted with the Forwarder, the `CalculatorConsumer` contract's state was still updated. You can verify this change directly on Etherscan: -- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54#readContract" target="_blank" rel="noopener noreferrer">`0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54`</a>. +- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#readContract" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. - Expand the `latestResult` function and click **Query**. The values should match the `finalResult`, `offchainValue`, and `onchainValue` from your workflow logs. This completes the end-to-end loop: triggering a workflow, fetching data, reading onchain state, and verifiably writing the result back to a public blockchain. @@ -264,7 +264,7 @@ This completes the end-to-end loop: triggering a workflow, fetching data, readin To learn more about implementing consumer contracts and the secure write process, see these guides: - **[Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts)**: Learn how to create your own secure consumer contracts with proper validation. -- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write)**: Dive deeper into the write patterns. +- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write/overview-go)**: Dive deeper into the write patterns. ## Next steps diff --git a/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx b/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx index 979ca288de3..884461f2079 100644 --- a/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx +++ b/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx @@ -7,7 +7,7 @@ pageId: "getting-started-part-4" metadata: description: "Getting started Part 4 (TypeScript): write verified workflow results onchain to smart contracts and complete your first end-to-end workflow." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2025-12-09" --- import { Aside } from "@components" @@ -103,7 +103,7 @@ contract CalculatorConsumer is ReceiverTemplate { } ``` -The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54#code" target="_blank" rel="noopener noreferrer">`0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54`</a>. You will use this address in your configuration file. +The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#code" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. You will use this address in your configuration file. ## Step 2: Update your workflow configuration @@ -116,7 +116,7 @@ Add the `CalculatorConsumer` contract address to your `config.staging.json`: "evms": [ { "storageAddress": "0xa17CF997C28FF154eDBae1422e6a50BeF23927F4", - "calculatorConsumerAddress": "0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54", + "calculatorConsumerAddress": "0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52", "chainName": "ethereum-testnet-sepolia", "gasLimit": "500000" } @@ -208,31 +208,35 @@ Your workflow will now show the complete end-to-end execution, including the fin ```bash Workflow compiled -2025-11-03T19:09:22Z [SIMULATION] Simulator Initialized - -2025-11-03T19:09:22Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 -2025-11-03T19:09:22Z [USER LOG] Successfully fetched offchain value: 39 -2025-11-03T19:09:22Z [USER LOG] Successfully read onchain value: 22 -2025-11-03T19:09:22Z [USER LOG] Final calculated result: 61 -2025-11-03T19:09:22Z [USER LOG] Updating calculator result for consumer: 0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54 -2025-11-03T19:09:22Z [USER LOG] Writing report to consumer contract - offchainValue: 39, onchainValue: 22, finalResult: 61 -2025-11-03T19:09:25Z [USER LOG] Waiting for write report response -2025-11-03T19:09:25Z [USER LOG] Write report transaction succeeded: 0xcc99cf4fcdc1262162762f747eeb660b52cc117754c953fdb72842414fcecdc4 -2025-11-03T19:09:25Z [USER LOG] View transaction at https://sepolia.etherscan.io/tx/0xcc99cf4fcdc1262162762f747eeb660b52cc117754c953fdb72842414fcecdc4 -2025-11-03T19:09:25Z [USER LOG] Workflow finished successfully! offchainValue: 39, onchainValue: 22, finalResult: 61, txHash: 0xcc99cf4fcdc1262162762f747eeb660b52cc117754c953fdb72842414fcecdc4 +2025-12-09T13:31:18Z [SIMULATION] Simulator Initialized + +2025-12-09T13:31:18Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 +2025-12-09T13:31:18Z [USER LOG] Successfully fetched offchain value: 62 +2025-12-09T13:31:18Z [USER LOG] Successfully read onchain value: 22 +2025-12-09T13:31:18Z [USER LOG] Final calculated result: 84 +2025-12-09T13:31:18Z [USER LOG] Updating calculator result for consumer: 0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52 +2025-12-09T13:31:18Z [USER LOG] Writing report to consumer contract - offchainValue: 62, onchainValue: 22, finalResult: 84 +2025-12-09T13:31:48Z [USER LOG] Waiting for write report response +2025-12-09T13:31:48Z [USER LOG] Write report transaction succeeded: 0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2 +2025-12-09T13:31:48Z [USER LOG] View transaction at https://sepolia.etherscan.io/tx/0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2 +2025-12-09T13:31:48Z [USER LOG] Workflow finished successfully! offchainValue: 62, onchainValue: 22, finalResult: 84, txHash: 0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2 Workflow Simulation Result: { - "finalResult": 61, - "offchainValue": 39, + "finalResult": 84, + "offchainValue": 62, "onchainValue": 22, - "txHash": "0xcc99cf4fcdc1262162762f747eeb660b52cc117754c953fdb72842414fcecdc4" + "txHash": "0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2" } -2025-11-03T19:09:25Z [SIMULATION] Execution finished signal received -2025-11-03T19:09:25Z [SIMULATION] Skipping WorkflowEngineV2 +2025-12-09T13:31:48Z [SIMULATION] Execution finished signal received +2025-12-09T13:31:48Z [SIMULATION] Skipping WorkflowEngineV2 ``` +- **`[USER LOG]`**: You can see all of your `logger.info()` calls showing the complete workflow execution, including the offchain value (`62`), onchain value (`22`), final calculation (`84`), and the transaction hash. +- **`[SIMULATION]`**: These are system-level messages from the simulator showing its internal state. +- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` object contains all the values (62 + 22 = 84) and the transaction hash confirming the write operation succeeded. + ## Step 5: Verify the result onchain ### **1. Check the Transaction** @@ -247,13 +251,13 @@ Click the URL (or copy and paste it into your browser) to see the full details o **What are you seeing on a blockchain explorer?** -You'll notice the transaction's `to` address is not the `CalculatorConsumer` contract you intended to call. Instead, it's to a **Forwarder** contract. Your workflow sends a secure report to the Forwarder, which then verifies the request and makes the final call to the `CalculatorConsumer` on your workflow's behalf. To learn more, see the [Onchain Write guide](/cre/guides/workflow/using-evm-client/onchain-write). +You'll notice the transaction's `to` address is not the `CalculatorConsumer` contract you intended to call. Instead, it's to a **Forwarder** contract. Your workflow sends a secure report to the Forwarder, which then verifies the request and makes the final call to the `CalculatorConsumer` on your workflow's behalf. To learn more, see the [Onchain Write guide](/cre/guides/workflow/using-evm-client/onchain-write/overview). ### **2. Check the contract state** While your wallet interacted with the Forwarder, the `CalculatorConsumer` contract's state was still updated. You can verify this change directly on Etherscan: -- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54#readContract" target="_blank" rel="noopener noreferrer">`0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54`</a>. +- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#readContract" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. - Expand the `latestResult` function and click **Query**. The values should match the `finalResult`, `offchainValue`, and `onchainValue` from your workflow logs. This completes the end-to-end loop: triggering a workflow, fetching data, reading onchain state, and verifiably writing the result back to a public blockchain. @@ -261,7 +265,7 @@ This completes the end-to-end loop: triggering a workflow, fetching data, readin To learn more about implementing consumer contracts and the secure write process, see these guides: - **[Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts)**: Learn how to create your own secure consumer contracts with proper validation. -- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write)**: Dive deeper into the write patterns. +- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write/overview-ts)**: Dive deeper into the write patterns. ## Next steps diff --git a/src/content/cre/guides/workflow/using-evm-client/generating-bindings.mdx b/src/content/cre/guides/workflow/using-evm-client/generating-bindings.mdx index edd642d1531..6fa9d0c62d3 100644 --- a/src/content/cre/guides/workflow/using-evm-client/generating-bindings.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/generating-bindings.mdx @@ -403,4 +403,4 @@ This generated test file demonstrates real-world patterns for testing complex wo ## Where to go next -Now that you know how to generate bindings, you can use them to [read data from](/cre/guides/workflow/using-evm-client/onchain-read) or [write data to](/cre/guides/workflow/using-evm-client/onchain-write) your contracts, or [trigger workflows from events](/cre/guides/workflow/using-triggers/evm-log-trigger). +Now that you know how to generate bindings, you can use them to [read data from](/cre/guides/workflow/using-evm-client/onchain-read) or [write data to](/cre/guides/workflow/using-evm-client/onchain-write/overview) your contracts, or [trigger workflows from events](/cre/guides/workflow/using-triggers/evm-log-trigger). diff --git a/src/content/cre/guides/workflow/using-evm-client/onchain-read-ts.mdx b/src/content/cre/guides/workflow/using-evm-client/onchain-read-ts.mdx index 4dd526cc165..5634f0b6af8 100644 --- a/src/content/cre/guides/workflow/using-evm-client/onchain-read-ts.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/onchain-read-ts.mdx @@ -377,6 +377,6 @@ This pattern provides better organization, reusability, and type safety across y ## Next steps -- Learn how to [write data to contracts](/cre/guides/workflow/using-evm-client/onchain-write) +- Learn how to [write data to contracts](/cre/guides/workflow/using-evm-client/onchain-write/overview) - Explore the [EVM Client SDK Reference](/cre/reference/sdk/evm-client-ts) for all available methods - See [Part 3](/cre/getting-started/part-3-reading-onchain-value) and [Part 4](/cre/getting-started/part-4-writing-onchain) of the Getting Started guide for more examples diff --git a/src/content/cre/guides/workflow/using-evm-client/onchain-write/generating-reports-single-values.mdx b/src/content/cre/guides/workflow/using-evm-client/onchain-write/generating-reports-single-values.mdx index 235046d3551..ff25a277d36 100644 --- a/src/content/cre/guides/workflow/using-evm-client/onchain-write/generating-reports-single-values.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/onchain-write/generating-reports-single-values.mdx @@ -250,7 +250,7 @@ func main() { ## Learn more -- **[Onchain Write Overview](/cre/guides/workflow/using-evm-client/onchain-write)**: Understand all onchain write approaches +- **[Onchain Write Overview](/cre/guides/workflow/using-evm-client/onchain-write/overview)**: Understand all onchain write approaches - **[Submitting Reports Onchain](/cre/guides/workflow/using-evm-client/onchain-write/submitting-reports-onchain)**: Submit your generated report to the blockchain - **[Generating Reports: Structs](/cre/guides/workflow/using-evm-client/onchain-write/generating-reports-structs)**: Manually encode and generate reports for struct data - **[Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts)**: Create contracts that can receive your reports diff --git a/src/content/cre/guides/workflow/using-evm-client/overview-go.mdx b/src/content/cre/guides/workflow/using-evm-client/overview-go.mdx index 0498cc062a4..9fe2e6dd5a5 100644 --- a/src/content/cre/guides/workflow/using-evm-client/overview-go.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/overview-go.mdx @@ -29,5 +29,5 @@ This approach gives you IDE autocompletion, compile-time type checking, and elim - **[Generating Contract Bindings](/cre/guides/workflow/using-evm-client/generating-bindings)**: Learn how to generate type-safe Go bindings from contract ABIs using the CRE CLI - **[Onchain Read](/cre/guides/workflow/using-evm-client/onchain-read)**: Learn how to call `view` and `pure` functions on your smart contracts to read onchain state -- **[Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write)**: Learn how to call state-changing functions on your smart contracts to write data to the blockchain +- **[Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write/overview)**: Learn how to call state-changing functions on your smart contracts to write data to the blockchain - **[Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts)**: Learn how to write your own consumer contracts that can receive reports from your workflow diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index be883d85541..7afe0b87947 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -949,7 +949,7 @@ Want to dive deeper into specific concepts from the Getting Started guide? Use t - **[EVM Client Overview](/cre/guides/workflow/using-evm-client/overview)** - Introduction to smart contract interactions - **[Onchain Read Guide](/cre/guides/workflow/using-evm-client/onchain-read)** - Reading from a smart contract -- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write)** - Complete write patterns and report generation +- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write/overview)** - Complete write patterns and report generation **Configuration & Secrets** @@ -2328,7 +2328,7 @@ This generated test file demonstrates real-world patterns for testing complex wo ## Where to go next -Now that you know how to generate bindings, you can use them to [read data from](/cre/guides/workflow/using-evm-client/onchain-read) or [write data to](/cre/guides/workflow/using-evm-client/onchain-write) your contracts, or [trigger workflows from events](/cre/guides/workflow/using-triggers/evm-log-trigger). +Now that you know how to generate bindings, you can use them to [read data from](/cre/guides/workflow/using-evm-client/onchain-read) or [write data to](/cre/guides/workflow/using-evm-client/onchain-write/overview) your contracts, or [trigger workflows from events](/cre/guides/workflow/using-triggers/evm-log-trigger). --- @@ -3548,7 +3548,7 @@ func main() { ## Learn more -- **[Onchain Write Overview](/cre/guides/workflow/using-evm-client/onchain-write)**: Understand all onchain write approaches +- **[Onchain Write Overview](/cre/guides/workflow/using-evm-client/onchain-write/overview)**: Understand all onchain write approaches - **[Submitting Reports Onchain](/cre/guides/workflow/using-evm-client/onchain-write/submitting-reports-onchain)**: Submit your generated report to the blockchain - **[Generating Reports: Structs](/cre/guides/workflow/using-evm-client/onchain-write/generating-reports-structs)**: Manually encode and generate reports for struct data - **[Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts)**: Create contracts that can receive your reports @@ -9297,7 +9297,7 @@ You have successfully read a value from a smart contract and combined it with of # Part 4: Writing Onchain Source: https://docs.chain.link/cre/getting-started/part-4-writing-onchain-go -Last Updated: 2025-11-04 +Last Updated: 2025-12-09 In the previous parts, you successfully fetched offchain data and read from a smart contract. Now, you'll complete the "Onchain Calculator" by writing your computed result back to the blockchain. @@ -9388,7 +9388,7 @@ contract CalculatorConsumer is ReceiverTemplate { } ``` -The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54#code" target="_blank" rel="noopener noreferrer">`0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54`</a>. You will use this address in your configuration file. +The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#code" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. You will use this address in your configuration file. ## Step 2: Generate the consumer contract binding @@ -9428,7 +9428,7 @@ Add the `CalculatorConsumer` contract address to your `config.staging.json`: "evms": [ { "storageAddress": "0xa17CF997C28FF154eDBae1422e6a50BeF23927F4", - "calculatorConsumerAddress": "0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54", + "calculatorConsumerAddress": "0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52", "chainName": "ethereum-testnet-sepolia", "gasLimit": 500000 } @@ -9670,34 +9670,34 @@ Your workflow will now show the complete end-to-end execution, including the fin ```bash Workflow compiled -2025-11-03T22:48:41Z [SIMULATION] Simulator Initialized - -2025-11-03T22:48:41Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 -2025-11-03T22:48:41Z [USER LOG] msg="Successfully fetched offchain value" result=56 -2025-11-03T22:48:41Z [USER LOG] msg="Successfully read onchain value" result=22 -2025-11-03T22:48:41Z [USER LOG] msg="Final calculated result" result=78 -2025-11-03T22:48:41Z [USER LOG] msg="Updating calculator result" consumerAddress=0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54 -2025-11-03T22:48:41Z [USER LOG] msg="Writing report to consumer contract" offchainValue=56 onchainValue=22 finalResult=78 -2025-11-03T22:48:41Z [USER LOG] msg="Waiting for write report response" -2025-11-03T22:48:48Z [USER LOG] msg="Write report transaction succeeded" txHash=0x86a26f848c83f37b8eace8123ec275a0af9d21b23b1fbba9cc7664b7e474314f -2025-11-03T22:48:48Z [USER LOG] msg="View transaction at" url=https://sepolia.etherscan.io/tx/0x86a26f848c83f37b8eace8123ec275a0af9d21b23b1fbba9cc7664b7e474314f -2025-11-03T22:48:48Z [USER LOG] msg="Workflow finished successfully!" result="&{OffchainValue:+56 OnchainValue:+22 FinalResult:+78 TxHash:0x86a26f848c83f37b8eace8123ec275a0af9d21b23b1fbba9cc7664b7e474314f}" +2025-12-09T13:36:10Z [SIMULATION] Simulator Initialized + +2025-12-09T13:36:10Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 +2025-12-09T13:36:10Z [USER LOG] msg="Successfully fetched offchain value" result=77 +2025-12-09T13:36:10Z [USER LOG] msg="Successfully read onchain value" result=22 +2025-12-09T13:36:10Z [USER LOG] msg="Final calculated result" result=99 +2025-12-09T13:36:10Z [USER LOG] msg="Updating calculator result" consumerAddress=0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52 +2025-12-09T13:36:10Z [USER LOG] msg="Writing report to consumer contract" offchainValue=77 onchainValue=22 finalResult=99 +2025-12-09T13:36:10Z [USER LOG] msg="Waiting for write report response" +2025-12-09T13:36:36Z [USER LOG] msg="Write report transaction succeeded" txHash=0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c +2025-12-09T13:36:36Z [USER LOG] msg="View transaction at" url=https://sepolia.etherscan.io/tx/0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c +2025-12-09T13:36:36Z [USER LOG] msg="Workflow finished successfully!" result="&{OffchainValue:+77 OnchainValue:+22 FinalResult:+99 TxHash:0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c}" Workflow Simulation Result: { - "FinalResult": 78, - "OffchainValue": 56, + "FinalResult": 99, + "OffchainValue": 77, "OnchainValue": 22, - "TxHash": "0x86a26f848c83f37b8eace8123ec275a0af9d21b23b1fbba9cc7664b7e474314f" + "TxHash": "0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c" } -2025-11-03T22:48:48Z [SIMULATION] Execution finished signal received -2025-11-03T22:48:48Z [SIMULATION] Skipping WorkflowEngineV2 +2025-12-09T13:36:36Z [SIMULATION] Execution finished signal received +2025-12-09T13:36:36Z [SIMULATION] Skipping WorkflowEngineV2 ``` -- **`[USER LOG]`**: You can see all of your `logger.Info()` calls showing the complete workflow execution, including the offchain value (`result=56`), onchain value (`result=22`), final calculation (`result=78`), and the transaction hash. +- **`[USER LOG]`**: You can see all of your `logger.Info()` calls showing the complete workflow execution, including the offchain value (`result=77`), onchain value (`result=22`), final calculation (`result=99`), and the transaction hash. - **`[SIMULATION]`**: These are system-level messages from the simulator showing its internal state. -- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` struct contains all the values (56 + 22 = 78) and the transaction hash confirming the write operation succeeded. +- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` struct contains all the values (77 + 22 = 99) and the transaction hash confirming the write operation succeeded. ## Step 7: Verify the result onchain @@ -9713,13 +9713,13 @@ Click the URL (or copy and paste it into your browser) to see the full details o **What are you seeing on a blockchain explorer?** -You'll notice the transaction's `to` address is not the `CalculatorConsumer` contract you intended to call. Instead, it's to a **Forwarder** contract. Your workflow sends a secure report to the Forwarder, which then verifies the request and makes the final call to the `CalculatorConsumer` on your workflow's behalf. To learn more, see the [Onchain Write guide](/cre/guides/workflow/using-evm-client/onchain-write). +You'll notice the transaction's `to` address is not the `CalculatorConsumer` contract you intended to call. Instead, it's to a **Forwarder** contract. Your workflow sends a secure report to the Forwarder, which then verifies the request and makes the final call to the `CalculatorConsumer` on your workflow's behalf. To learn more, see the [Onchain Write guide](/cre/guides/workflow/using-evm-client/onchain-write/overview). ### **2. Check the contract state** While your wallet interacted with the Forwarder, the `CalculatorConsumer` contract's state was still updated. You can verify this change directly on Etherscan: -- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54#readContract" target="_blank" rel="noopener noreferrer">`0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54`</a>. +- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#readContract" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. - Expand the `latestResult` function and click **Query**. The values should match the `finalResult`, `offchainValue`, and `onchainValue` from your workflow logs. This completes the end-to-end loop: triggering a workflow, fetching data, reading onchain state, and verifiably writing the result back to a public blockchain. @@ -9727,7 +9727,7 @@ This completes the end-to-end loop: triggering a workflow, fetching data, readin To learn more about implementing consumer contracts and the secure write process, see these guides: - **[Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts)**: Learn how to create your own secure consumer contracts with proper validation. -- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write)**: Dive deeper into the write patterns. +- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write/overview-go)**: Dive deeper into the write patterns. ## Next steps @@ -10499,7 +10499,7 @@ This approach gives you IDE autocompletion, compile-time type checking, and elim - **[Generating Contract Bindings](/cre/guides/workflow/using-evm-client/generating-bindings)**: Learn how to generate type-safe Go bindings from contract ABIs using the CRE CLI - **[Onchain Read](/cre/guides/workflow/using-evm-client/onchain-read)**: Learn how to call `view` and `pure` functions on your smart contracts to read onchain state -- **[Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write)**: Learn how to call state-changing functions on your smart contracts to write data to the blockchain +- **[Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write/overview)**: Learn how to call state-changing functions on your smart contracts to write data to the blockchain - **[Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts)**: Learn how to write your own consumer contracts that can receive reports from your workflow --- diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index 4c79ca12976..b30a98f30a3 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -949,7 +949,7 @@ Want to dive deeper into specific concepts from the Getting Started guide? Use t - **[EVM Client Overview](/cre/guides/workflow/using-evm-client/overview)** - Introduction to smart contract interactions - **[Onchain Read Guide](/cre/guides/workflow/using-evm-client/onchain-read)** - Reading from a smart contract -- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write)** - Complete write patterns and report generation +- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write/overview)** - Complete write patterns and report generation **Configuration & Secrets** @@ -8069,7 +8069,7 @@ You have successfully read a value from a smart contract and combined it with of # Part 4: Writing Onchain Source: https://docs.chain.link/cre/getting-started/part-4-writing-onchain-ts -Last Updated: 2025-11-04 +Last Updated: 2025-12-09 In the previous parts, you successfully fetched offchain data and read from a smart contract. Now, you'll complete the "Onchain Calculator" by writing your computed result back to the blockchain. @@ -8160,7 +8160,7 @@ contract CalculatorConsumer is ReceiverTemplate { } ``` -The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54#code" target="_blank" rel="noopener noreferrer">`0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54`</a>. You will use this address in your configuration file. +The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#code" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. You will use this address in your configuration file. ## Step 2: Update your workflow configuration @@ -8173,7 +8173,7 @@ Add the `CalculatorConsumer` contract address to your `config.staging.json`: "evms": [ { "storageAddress": "0xa17CF997C28FF154eDBae1422e6a50BeF23927F4", - "calculatorConsumerAddress": "0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54", + "calculatorConsumerAddress": "0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52", "chainName": "ethereum-testnet-sepolia", "gasLimit": "500000" } @@ -8462,31 +8462,35 @@ Your workflow will now show the complete end-to-end execution, including the fin ```bash Workflow compiled -2025-11-03T19:09:22Z [SIMULATION] Simulator Initialized - -2025-11-03T19:09:22Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 -2025-11-03T19:09:22Z [USER LOG] Successfully fetched offchain value: 39 -2025-11-03T19:09:22Z [USER LOG] Successfully read onchain value: 22 -2025-11-03T19:09:22Z [USER LOG] Final calculated result: 61 -2025-11-03T19:09:22Z [USER LOG] Updating calculator result for consumer: 0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54 -2025-11-03T19:09:22Z [USER LOG] Writing report to consumer contract - offchainValue: 39, onchainValue: 22, finalResult: 61 -2025-11-03T19:09:25Z [USER LOG] Waiting for write report response -2025-11-03T19:09:25Z [USER LOG] Write report transaction succeeded: 0xcc99cf4fcdc1262162762f747eeb660b52cc117754c953fdb72842414fcecdc4 -2025-11-03T19:09:25Z [USER LOG] View transaction at https://sepolia.etherscan.io/tx/0xcc99cf4fcdc1262162762f747eeb660b52cc117754c953fdb72842414fcecdc4 -2025-11-03T19:09:25Z [USER LOG] Workflow finished successfully! offchainValue: 39, onchainValue: 22, finalResult: 61, txHash: 0xcc99cf4fcdc1262162762f747eeb660b52cc117754c953fdb72842414fcecdc4 +2025-12-09T13:31:18Z [SIMULATION] Simulator Initialized + +2025-12-09T13:31:18Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 +2025-12-09T13:31:18Z [USER LOG] Successfully fetched offchain value: 62 +2025-12-09T13:31:18Z [USER LOG] Successfully read onchain value: 22 +2025-12-09T13:31:18Z [USER LOG] Final calculated result: 84 +2025-12-09T13:31:18Z [USER LOG] Updating calculator result for consumer: 0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52 +2025-12-09T13:31:18Z [USER LOG] Writing report to consumer contract - offchainValue: 62, onchainValue: 22, finalResult: 84 +2025-12-09T13:31:48Z [USER LOG] Waiting for write report response +2025-12-09T13:31:48Z [USER LOG] Write report transaction succeeded: 0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2 +2025-12-09T13:31:48Z [USER LOG] View transaction at https://sepolia.etherscan.io/tx/0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2 +2025-12-09T13:31:48Z [USER LOG] Workflow finished successfully! offchainValue: 62, onchainValue: 22, finalResult: 84, txHash: 0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2 Workflow Simulation Result: { - "finalResult": 61, - "offchainValue": 39, + "finalResult": 84, + "offchainValue": 62, "onchainValue": 22, - "txHash": "0xcc99cf4fcdc1262162762f747eeb660b52cc117754c953fdb72842414fcecdc4" + "txHash": "0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2" } -2025-11-03T19:09:25Z [SIMULATION] Execution finished signal received -2025-11-03T19:09:25Z [SIMULATION] Skipping WorkflowEngineV2 +2025-12-09T13:31:48Z [SIMULATION] Execution finished signal received +2025-12-09T13:31:48Z [SIMULATION] Skipping WorkflowEngineV2 ``` +- **`[USER LOG]`**: You can see all of your `logger.info()` calls showing the complete workflow execution, including the offchain value (`62`), onchain value (`22`), final calculation (`84`), and the transaction hash. +- **`[SIMULATION]`**: These are system-level messages from the simulator showing its internal state. +- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` object contains all the values (62 + 22 = 84) and the transaction hash confirming the write operation succeeded. + ## Step 5: Verify the result onchain ### **1. Check the Transaction** @@ -8501,13 +8505,13 @@ Click the URL (or copy and paste it into your browser) to see the full details o **What are you seeing on a blockchain explorer?** -You'll notice the transaction's `to` address is not the `CalculatorConsumer` contract you intended to call. Instead, it's to a **Forwarder** contract. Your workflow sends a secure report to the Forwarder, which then verifies the request and makes the final call to the `CalculatorConsumer` on your workflow's behalf. To learn more, see the [Onchain Write guide](/cre/guides/workflow/using-evm-client/onchain-write). +You'll notice the transaction's `to` address is not the `CalculatorConsumer` contract you intended to call. Instead, it's to a **Forwarder** contract. Your workflow sends a secure report to the Forwarder, which then verifies the request and makes the final call to the `CalculatorConsumer` on your workflow's behalf. To learn more, see the [Onchain Write guide](/cre/guides/workflow/using-evm-client/onchain-write/overview). ### **2. Check the contract state** While your wallet interacted with the Forwarder, the `CalculatorConsumer` contract's state was still updated. You can verify this change directly on Etherscan: -- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54#readContract" target="_blank" rel="noopener noreferrer">`0xF3abEAa889e46c6C5b9A0bD818cE54Cc4eAF8A54`</a>. +- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#readContract" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. - Expand the `latestResult` function and click **Query**. The values should match the `finalResult`, `offchainValue`, and `onchainValue` from your workflow logs. This completes the end-to-end loop: triggering a workflow, fetching data, reading onchain state, and verifiably writing the result back to a public blockchain. @@ -8515,7 +8519,7 @@ This completes the end-to-end loop: triggering a workflow, fetching data, readin To learn more about implementing consumer contracts and the secure write process, see these guides: - **[Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts)**: Learn how to create your own secure consumer contracts with proper validation. -- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write)**: Dive deeper into the write patterns. +- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write/overview-ts)**: Dive deeper into the write patterns. ## Next steps @@ -9119,7 +9123,7 @@ This pattern provides better organization, reusability, and type safety across y ## Next steps -- Learn how to [write data to contracts](/cre/guides/workflow/using-evm-client/onchain-write) +- Learn how to [write data to contracts](/cre/guides/workflow/using-evm-client/onchain-write/overview) - Explore the [EVM Client SDK Reference](/cre/reference/sdk/evm-client-ts) for all available methods - See [Part 3](/cre/getting-started/part-3-reading-onchain-value) and [Part 4](/cre/getting-started/part-4-writing-onchain) of the Getting Started guide for more examples From 086551fc241f465208262ef042bc887b16815ec5 Mon Sep 17 00:00:00 2001 From: "Mark S. Shenouda" <49324987+markshenouda@users.noreply.github.com> Date: Wed, 10 Dec 2025 11:00:41 +0200 Subject: [PATCH 040/214] Update lane side panel (#174) * update the panel width * change the colors of the headers and heros to the new color * fix layout on lane panel hero * update the lane details hero with the correct items * update lane table header * add unavailable and tooltip instead of N/A in lane table * add support for wide drawer layout in CCIP components * update lane drawer to display 'TBC' for unavailable FTF rate limit data * remove unnecessary blank line in LaneDetailsHero component * conditionally render DetailItem components for onRamp, offRamp, sourceAddress, and destinationAddress * refactor: adjust padding for table header and cells in CCIP table * fix: reduce endLength for onRamp and offRamp addresses in LaneDetailsHero component * fix: adjust flex direction for lane details in LaneDetailsHero component --- src/components/CCIP/ChainHero/ChainHero.css | 2 +- .../CCIP/ChainHero/LaneDetailsHero.css | 24 ++- .../CCIP/ChainHero/LaneDetailsHero.tsx | 62 ++++---- src/components/CCIP/Drawer/Drawer.css | 5 + src/components/CCIP/Drawer/Drawer.tsx | 11 +- src/components/CCIP/Drawer/LaneDrawer.tsx | 149 +++++++++++++----- src/components/CCIP/Drawer/TokenDrawer.tsx | 3 +- src/components/CCIP/Drawer/drawerStore.ts | 6 + src/components/CCIP/Hero/Hero.css | 2 +- src/components/CCIP/Search/Search.tsx | 7 +- src/components/CCIP/Tables/ChainTable.tsx | 3 +- src/components/CCIP/Tables/Table.css | 11 +- src/components/CCIP/Tooltip/RateTooltip.tsx | 19 +++ src/styles/index.css | 3 + 14 files changed, 214 insertions(+), 93 deletions(-) diff --git a/src/components/CCIP/ChainHero/ChainHero.css b/src/components/CCIP/ChainHero/ChainHero.css index 34c38f7ae17..7d7ce722c95 100644 --- a/src/components/CCIP/ChainHero/ChainHero.css +++ b/src/components/CCIP/ChainHero/ChainHero.css @@ -1,5 +1,5 @@ .ccip-chain-hero { - background-color: var(--gray-100); + background: var(--Page-Background-Alt); border-bottom: 1px solid var(--gray-200); min-height: 241px; } diff --git a/src/components/CCIP/ChainHero/LaneDetailsHero.css b/src/components/CCIP/ChainHero/LaneDetailsHero.css index 706ee384876..638ed72b3d3 100644 --- a/src/components/CCIP/ChainHero/LaneDetailsHero.css +++ b/src/components/CCIP/ChainHero/LaneDetailsHero.css @@ -1,5 +1,5 @@ .lane-details-hero { - background-color: var(--gray-100); + background: var(--Page-Background-Alt); padding: var(--space-6x); border-bottom: 1px solid var(--gray-200); } @@ -42,9 +42,16 @@ } .lane-details-hero__details { - display: grid; - grid-template-columns: 1fr 1fr; - gap: var(--space-6x); + display: flex; + flex-direction: column; + gap: var(--space-10x); +} + +.lane-details-hero__details__item { + display: flex; + flex-direction: column; + gap: var(--space-4x); + min-width: var(--space-45x); } .lane-details-hero__details__label { @@ -61,10 +68,6 @@ padding: var(--space-6x) var(--space-10x) var(--space-10x); } - .lane-details-hero__details { - grid-template-columns: 1fr 2fr; - } - .lane-details-hero__networks { flex-direction: row; align-items: center; @@ -74,4 +77,9 @@ transform: rotate(0deg); margin-left: 0; } + + .lane-details-hero__details { + flex-direction: row; + flex-wrap: wrap; + } } diff --git a/src/components/CCIP/ChainHero/LaneDetailsHero.tsx b/src/components/CCIP/ChainHero/LaneDetailsHero.tsx index 8c96ef2fde5..32c2a7e98fe 100644 --- a/src/components/CCIP/ChainHero/LaneDetailsHero.tsx +++ b/src/components/CCIP/ChainHero/LaneDetailsHero.tsx @@ -19,8 +19,8 @@ interface LaneDetailsHeroProps { } onRamp: string offRamp: string + sourceAddress: string destinationAddress: string - enforceOutOfOrder?: boolean explorer: ExplorerInfo inOutbound: LaneFilter } @@ -69,13 +69,13 @@ const DetailItem = ({ clipboardType?: string tooltip?: React.ReactNode }) => ( - <> + <div className="lane-details-hero__details__item"> <div className="lane-details-hero__details__label"> {label} {tooltip} </div> <div data-clipboard-type={clipboardType}>{children}</div> - </> + </div> ) function LaneDetailsHero({ @@ -83,18 +83,11 @@ function LaneDetailsHero({ destinationNetwork, onRamp, offRamp, + sourceAddress, destinationAddress, - enforceOutOfOrder, explorer, inOutbound, }: 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 ( <div className="lane-details-hero"> {/* Display networks with direction based on lane type */} @@ -115,16 +108,7 @@ function LaneDetailsHero({ </div> <div className="lane-details-hero__details"> - {/* Display address information based on lane type */} - {inOutbound === LaneFilter.Inbound ? ( - <DetailItem label="OffRamp address" clipboardType="offramp"> - <AddressComponent - address={offRamp} - endLength={6} - contractUrl={getExplorerAddressUrl(explorer, destinationNetwork.chainType)(offRamp)} - /> - </DetailItem> - ) : ( + {onRamp && ( <DetailItem label="OnRamp address" clipboardType="onramp" @@ -132,25 +116,39 @@ function LaneDetailsHero({ > <AddressComponent address={onRamp} - endLength={6} + endLength={4} contractUrl={getExplorerAddressUrl(explorer, sourceNetwork.chainType)(onRamp)} /> </DetailItem> )} - <DetailItem label="Destination chain selector" clipboardType="destination-chain-selector"> - {destinationAddress ? <CopyValue value={destinationAddress} /> : "n/a"}{" "} - </DetailItem> + {offRamp && ( + <DetailItem label="OffRamp address" clipboardType="offramp"> + <AddressComponent + address={offRamp} + endLength={4} + contractUrl={getExplorerAddressUrl(explorer, destinationNetwork.chainType)(offRamp)} + /> + </DetailItem> + )} + + {sourceAddress && ( + <DetailItem + label="Source chain selector" + clipboardType="source-chain-selector" + tooltip={<StyledTooltip tip="Unique identifier for the source blockchain network." />} + > + <CopyValue value={sourceAddress} /> + </DetailItem> + )} - {inOutbound === LaneFilter.Outbound && ( + {destinationAddress && ( <DetailItem - label="Out of Order Execution" - clipboardType="out-of-order-execution" - tooltip={ - <StyledTooltip tip="Controls the execution order of your messages on the destination blockchain. Setting this to true allows messages to be executed in any order. Setting it to false ensures messages are executed in sequence, so a message will only be executed if the preceding one has been executed. On lanes where 'Out of Order Execution' is required, you must set this to true; otherwise, the transaction will revert." /> - } + label="Destination chain selector" + clipboardType="destination-chain-selector" + tooltip={<StyledTooltip tip="Unique identifier for the destination blockchain network." />} > - {getOutOfOrderText(enforceOutOfOrder)} + <CopyValue value={destinationAddress} /> </DetailItem> )} </div> 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<HTMLDivElement>(null) const drawerContentRef = useRef<HTMLDivElement>(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} > - <div className="drawer__container" ref={drawerContentRef}> + <div + className={clsx("drawer__container", { + "drawer__container--wide": $drawerWidth === DrawerWidth.Wide, + })} + ref={drawerContentRef} + > <div className="drawer__close"> <button id="drawer-exit" onClick={handleClose} aria-label="Close drawer"> <svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg"> diff --git a/src/components/CCIP/Drawer/LaneDrawer.tsx b/src/components/CCIP/Drawer/LaneDrawer.tsx index cfc602ea850..f0c451f7580 100644 --- a/src/components/CCIP/Drawer/LaneDrawer.tsx +++ b/src/components/CCIP/Drawer/LaneDrawer.tsx @@ -39,7 +39,7 @@ function LaneDrawer({ return ( <> - <h2 className="ccip-table__drawer-heading">Lane details</h2> + <h2 className="ccip-table__drawer-heading">Lane Details</h2> <LaneDetailsHero sourceNetwork={{ logo: sourceNetwork.logo, @@ -53,8 +53,8 @@ function LaneDrawer({ }} onRamp={lane.onRamp.address} offRamp={lane.offRamp.address} - enforceOutOfOrder={lane.onRamp.enforceOutOfOrder} explorer={explorer} + sourceAddress={sourceNetworkDetails?.chainSelector || ""} destinationAddress={destinationNetworkDetails?.chainSelector || ""} inOutbound={inOutbound} /> @@ -73,7 +73,7 @@ function LaneDrawer({ <thead> <tr> <th style={{ width: "100px" }}>Ticker</th> - <th style={{ width: "150px" }}>Token address (Source)</th> + <th style={{ width: "150px" }}>Source token address</th> <th style={{ width: "80px" }}>Decimals</th> <th style={{ width: "100px" }}> Mechanism @@ -91,34 +91,84 @@ function LaneDrawer({ /> </th> <th style={{ width: "150px" }}> - Rate limit capacity - <Tooltip - label="" - tip="Maximum amount per transaction" - labelStyle={{ - marginRight: "5px", - }} - style={{ - display: "inline-block", - verticalAlign: "middle", - marginBottom: "2px", - }} - /> + <div> + Rate limit capacity + <Tooltip + label="" + tip="Maximum amount per transaction" + labelStyle={{ + marginRight: "5px", + }} + style={{ + display: "inline-block", + verticalAlign: "middle", + marginBottom: "2px", + }} + /> + </div> + <div style={{ color: "var(--muted-more-foreground)", fontSize: "0.875rem", fontWeight: "normal" }}> + (Tokens) + </div> </th> <th style={{ width: "180px" }}> - Rate limit refill rate - <Tooltip - label="" - tip="Rate at which available capacity is replenished" - labelStyle={{ - marginRight: "5px", - }} - style={{ - display: "inline-block", - verticalAlign: "middle", - marginBottom: "2px", - }} - /> + <div> + Rate limit refill rate + <Tooltip + label="" + tip="Rate at which available capacity is replenished" + labelStyle={{ + marginRight: "5px", + }} + style={{ + display: "inline-block", + verticalAlign: "middle", + marginBottom: "2px", + }} + /> + </div> + <div style={{ color: "var(--muted-more-foreground)", fontSize: "0.875rem", fontWeight: "normal" }}> + (Tokens/sec) + </div> + </th> + <th style={{ width: "150px" }}> + <div> + FTF Rate limit capacity + <Tooltip + label="" + tip="Maximum amount per transaction for Fast Token Finality" + labelStyle={{ + marginRight: "5px", + }} + style={{ + display: "inline-block", + verticalAlign: "middle", + marginBottom: "2px", + }} + /> + </div> + <div style={{ color: "var(--muted-more-foreground)", fontSize: "0.875rem", fontWeight: "normal" }}> + (Tokens) + </div> + </th> + <th style={{ width: "180px" }}> + <div> + FTF Rate limit refill rate + <Tooltip + label="" + tip="Rate at which available capacity is replenished for Fast Token Finality" + labelStyle={{ + marginRight: "5px", + }} + style={{ + display: "inline-block", + verticalAlign: "middle", + marginBottom: "2px", + }} + /> + </div> + <div style={{ color: "var(--muted-more-foreground)", fontSize: "0.875rem", fontWeight: "normal" }}> + (Tokens/sec) + </div> </th> </tr> </thead> @@ -190,13 +240,31 @@ function LaneDrawer({ <td> {lane.supportedTokens && - displayCapacity( - data[sourceNetwork.key].decimals, - token, - lane.supportedTokens[token]?.rateLimiterConfig?.[ - inOutbound === LaneFilter.Inbound ? "in" : "out" - ] - )} + (() => { + const capacity = displayCapacity( + data[sourceNetwork.key].decimals, + token, + lane.supportedTokens[token]?.rateLimiterConfig?.[ + inOutbound === LaneFilter.Inbound ? "in" : "out" + ] + ) + return capacity === "N/A" ? ( + <Tooltip + label="Unavailable" + tip="Rate limit data is currently unavailable. You can find the Token Pool rate limit by reading the Token Pool contract directly on the relevant blockchain." + labelStyle={{ + marginRight: "5px", + }} + style={{ + display: "inline-block", + verticalAlign: "middle", + marginBottom: "2px", + }} + /> + ) : ( + capacity + ) + })()} </td> <td className="rate-tooltip-cell"> {lane.supportedTokens && ( @@ -206,9 +274,18 @@ function LaneDrawer({ symbol={token} decimals={data[sourceNetwork.key].decimals} position="left" + showUnavailableText={true} /> )} </td> + <td> + {/* Placeholder for FTF Rate limit capacity - data not yet available */} + TBC + </td> + <td> + {/* Placeholder for FTF Rate limit refill rate - data not yet available */} + TBC + </td> </tr> ) })} diff --git a/src/components/CCIP/Drawer/TokenDrawer.tsx b/src/components/CCIP/Drawer/TokenDrawer.tsx index c883f61d77f..37be3443683 100644 --- a/src/components/CCIP/Drawer/TokenDrawer.tsx +++ b/src/components/CCIP/Drawer/TokenDrawer.tsx @@ -1,5 +1,5 @@ import "../Tables/Table.css" -import { drawerContentStore } from "../Drawer/drawerStore.ts" +import { drawerContentStore, drawerWidthStore, DrawerWidth } from "../Drawer/drawerStore.ts" import TokenDetailsHero from "../ChainHero/TokenDetailsHero.tsx" import { Environment, @@ -231,6 +231,7 @@ function TokenDrawer({ type="button" className={`ccip-table__network-name ${tokenPaused ? "ccip-table__network-name--paused" : ""}`} onClick={() => { + drawerWidthStore.set(DrawerWidth.Wide) drawerContentStore.set(() => ( <LaneDrawer environment={environment} diff --git a/src/components/CCIP/Drawer/drawerStore.ts b/src/components/CCIP/Drawer/drawerStore.ts index 44a1dc6c30f..127d82104fb 100644 --- a/src/components/CCIP/Drawer/drawerStore.ts +++ b/src/components/CCIP/Drawer/drawerStore.ts @@ -2,4 +2,10 @@ import { atom } from "nanostores" import type { JSX } from "preact" +export enum DrawerWidth { + Default = "default", + Wide = "wide", +} + export const drawerContentStore = atom<(() => JSX.Element) | null>(null) +export const drawerWidthStore = atom<DrawerWidth>(DrawerWidth.Default) diff --git a/src/components/CCIP/Hero/Hero.css b/src/components/CCIP/Hero/Hero.css index f8d0c61579a..57bc1db56aa 100644 --- a/src/components/CCIP/Hero/Hero.css +++ b/src/components/CCIP/Hero/Hero.css @@ -1,5 +1,5 @@ .ccip-hero { - background-color: var(--gray-100); + background: var(--Page-Background-Alt); border-bottom: 1px solid var(--gray-200); } diff --git a/src/components/CCIP/Search/Search.tsx b/src/components/CCIP/Search/Search.tsx index f869bf20860..d9de46f51f8 100644 --- a/src/components/CCIP/Search/Search.tsx +++ b/src/components/CCIP/Search/Search.tsx @@ -4,7 +4,7 @@ import { clsx } from "~/lib/clsx/clsx.ts" import { useClickOutside } from "~/hooks/useClickOutside.tsx" import { Environment, LaneConfig, LaneFilter } from "~/config/data/ccip/types.ts" import { directoryToSupportedChain, getExplorer, fallbackTokenIconUrl } from "~/features/utils/index.ts" -import { drawerContentStore } from "../Drawer/drawerStore.ts" +import { drawerContentStore, drawerWidthStore, DrawerWidth } from "../Drawer/drawerStore.ts" import LaneDrawer from "../Drawer/LaneDrawer.tsx" import { ChainType, ExplorerInfo } from "~/config/types.ts" import type { WorkerMessage, WorkerResponse } from "~/workers/data-worker.ts" @@ -236,7 +236,8 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) { <li key={lane.sourceNetwork.name + lane.destinationNetwork.key}> <button type="button" - onClick={() => + onClick={() => { + drawerWidthStore.set(DrawerWidth.Wide) drawerContentStore.set(() => ( <LaneDrawer environment={environment} @@ -249,7 +250,7 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) { explorer={generateExplorerUrl(lane)} /> )) - } + }} aria-label={`View lane from ${lane.sourceNetwork.name} to ${lane.destinationNetwork.name}`} > <div className="ccip-hero__search-results__lane-images"> diff --git a/src/components/CCIP/Tables/ChainTable.tsx b/src/components/CCIP/Tables/ChainTable.tsx index d487faf20ee..5e278233d20 100644 --- a/src/components/CCIP/Tables/ChainTable.tsx +++ b/src/components/CCIP/Tables/ChainTable.tsx @@ -4,7 +4,7 @@ import Tabs from "./Tabs.tsx" import TableSearchInput from "./TableSearchInput.tsx" import { useEffect, useState } from "react" import { getExplorerAddressUrl } from "~/features/utils/index.ts" -import { drawerContentStore } from "../Drawer/drawerStore.ts" +import { drawerContentStore, drawerWidthStore, DrawerWidth } from "../Drawer/drawerStore.ts" import LaneDrawer from "../Drawer/LaneDrawer.tsx" import { Environment, Version, LaneFilter } from "~/config/data/ccip/types.ts" import { getLane } from "~/config/data/ccip/data.ts" @@ -130,6 +130,7 @@ function ChainTable({ lanes, explorer, sourceNetwork, environment }: TableProps) version: Version.V1_2_0, }) + drawerWidthStore.set(DrawerWidth.Wide) drawerContentStore.set(() => ( <LaneDrawer environment={environment} diff --git a/src/components/CCIP/Tables/Table.css b/src/components/CCIP/Tables/Table.css index b2207a0db75..a99fb0b836a 100644 --- a/src/components/CCIP/Tables/Table.css +++ b/src/components/CCIP/Tables/Table.css @@ -14,11 +14,6 @@ margin: 0 auto; } -.ccip-table th, -.ccip-table td { - padding-right: 16px; -} - .ccip-table__drawer-container { padding: var(--space-6x); } @@ -37,16 +32,15 @@ /* identical to box height, or 157% */ text-align: start; background-color: transparent; - padding: 0; + padding: 0 var(--space-4x) var(--space-4x) 0; color: var(--gray-700); - padding-bottom: var(--space-4x); align-content: baseline; } .ccip-table tbody td { text-align: start; color: var(--gray-900); - padding: var(--space-4x) 0; + padding: var(--space-4x) var(--space-4x) var(--space-4x) 0; } .ccip-table__network-name { @@ -139,6 +133,7 @@ padding: var(--space-2x); color: var(--gray-900); margin-bottom: 0px; + background: var(--Page-Background-Alt); } .ccip-table__filters { diff --git a/src/components/CCIP/Tooltip/RateTooltip.tsx b/src/components/CCIP/Tooltip/RateTooltip.tsx index 836644ab53d..78b6c948d9c 100644 --- a/src/components/CCIP/Tooltip/RateTooltip.tsx +++ b/src/components/CCIP/Tooltip/RateTooltip.tsx @@ -7,14 +7,33 @@ function RateTooltip({ symbol, decimals, position, + showUnavailableText = false, }: { destinationLane: SupportedTokenConfig inOutbound: LaneFilter symbol: string decimals: number position?: "top" | "bottom" | "left" | "right" + showUnavailableText?: boolean }) { if (!destinationLane.rateLimiterConfig?.[inOutbound === LaneFilter.Inbound ? "in" : "out"]?.isEnabled) { + if (showUnavailableText) { + return ( + <Tooltip + label="Unavailable" + tip="Rate limit data is currently unavailable. You can find the Token Pool rate limit by reading the Token Pool contract directly on the relevant blockchain." + labelStyle={{ + marginRight: "5px", + }} + style={{ + display: "inline-block", + verticalAlign: "middle", + marginBottom: "2px", + }} + position={position} + /> + ) + } return <span>N/A</span> } const { rateSecond, maxThroughput } = displayRate( diff --git a/src/styles/index.css b/src/styles/index.css index c282cc9327f..805359ae635 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -24,6 +24,9 @@ --user-font-scale: 1rem - 16px; --max-width: calc(100%); --fullwidth-max-width: calc(100% - 1rem); + + /* Page background and border colors */ + --Page-Background-Alt: #fafbfc; } /* Fonts provided via centralized design system/CDN; no local @font-face overrides here. */ From fed6a73bf6144329f24a8f3dd57dabdb93dd4d1a Mon Sep 17 00:00:00 2001 From: "Mark S. Shenouda" <49324987+markshenouda@users.noreply.github.com> Date: Wed, 10 Dec 2025 15:44:40 +0200 Subject: [PATCH 041/214] Update token details page (#178) * feat: add additional columns for pool version, custom, and min blocks in TokenChainsTable * fix: adjust layout styles for improved responsiveness and alignment * fix: swap token name and ID display in ChainHero component; update placeholder font style in Search CSS * fix: refactor ChainHero heading styles for improved layout and alignment --- src/components/CCIP/ChainHero/ChainHero.css | 9 ++++++++- src/components/CCIP/ChainHero/ChainHero.tsx | 14 +++----------- src/components/CCIP/Search/Search.css | 4 ++++ src/components/CCIP/Tables/TokenChainsTable.tsx | 10 ++++++++-- src/components/CCIP/Token/Token.astro | 14 +++++++++----- 5 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/components/CCIP/ChainHero/ChainHero.css b/src/components/CCIP/ChainHero/ChainHero.css index 7d7ce722c95..f87f696a869 100644 --- a/src/components/CCIP/ChainHero/ChainHero.css +++ b/src/components/CCIP/ChainHero/ChainHero.css @@ -17,6 +17,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 +127,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 { diff --git a/src/components/CCIP/ChainHero/ChainHero.tsx b/src/components/CCIP/ChainHero/ChainHero.tsx index 6d49ef92b17..07bd086223b 100644 --- a/src/components/CCIP/ChainHero/ChainHero.tsx +++ b/src/components/CCIP/ChainHero/ChainHero.tsx @@ -127,17 +127,9 @@ function ChainHero({ chains, tokens, network, token, environment, lanes }: Chain currentTarget.src = fallbackTokenIconUrl }} /> - <h1 - style={{ - display: "flex", - alignItems: "center", - gap: "8px", - position: "relative", - overflow: "visible", - }} - > - {network?.name || token?.id} - <span className="ccip-chain-hero__token-logo__symbol">{token?.name}</span> + <h1> + {network?.name || token?.name} + <span className="ccip-chain-hero__token-logo__symbol">{token?.id}</span> {chainTooltipConfig && ( <Tooltip diff --git a/src/components/CCIP/Search/Search.css b/src/components/CCIP/Search/Search.css index 1134619167d..484a9e80960 100644 --- a/src/components/CCIP/Search/Search.css +++ b/src/components/CCIP/Search/Search.css @@ -33,6 +33,10 @@ outline: none; } +.ccip-hero__search input::placeholder { + font-style: normal; +} + .ccip-hero__search input::-webkit-search-cancel-button { -webkit-appearance: none; height: 1em; diff --git a/src/components/CCIP/Tables/TokenChainsTable.tsx b/src/components/CCIP/Tables/TokenChainsTable.tsx index ca40a294da8..4c64d11757f 100644 --- a/src/components/CCIP/Tables/TokenChainsTable.tsx +++ b/src/components/CCIP/Tables/TokenChainsTable.tsx @@ -60,6 +60,9 @@ function TokenChainsTable({ networks, token, lanes, environment }: TableProps) { <th>Token address</th> <th>Token pool type</th> <th>Token pool address</th> + <th>Pool version</th> + <th>Custom</th> + <th>Min Blocks required</th> </tr> </thead> <tbody> @@ -125,7 +128,7 @@ function TokenChainsTable({ networks, token, lanes, environment }: TableProps) { <Address contractUrl={getExplorerAddressUrl(network.explorer, network.chainType)(network.tokenAddress)} address={network.tokenAddress} - endLength={6} + endLength={4} /> </td> <td>{tokenPoolDisplay(network.tokenPoolType)}</td> @@ -136,9 +139,12 @@ function TokenChainsTable({ networks, token, lanes, environment }: TableProps) { network.chainType )(network.tokenPoolAddress)} address={network.tokenPoolAddress} - endLength={6} + endLength={4} /> </td> + <td>TBC</td> + <td>TBC</td> + <td>TBC</td> </tr> ) })} diff --git a/src/components/CCIP/Token/Token.astro b/src/components/CCIP/Token/Token.astro index 58071e03c39..5188955f9be 100644 --- a/src/components/CCIP/Token/Token.astro +++ b/src/components/CCIP/Token/Token.astro @@ -171,9 +171,8 @@ const tokenStructuredData = generateTokenStructuredData(token, environment, chai <style scoped="false"> .layout { - --doc-padding: var(--space-6x); - margin: var(--space-8x) auto; - padding: var(--doc-padding); + margin: 0 auto; + padding: var(--space-6x); } .layout h2 { @@ -205,8 +204,13 @@ const tokenStructuredData = generateTokenStructuredData(token, environment, chai @media (min-width: 50em) { .layout { - max-width: min(calc(1440px - 2 * var(--space-16x)), calc(100% - 2 * var(--space-16x))); - padding: 0; + max-width: 1500px; + } + } + + @media (min-width: 992px) { + .layout { + padding: var(--space-10x) var(--space-8x); } } </style> From 6a0cb66f1c797e3cdf9c3ebbae90f86c3fa4e2a1 Mon Sep 17 00:00:00 2001 From: "Mark S. Shenouda" <49324987+markshenouda@users.noreply.github.com> Date: Wed, 10 Dec 2025 16:06:21 +0200 Subject: [PATCH 042/214] Verifiers page (#179) * Add VerifiersTable component and integrate into CCIP directory pages * Update VerifierGrid links to ensure correct navigation for verifiers * Remove debug log from VerifiersTable component * Refactor ChainHero component integration in Verifiers page and remove redundant styles * Add Verifiers.css for styling the Verifiers page layout --- src/components/CCIP/ChainHero/ChainHero.css | 1 - src/components/CCIP/ChainHero/ChainHero.tsx | 78 ++++++----- src/components/CCIP/Tables/VerifiersTable.tsx | 124 ++++++++++++++++++ .../CCIP/VerifierGrid/VerifierGrid.tsx | 6 +- src/components/CCIP/Verifiers/Verifiers.astro | 98 ++++++++++++++ src/components/CCIP/Verifiers/Verifiers.css | 43 ++++++ .../directory/mainnet/verifiers/index.astro | 8 ++ .../directory/testnet/verifiers/index.astro | 8 ++ 8 files changed, 327 insertions(+), 39 deletions(-) create mode 100644 src/components/CCIP/Tables/VerifiersTable.tsx create mode 100644 src/components/CCIP/Verifiers/Verifiers.astro create mode 100644 src/components/CCIP/Verifiers/Verifiers.css create mode 100644 src/pages/ccip/directory/mainnet/verifiers/index.astro create mode 100644 src/pages/ccip/directory/testnet/verifiers/index.astro diff --git a/src/components/CCIP/ChainHero/ChainHero.css b/src/components/CCIP/ChainHero/ChainHero.css index f87f696a869..98d1d58b11b 100644 --- a/src/components/CCIP/ChainHero/ChainHero.css +++ b/src/components/CCIP/ChainHero/ChainHero.css @@ -1,7 +1,6 @@ .ccip-chain-hero { background: var(--Page-Background-Alt); border-bottom: 1px solid var(--gray-200); - min-height: 241px; } .ccip-chain-hero__heading { diff --git a/src/components/CCIP/ChainHero/ChainHero.tsx b/src/components/CCIP/ChainHero/ChainHero.tsx index 07bd086223b..1b0550380ee 100644 --- a/src/components/CCIP/ChainHero/ChainHero.tsx +++ b/src/components/CCIP/ChainHero/ChainHero.tsx @@ -54,9 +54,13 @@ 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, breadcrumbItems }: ChainHeroProps) { // Get chain-specific tooltip configuration const chainTooltipConfig = network?.chain ? getChainTooltip(network.chain) : null @@ -99,47 +103,51 @@ function ChainHero({ chains, tokens, network, token, environment, lanes }: Chain <div className="ccip-chain-hero__content"> <div className="ccip-chain-hero__top"> <Breadcrumb - items={[ - { - name: "CCIP Directory", - url: `/ccip/directory/${environment}`, - }, - { - name: network?.name || token?.id || "Current", - url: network - ? `/ccip/directory/${environment}/chain/${network.chain}` - : `/ccip/directory/${environment}/token/${token?.id}`, - }, - ]} + items={ + breadcrumbItems || [ + { + name: "CCIP Directory", + url: `/ccip/directory/${environment}`, + }, + { + name: network?.name || token?.id || "Current", + url: network + ? `/ccip/directory/${environment}/chain/${network.chain}` + : `/ccip/directory/${environment}/token/${token?.id}`, + }, + ] + } /> <div className="ccip-chain-hero__chainSearch"> <Search chains={chains} tokens={tokens} small environment={environment} lanes={lanes} /> </div> </div> - <div className="ccip-chain-hero__heading"> - <img - src={network?.logo || token?.logo} - alt="" - className={token?.logo ? "ccip-chain-hero__token-logo" : ""} - onError={({ currentTarget }) => { - currentTarget.onerror = null // prevents looping - currentTarget.src = fallbackTokenIconUrl - }} - /> - <h1> - {network?.name || token?.name} - <span className="ccip-chain-hero__token-logo__symbol">{token?.id}</span> + {(network || token) && ( + <div className="ccip-chain-hero__heading"> + <img + src={network?.logo || token?.logo} + alt="" + className={token?.logo ? "ccip-chain-hero__token-logo" : ""} + onError={({ currentTarget }) => { + currentTarget.onerror = null // prevents looping + currentTarget.src = fallbackTokenIconUrl + }} + /> + <h1> + {network?.name || token?.name} + <span className="ccip-chain-hero__token-logo__symbol">{token?.id}</span> - {chainTooltipConfig && ( - <Tooltip - tip={chainTooltipConfig.content} - hoverable={chainTooltipConfig.hoverable} - hideDelay={chainTooltipConfig.hideDelay} - /> - )} - </h1> - </div> + {chainTooltipConfig && ( + <Tooltip + tip={chainTooltipConfig.content} + hoverable={chainTooltipConfig.hoverable} + hideDelay={chainTooltipConfig.hideDelay} + /> + )} + </h1> + </div> + )} {network && ( <div className="ccip-chain-hero__details"> <div className="ccip-chain-hero__details__item"> diff --git a/src/components/CCIP/Tables/VerifiersTable.tsx b/src/components/CCIP/Tables/VerifiersTable.tsx new file mode 100644 index 00000000000..dc79bf8753e --- /dev/null +++ b/src/components/CCIP/Tables/VerifiersTable.tsx @@ -0,0 +1,124 @@ +import Address from "~/components/AddressReact.tsx" +import "./Table.css" +import { Environment, Verifier, getVerifierTypeDisplay } from "~/config/data/ccip/index.ts" +import TableSearchInput from "./TableSearchInput.tsx" +import { useState } from "react" +import { + getExplorerAddressUrl, + fallbackVerifierIconUrl, + getChainIcon, + getTitle, + directoryToSupportedChain, + getExplorer, + getChainTypeAndFamily, +} from "~/features/utils/index.ts" + +interface VerifiersTableProps { + verifiers: Verifier[] +} + +function VerifiersTable({ verifiers }: VerifiersTableProps) { + const [search, setSearch] = useState("") + + // Transform verifiers data to include network information + const verifiersWithNetworkInfo = verifiers.map((verifier) => { + const supportedChain = directoryToSupportedChain(verifier.network) + const networkName = getTitle(supportedChain) || verifier.network + const networkLogo = getChainIcon(supportedChain) || "" + const explorer = getExplorer(supportedChain) + const { chainType } = getChainTypeAndFamily(supportedChain) + + return { + ...verifier, + networkName, + networkLogo, + supportedChain, + explorer, + chainType, + } + }) + + const filteredVerifiers = verifiersWithNetworkInfo.filter( + (verifier) => + verifier.name.toLowerCase().includes(search.toLowerCase()) || + verifier.networkName.toLowerCase().includes(search.toLowerCase()) || + verifier.address.toLowerCase().includes(search.toLowerCase()) || + getVerifierTypeDisplay(verifier.type).toLowerCase().includes(search.toLowerCase()) + ) + + return ( + <> + <div className="ccip-table__filters"> + <div className="ccip-table__filters-title"> + Verifiers <span>({verifiers.length})</span> + </div> + <TableSearchInput search={search} setSearch={setSearch} /> + </div> + <div className="ccip-table__wrapper"> + <table className="ccip-table"> + <thead> + <tr> + <th>Verifier</th> + <th>Network</th> + <th>Verifier address</th> + <th>Verifier type</th> + </tr> + </thead> + <tbody> + {filteredVerifiers.map((verifier, index) => ( + <tr key={`${verifier.network}-${verifier.address}`}> + <td> + <div className="ccip-table__network-name"> + <span className="ccip-table__logoContainer"> + <img + src={verifier.logo} + alt={`${verifier.name} verifier logo`} + className="ccip-table__logo" + onError={({ currentTarget }) => { + currentTarget.onerror = null // prevents looping + currentTarget.src = fallbackVerifierIconUrl + }} + /> + </span> + {verifier.name} + </div> + </td> + <td> + <div className="ccip-table__network-name"> + <span className="ccip-table__logoContainer"> + <img + src={verifier.networkLogo} + alt={`${verifier.networkName} blockchain logo`} + className="ccip-table__logo" + onError={({ currentTarget }) => { + currentTarget.onerror = null // prevents looping + currentTarget.src = fallbackVerifierIconUrl + }} + /> + </span> + {verifier.networkName} + </div> + </td> + <td data-clipboard-type="verifier-address"> + <Address + contractUrl={ + verifier.explorer + ? getExplorerAddressUrl(verifier.explorer, verifier.chainType)(verifier.address) + : "" + } + address={verifier.address} + endLength={4} + /> + </td> + <td>{getVerifierTypeDisplay(verifier.type)}</td> + </tr> + ))} + </tbody> + </table> + <div className="ccip-table__notFound">{filteredVerifiers.length === 0 && <>No verifiers found</>}</div> + </div> + </> + ) +} + +export default VerifiersTable diff --git a/src/components/CCIP/VerifierGrid/VerifierGrid.tsx b/src/components/CCIP/VerifierGrid/VerifierGrid.tsx index 5191cb5925d..133dbb95a97 100644 --- a/src/components/CCIP/VerifierGrid/VerifierGrid.tsx +++ b/src/components/CCIP/VerifierGrid/VerifierGrid.tsx @@ -20,7 +20,7 @@ function VerifierGrid({ verifiers, environment }: VerifierGridProps) { items={verifiers} initialDisplayCount={BEFORE_SEE_MORE} seeMoreLabel="View all verifiers" - seeMoreLink="/verifiers" + seeMoreLink={`/ccip/directory/${environment}/verifiers`} renderItem={(verifier) => { const subtitle = `${verifier.totalNetworks} ${verifier.totalNetworks === 1 ? "network" : "networks"}` const logoElement = ( @@ -34,8 +34,8 @@ function VerifierGrid({ verifiers, environment }: VerifierGridProps) { logo={logoElement} title={verifier.name} subtitle={subtitle} - link={`/ccip/directory/${environment}/verifier/${verifier.id}`} - ariaLabel={`View ${verifier.name} verifier details`} + link={`/ccip/directory/${environment}/verifiers`} + ariaLabel={`View verifiers page for ${verifier.name}`} /> ) }} diff --git a/src/components/CCIP/Verifiers/Verifiers.astro b/src/components/CCIP/Verifiers/Verifiers.astro new file mode 100644 index 00000000000..2672f983332 --- /dev/null +++ b/src/components/CCIP/Verifiers/Verifiers.astro @@ -0,0 +1,98 @@ +--- +import CcipDirectoryLayout from "~/layouts/CcipDirectoryLayout.astro" +import { getEntry, render } from "astro:content" +import { getAllNetworks, getAllVerifiers, getSearchLanes, Version, Environment } from "~/config/data/ccip" +import Table from "~/components/CCIP/Tables/VerifiersTable" +import { getAllUniqueVerifiers } from "~/config/data/ccip/data.ts" +import { DOCS_BASE_URL } from "~/utils/structuredData" +import ChainHero from "~/components/CCIP/ChainHero/ChainHero" +import "./Verifiers.css" + +interface Props { + environment: Environment +} + +const { environment } = Astro.props as Props + +const entry = await getEntry("ccip", "index") +if (!entry) { + throw new Error('Could not find "ccip/index" doc. Check src/content/ccip/index.mdx!') +} + +const { headings } = await render(entry) + +const networks = getAllNetworks({ filter: environment }) + +const allVerifiers = getAllVerifiers({ + environment, + version: Version.V1_2_0, +}) + +const uniqueVerifiers = getAllUniqueVerifiers({ + environment, + version: Version.V1_2_0, +}) + +const searchLanes = getSearchLanes({ environment }) + +// Generate dynamic metadata for verifiers page +const environmentText = environment === Environment.Mainnet ? "Mainnet" : "Testnet" +const verifiersMetadata = { + title: `CCIP Verifiers - ${environmentText} Networks`, + description: `View all CCIP verifiers across ${environmentText} networks. Explore ${allVerifiers.length} verifiers, their addresses, types, and supported networks for cross-chain verification.`, + image: "/assets/product-logos/ccip-logo.svg", + excerpt: `CCIP verifiers ${environmentText.toLowerCase()} networks addresses types committee api cross-chain verification blockchain interoperability`, +} + +// Generate structured data for verifiers page +const currentPath = new URL(Astro.request.url).pathname +const canonicalForJsonLd = `${DOCS_BASE_URL}${currentPath}` +--- + +<CcipDirectoryLayout + frontmatter={{ + title: verifiersMetadata.title, + section: "ccip", + metadata: { + description: verifiersMetadata.description, + image: verifiersMetadata.image, + excerpt: verifiersMetadata.excerpt, + }, + }} + {headings} + environment={environment} + pageTitleOverride={verifiersMetadata.title} + metadataOverride={{ + description: verifiersMetadata.description, + image: verifiersMetadata.image, + excerpt: verifiersMetadata.excerpt, + }} +> + <ChainHero + chains={networks} + tokens={uniqueVerifiers.map((verifier) => ({ + id: verifier.id, + totalNetworks: verifier.totalNetworks, + logo: verifier.logo, + }))} + lanes={searchLanes} + environment={environment} + breadcrumbItems={[ + { + name: "CCIP Directory", + url: `/ccip/directory/${environment}`, + }, + { + name: "Verifiers", + url: `/ccip/directory/${environment}/verifiers`, + }, + ]} + client:load + /> + + <section class="layout"> + <div> + <Table client:load verifiers={allVerifiers} /> + </div> + </section> +</CcipDirectoryLayout> diff --git a/src/components/CCIP/Verifiers/Verifiers.css b/src/components/CCIP/Verifiers/Verifiers.css new file mode 100644 index 00000000000..eda464e886c --- /dev/null +++ b/src/components/CCIP/Verifiers/Verifiers.css @@ -0,0 +1,43 @@ +.layout { + margin: 0 auto; + padding: var(--space-6x); +} + +.layout h2 { + color: var(--gray-900); + font-size: 22px; + line-height: var(--space-10x); + padding-bottom: var(--space-4x); + border-bottom: 1px solid var(--gray-200); + margin-bottom: var(--space-6x); +} + +.layout h2 span { + color: var(--gray-400); + font-weight: 600; + letter-spacing: 0.5px; +} + +.networks__grid { + display: grid; + grid-template-columns: 1fr; + gap: var(--space-8x); +} + +.tokens__grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--space-8x); +} + +@media (min-width: 50em) { + .layout { + max-width: 1500px; + } +} + +@media (min-width: 992px) { + .layout { + padding: var(--space-10x) var(--space-8x); + } +} diff --git a/src/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 +--- + +<Verifiers environment={Environment.Mainnet} /> 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 +--- + +<Verifiers environment={Environment.Testnet} /> From f6fbab7ade0bc8fb2f4ff23b87d518e0b517cfde Mon Sep 17 00:00:00 2001 From: Syed Asad Kazmi <36279345+SyedAsadKazmi@users.noreply.github.com> Date: Wed, 10 Dec 2025 22:08:36 +0530 Subject: [PATCH 043/214] DOC-1722 : Fix CCIP tutorials scrolling issue (#3273) --- .../LeftSidebar/leftSidebar.module.css | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/components/LeftSidebar/leftSidebar.module.css b/src/components/LeftSidebar/leftSidebar.module.css index 8a1f5b7a84b..1b0f96dcd06 100644 --- a/src/components/LeftSidebar/leftSidebar.module.css +++ b/src/components/LeftSidebar/leftSidebar.module.css @@ -1,19 +1,24 @@ .nav { - padding-bottom: calc(2 * var(--doc-padding)); width: 100%; - height: calc(100vh - var(--space-16x)); /* Subtract header height */ + height: calc(100vh - var(--space-16x)); + /* Subtract header height */ position: sticky; - top: var(--space-16x); /* Header height */ - overflow: hidden; /* Prevent nav overflow */ + top: var(--space-16x); + /* Header height */ + overflow: hidden; + /* Prevent nav overflow */ + display: flex; + flex-direction: column; } .sidebarDropdowns { padding-top: var(--space-3x); + flex-shrink: 0; } .navGroups { - padding: var(--doc-padding) var(--space-8x) var(--doc-padding) 0; - height: 100%; + padding: var(--doc-padding) var(--space-8x) calc(2 * var(--doc-padding)) 0; + flex: 1; overflow-y: auto; scrollbar-width: thin; scrollbar-color: var(--gray-300) transparent; From 5caf6ec9111d34037c469d25c96b7ae56066b02b Mon Sep 17 00:00:00 2001 From: aelmanaa <aelmanaa@gmail.com> Date: Wed, 10 Dec 2025 18:38:20 +0100 Subject: [PATCH 044/214] rate limits mocks --- public/api/ccip/v1/openapi.json | 1162 +- src/__mocks__/rate-limits-mainnet.json | 55946 ++++++++++++++++ src/__mocks__/rate-limits-testnet.json | 7465 +++ src/components/CCIP/Chain/ChainTokenGrid.tsx | 5 +- src/components/CCIP/Drawer/LaneDrawer.tsx | 57 +- src/components/CCIP/Drawer/TokenDrawer.tsx | 40 +- src/components/CCIP/Search/Search.tsx | 6 +- .../CCIP/Tables/TokenChainsTable.tsx | 16 + src/components/CCIP/Token/Token.astro | 5 +- src/config/data/ccip/data.ts | 23 +- src/config/data/ccip/types.ts | 14 +- .../data/ccip/v1_2_0/mainnet/lanes.json | 31290 +-------- .../data/ccip/v1_2_0/mainnet/tokens.json | 7218 +- .../data/ccip/v1_2_0/testnet/lanes.json | 4454 +- .../data/ccip/v1_2_0/testnet/tokens.json | 1582 +- src/lib/ccip/services/lane-data.ts | 372 +- src/lib/ccip/services/rate-limits-data.ts | 352 + src/lib/ccip/services/token-data.ts | 245 +- src/lib/ccip/types/index.ts | 291 +- src/lib/ccip/utils.ts | 118 +- src/pages/api/ccip/v1/chains.ts | 11 +- .../ccip/v1/drips/[chainName]/challenge.ts | 3 +- .../api/ccip/v1/drips/[chainName]/execute.ts | 3 +- .../api/ccip/v1/drips/[chainName]/index.ts | 3 +- src/pages/api/ccip/v1/lanes.ts | 19 +- .../[source]/[destination]/index.ts | 111 + .../[destination]/supported-tokens.ts | 111 + .../[source]/[destination]/index.ts | 111 + .../[destination]/supported-tokens.ts | 116 + .../[source]/[destination]/index.ts | 111 + .../[destination]/supported-tokens.ts | 111 + src/pages/api/ccip/v1/rate-limits.ts | 114 + src/pages/api/ccip/v1/tokens.ts | 7 +- .../ccip/v1/tokens/[tokenCanonicalSymbol].ts | 122 + .../tokens/[tokenCanonicalSymbol]/finality.ts | 122 + src/scripts/ccip/detect-new-tokens.ts | 14 +- src/scripts/ccip/generate-token-report.ts | 14 +- src/workers/data-worker.ts | 2 +- 38 files changed, 75595 insertions(+), 36171 deletions(-) create mode 100644 src/__mocks__/rate-limits-mainnet.json create mode 100644 src/__mocks__/rate-limits-testnet.json create mode 100644 src/lib/ccip/services/rate-limits-data.ts create mode 100644 src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/index.ts create mode 100644 src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/supported-tokens.ts create mode 100644 src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/index.ts create mode 100644 src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/supported-tokens.ts create mode 100644 src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/index.ts create mode 100644 src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/supported-tokens.ts create mode 100644 src/pages/api/ccip/v1/rate-limits.ts create mode 100644 src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol].ts create mode 100644 src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol]/finality.ts diff --git a/public/api/ccip/v1/openapi.json b/public/api/ccip/v1/openapi.json index 8cf38841257..23b0af9dbad 100644 --- a/public/api/ccip/v1/openapi.json +++ b/public/api/ccip/v1/openapi.json @@ -2,8 +2,8 @@ "openapi": "3.0.0", "info": { "title": "CCIP Docs config API", - "description": "API for retrieving CCIP chain, token, and lane information.\n\nTo get started quickly, you can download our [Postman Collection](/api/ccip/v1/postman-collection.json) which includes all endpoints and example requests.", - "version": "1.5.0", + "description": "API for retrieving CCIP chain, token, lane, and rate limits information.\n\nTo get started quickly, you can download our [Postman Collection](/api/ccip/v1/postman-collection.json) which includes all endpoints and example requests.", + "version": "1.11.0", "contact": { "name": "File issues", "url": "https://github.com/smartcontractkit/documentation/issues/new/choose" @@ -34,7 +34,7 @@ }, { "name": "lanes", - "description": "Cross-chain lane information endpoints" + "description": "Cross-chain lane information endpoints with rate limits" } ], "paths": { @@ -83,7 +83,7 @@ "example": "ethereum-mainnet,bsc-mainnet" }, { - "name": "outputKey", + "name": "output_key", "in": "query", "schema": { "type": "string", @@ -93,7 +93,7 @@ "description": "Key to use for organizing the response data" }, { - "name": "enrichFeeTokens", + "name": "enrich_fee_tokens", "in": "query", "schema": { "type": "string", @@ -270,7 +270,7 @@ "example": "1,56" }, { - "name": "outputKey", + "name": "output_key", "in": "query", "schema": { "type": "string", @@ -361,6 +361,275 @@ } } }, + "/tokens/{tokenCanonicalSymbol}": { + "get": { + "tags": ["tokens"], + "summary": "Retrieve detailed token information with custom finality data", + "description": "Returns detailed information about a specific CCIP token, including chain-specific configurations and custom finality settings (minBlockConfirmation and hasCustomFinality).", + "operationId": "getTokenDetail", + "parameters": [ + { + "name": "tokenCanonicalSymbol", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "The canonical symbol for the token (e.g., LINK, USDC, BETS)", + "example": "BETS" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + }, + { + "name": "output_key", + "in": "query", + "schema": { + "type": "string", + "enum": ["chainId", "selector", "internalId"], + "default": "chainId" + }, + "description": "Key to use for organizing the response data by chain" + } + ], + "responses": { + "200": { + "description": "Successful response with token detail data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenDetailApiResponse" + }, + "examples": { + "withCustomFinality": { + "summary": "Token with custom finality enabled", + "value": { + "metadata": { + "environment": "mainnet", + "timestamp": "2025-12-10T12:00:00Z", + "requestId": "123e4567-e89b-12d3-a456-426614174000", + "tokenSymbol": "BETS", + "chainCount": 2 + }, + "data": { + "43114": { + "chainId": 43114, + "chainName": "Avalanche", + "decimals": 18, + "destinations": ["1", "137"], + "name": "BetSwirl v2", + "poolAddress": "0xe9d2...9C06", + "poolType": "burnMint", + "symbol": "BETS", + "tokenAddress": "0x9402...E6e5", + "hasCustomFinality": true, + "minBlockConfirmation": 5 + }, + "1": { + "chainId": 1, + "chainName": "Ethereum", + "decimals": 18, + "destinations": ["43114"], + "name": "BetSwirl v2", + "poolAddress": "0x1234...5678", + "poolType": "lockRelease", + "symbol": "BETS", + "tokenAddress": "0xabcd...ef01", + "hasCustomFinality": false, + "minBlockConfirmation": 0 + } + } + } + }, + "unavailable": { + "summary": "Token with unavailable finality data", + "value": { + "metadata": { + "environment": "mainnet", + "timestamp": "2025-12-10T12:00:00Z", + "requestId": "456e7890-e89b-12d3-a456-426614174000", + "tokenSymbol": "USDC", + "chainCount": 1 + }, + "data": { + "1": { + "chainId": 1, + "chainName": "Ethereum", + "decimals": 6, + "destinations": ["43114"], + "name": "USD Coin", + "poolAddress": "0x1234...5678", + "poolType": "burnMint", + "symbol": "USDC", + "tokenAddress": "0xA0b8...c4d2", + "hasCustomFinality": null, + "minBlockConfirmation": null + } + } + } + } + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Token not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "NOT_FOUND", + "message": "Token 'INVALID' not found" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/tokens/{tokenCanonicalSymbol}/finality": { + "get": { + "tags": ["tokens"], + "summary": "Retrieve token finality data only", + "description": "Returns only custom finality information (hasCustomFinality and minBlockConfirmation) for a specific token across all chains. This is a lightweight endpoint that returns minimal data for UI components that only need finality status.", + "operationId": "getTokenFinality", + "parameters": [ + { + "name": "tokenCanonicalSymbol", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "The canonical symbol for the token (e.g., LINK, USDC, BETS)", + "example": "BETS" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + }, + { + "name": "output_key", + "in": "query", + "schema": { + "type": "string", + "enum": ["chainId", "selector", "internalId"], + "default": "chainId" + }, + "description": "Key to use for organizing the response data by chain" + } + ], + "responses": { + "200": { + "description": "Successful response with token finality data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenFinalityApiResponse" + }, + "examples": { + "mixedFinality": { + "summary": "Token with mixed finality states", + "value": { + "metadata": { + "environment": "mainnet", + "timestamp": "2025-12-10T12:00:00Z", + "requestId": "123e4567-e89b-12d3-a456-426614174000", + "tokenSymbol": "BETS", + "chainCount": 3 + }, + "data": { + "avalanche-mainnet": { + "hasCustomFinality": true, + "minBlockConfirmation": 5 + }, + "ethereum-mainnet": { + "hasCustomFinality": false, + "minBlockConfirmation": 0 + }, + "polygon-mainnet": { + "hasCustomFinality": null, + "minBlockConfirmation": null + } + } + } + } + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Token not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "NOT_FOUND", + "message": "Token 'INVALID' not found" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, "/lanes": { "get": { "tags": ["lanes"], @@ -379,7 +648,7 @@ "description": "The network environment to query" }, { - "name": "sourceChainId", + "name": "source_chain_id", "in": "query", "schema": { "type": "string" @@ -388,7 +657,7 @@ "example": "1,56" }, { - "name": "destinationChainId", + "name": "destination_chain_id", "in": "query", "schema": { "type": "string" @@ -397,7 +666,7 @@ "example": "137,42161" }, { - "name": "sourceSelector", + "name": "source_selector", "in": "query", "schema": { "type": "string" @@ -406,7 +675,7 @@ "example": "5009297550715157269" }, { - "name": "destinationSelector", + "name": "destination_selector", "in": "query", "schema": { "type": "string" @@ -415,7 +684,7 @@ "example": "4949039107694359620" }, { - "name": "sourceInternalId", + "name": "source_internal_id", "in": "query", "schema": { "type": "string" @@ -424,7 +693,7 @@ "example": "ethereum-mainnet" }, { - "name": "destinationInternalId", + "name": "destination_internal_id", "in": "query", "schema": { "type": "string" @@ -442,7 +711,7 @@ "example": "1.6.0" }, { - "name": "outputKey", + "name": "output_key", "in": "query", "schema": { "type": "string", @@ -522,8 +791,500 @@ } } }, - "400": { - "description": "Bad request - invalid parameters", + "400": { + "description": "Bad request - invalid parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/lanes/by-chain-id/{source}/{destination}": { + "get": { + "tags": ["lanes"], + "summary": "Retrieve lane details by chain ID", + "description": "Returns detailed information about a specific CCIP lane identified by source and destination chain IDs", + "operationId": "getLaneByChainId", + "parameters": [ + { + "name": "source", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Source chain ID (e.g., 1 for Ethereum, 56 for BSC)", + "example": "1" + }, + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Destination chain ID", + "example": "43114" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + } + ], + "responses": { + "200": { + "description": "Successful response with lane details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LaneDetailApiResponse" + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Lane not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/lanes/by-chain-id/{source}/{destination}/supported-tokens": { + "get": { + "tags": ["lanes"], + "summary": "Retrieve supported tokens with rate limits by chain ID", + "description": "Returns only the supported tokens and their rate limit configurations for a lane identified by chain IDs", + "operationId": "getSupportedTokensByChainId", + "parameters": [ + { + "name": "source", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Source chain ID", + "example": "1" + }, + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Destination chain ID", + "example": "43114" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + } + ], + "responses": { + "200": { + "description": "Successful response with supported tokens data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SupportedTokensApiResponse" + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Lane not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/lanes/by-selector/{source}/{destination}": { + "get": { + "tags": ["lanes"], + "summary": "Retrieve lane details by CCIP selector", + "description": "Returns detailed information about a specific CCIP lane identified by source and destination CCIP selectors", + "operationId": "getLaneBySelector", + "parameters": [ + { + "name": "source", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Source chain CCIP selector", + "example": "5009297550715157269" + }, + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Destination chain CCIP selector", + "example": "6433500567565415381" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + } + ], + "responses": { + "200": { + "description": "Successful response with lane details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LaneDetailApiResponse" + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Lane not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/lanes/by-selector/{source}/{destination}/supported-tokens": { + "get": { + "tags": ["lanes"], + "summary": "Retrieve supported tokens with rate limits by CCIP selector", + "description": "Returns only the supported tokens and their rate limit configurations for a lane identified by CCIP selectors", + "operationId": "getSupportedTokensBySelector", + "parameters": [ + { + "name": "source", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Source chain CCIP selector", + "example": "5009297550715157269" + }, + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Destination chain CCIP selector", + "example": "6433500567565415381" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + } + ], + "responses": { + "200": { + "description": "Successful response with supported tokens data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SupportedTokensApiResponse" + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Lane not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/lanes/by-internal-id/{source}/{destination}": { + "get": { + "tags": ["lanes"], + "summary": "Retrieve lane details by internal ID", + "description": "Returns detailed information about a specific CCIP lane identified by source and destination internal IDs", + "operationId": "getLaneByInternalId", + "parameters": [ + { + "name": "source", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Source chain internal identifier", + "example": "ethereum-mainnet" + }, + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Destination chain internal identifier", + "example": "avalanche-mainnet" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + } + ], + "responses": { + "200": { + "description": "Successful response with lane details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LaneDetailApiResponse" + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Lane not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/lanes/by-internal-id/{source}/{destination}/supported-tokens": { + "get": { + "tags": ["lanes"], + "summary": "Retrieve supported tokens with rate limits by internal ID", + "description": "Returns only the supported tokens and their rate limit configurations for a lane identified by internal IDs", + "operationId": "getSupportedTokensByInternalId", + "parameters": [ + { + "name": "source", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Source chain internal identifier", + "example": "ethereum-mainnet" + }, + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Destination chain internal identifier", + "example": "avalanche-mainnet" + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": ["mainnet", "testnet"] + }, + "description": "The network environment to query" + } + ], + "responses": { + "200": { + "description": "Successful response with supported tokens data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SupportedTokensApiResponse" + } + } + } + }, + "400": { + "description": "Invalid request parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Lane not found", "content": { "application/json": { "schema": { @@ -920,6 +1681,198 @@ } } }, + "LaneDetailApiResponse": { + "type": "object", + "required": ["metadata", "data"], + "properties": { + "metadata": { + "$ref": "#/components/schemas/LaneDetailMetadata" + }, + "data": { + "$ref": "#/components/schemas/LaneDetailWithRateLimits" + } + }, + "description": "Response for a single lane detail query with rate limits included" + }, + "LaneDetailWithRateLimits": { + "type": "object", + "required": ["sourceChain", "destinationChain", "onRamp", "offRamp", "supportedTokens"], + "properties": { + "sourceChain": { + "$ref": "#/components/schemas/ChainInfo" + }, + "destinationChain": { + "$ref": "#/components/schemas/ChainInfo" + }, + "onRamp": { + "type": "object", + "required": ["address", "version"], + "properties": { + "address": { + "type": "string", + "description": "OnRamp contract address" + }, + "version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$", + "description": "Normalized semantic version of the OnRamp contract" + }, + "enforceOutOfOrder": { + "type": "boolean", + "description": "Whether the OnRamp enforces out-of-order execution" + } + } + }, + "offRamp": { + "type": "object", + "required": ["address", "version"], + "properties": { + "address": { + "type": "string", + "description": "OffRamp contract address" + }, + "version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$", + "description": "Normalized semantic version of the OffRamp contract" + } + } + }, + "supportedTokens": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TokenRateLimits" + }, + "description": "Supported tokens with their rate limit configurations" + } + }, + "description": "Lane details with rate limits included in supportedTokens" + }, + "TokenRateLimits": { + "type": "object", + "properties": { + "standard": { + "oneOf": [{ "$ref": "#/components/schemas/RateLimiterDirections" }, { "type": "null" }], + "description": "Standard rate limit configuration (null if unavailable)" + }, + "custom": { + "oneOf": [{ "$ref": "#/components/schemas/RateLimiterDirections" }, { "type": "null" }], + "description": "Custom (FTF) rate limit configuration (null if unavailable)" + } + }, + "description": "Rate limit configurations for a token" + }, + "RateLimiterDirections": { + "type": "object", + "properties": { + "in": { + "$ref": "#/components/schemas/RateLimiterConfig" + }, + "out": { + "$ref": "#/components/schemas/RateLimiterConfig" + } + }, + "description": "Inbound and outbound rate limiter configurations" + }, + "RateLimiterConfig": { + "type": "object", + "required": ["capacity", "isEnabled", "rate"], + "properties": { + "capacity": { + "type": "string", + "description": "Maximum capacity in token units (wei for ERC20)" + }, + "isEnabled": { + "type": "boolean", + "description": "Whether the rate limiter is enabled" + }, + "rate": { + "type": "string", + "description": "Refill rate per second in token units" + } + }, + "description": "Single direction rate limiter configuration" + }, + "LaneDetailMetadata": { + "type": "object", + "required": ["environment", "timestamp", "requestId", "sourceChain", "destinationChain"], + "properties": { + "environment": { + "type": "string", + "enum": ["mainnet", "testnet"], + "description": "The network environment" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "ISO timestamp of the response" + }, + "requestId": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for the request" + }, + "sourceChain": { + "type": "string", + "description": "Source chain identifier used in the request" + }, + "destinationChain": { + "type": "string", + "description": "Destination chain identifier used in the request" + } + } + }, + "SupportedTokensApiResponse": { + "type": "object", + "required": ["metadata", "data"], + "properties": { + "metadata": { + "$ref": "#/components/schemas/SupportedTokensMetadata" + }, + "data": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TokenRateLimits" + }, + "description": "Supported tokens with their rate limit configurations" + } + }, + "description": "Response containing only supported tokens and their rate limits" + }, + "SupportedTokensMetadata": { + "type": "object", + "required": ["environment", "timestamp", "requestId", "sourceChain", "destinationChain", "tokenCount"], + "properties": { + "environment": { + "type": "string", + "enum": ["mainnet", "testnet"], + "description": "The network environment" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "ISO timestamp of the response" + }, + "requestId": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for the request" + }, + "sourceChain": { + "type": "string", + "description": "Source chain identifier used in the request" + }, + "destinationChain": { + "type": "string", + "description": "Destination chain identifier used in the request" + }, + "tokenCount": { + "type": "integer", + "minimum": 0, + "description": "Number of supported tokens returned" + } + } + }, "ErrorResponse": { "type": "object", "required": ["error", "message"], @@ -1046,6 +1999,103 @@ } } }, + "TokenDetailChainData": { + "type": "object", + "description": "Extended token chain data with custom finality information", + "allOf": [ + { + "$ref": "#/components/schemas/TokenChainData" + }, + { + "type": "object", + "properties": { + "hasCustomFinality": { + "type": ["boolean", "null"], + "description": "Whether custom finality is enabled (derived from minBlockConfirmation > 0). Null if data is unavailable." + }, + "minBlockConfirmation": { + "type": ["integer", "null"], + "description": "Minimum block confirmations required. Null if data is unavailable." + } + } + } + ] + }, + "TokenDetailMetadata": { + "type": "object", + "required": ["environment", "timestamp", "requestId", "tokenSymbol", "chainCount"], + "properties": { + "environment": { + "type": "string", + "enum": ["mainnet", "testnet"], + "description": "Network environment" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp of the response" + }, + "requestId": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for this request" + }, + "tokenSymbol": { + "type": "string", + "description": "Canonical symbol of the requested token" + }, + "chainCount": { + "type": "integer", + "description": "Number of chains this token is available on" + } + } + }, + "TokenDetailApiResponse": { + "type": "object", + "required": ["metadata", "data"], + "properties": { + "metadata": { + "$ref": "#/components/schemas/TokenDetailMetadata" + }, + "data": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TokenDetailChainData" + }, + "description": "Token data indexed by chain ID/selector, including custom finality information" + } + } + }, + "TokenFinalityData": { + "type": "object", + "description": "Finality data for a token on a specific chain", + "properties": { + "hasCustomFinality": { + "type": ["boolean", "null"], + "description": "Whether custom finality is enabled (derived from minBlockConfirmation > 0). Null if data is unavailable." + }, + "minBlockConfirmation": { + "type": ["integer", "null"], + "description": "Minimum block confirmations required. Null if data is unavailable." + } + } + }, + "TokenFinalityApiResponse": { + "type": "object", + "required": ["metadata", "data"], + "properties": { + "metadata": { + "$ref": "#/components/schemas/TokenDetailMetadata" + }, + "data": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TokenFinalityData" + }, + "description": "Finality data indexed by chain ID/selector" + } + } + }, "TokenDetails": { "type": "object", "required": ["symbol", "lanes", "chains"], @@ -1120,6 +2170,88 @@ "description": "List of tokens that were ignored due to configuration issues" } } + }, + "RateLimitsMetadata": { + "type": "object", + "required": ["environment", "timestamp", "requestId", "sourceChain", "destinationChain", "tokenCount"], + "properties": { + "environment": { + "type": "string", + "enum": ["mainnet", "testnet"], + "description": "The network environment" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "ISO timestamp of the response" + }, + "requestId": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for the request" + }, + "sourceChain": { + "type": "string", + "description": "Source chain internal identifier" + }, + "destinationChain": { + "type": "string", + "description": "Destination chain internal identifier" + }, + "tokenCount": { + "type": "integer", + "minimum": 0, + "description": "Number of tokens in the response" + } + } + }, + "RateLimiterConfig": { + "type": "object", + "required": ["capacity", "isEnabled", "rate"], + "properties": { + "capacity": { + "type": "string", + "description": "Maximum token capacity for rate limiting (in token smallest unit as string)" + }, + "isEnabled": { + "type": "boolean", + "description": "Whether rate limiting is enabled for this direction" + }, + "rate": { + "type": "string", + "description": "Rate of token replenishment per second (in token smallest unit as string)" + } + } + }, + "TokenRateLimits": { + "type": "object", + "properties": { + "in": { + "$ref": "#/components/schemas/RateLimiterConfig", + "description": "Inbound rate limiter configuration (tokens coming into destination chain)" + }, + "out": { + "$ref": "#/components/schemas/RateLimiterConfig", + "description": "Outbound rate limiter configuration (tokens leaving source chain)" + } + }, + "description": "Rate limiter configurations for both inbound and outbound directions" + }, + "RateLimitsApiResponse": { + "type": "object", + "required": ["metadata", "data"], + "properties": { + "metadata": { + "$ref": "#/components/schemas/RateLimitsMetadata" + }, + "data": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TokenRateLimits" + }, + "description": "Rate limits data indexed by token symbol" + } + } } } } diff --git a/src/__mocks__/rate-limits-mainnet.json b/src/__mocks__/rate-limits-mainnet.json new file mode 100644 index 00000000000..3f90fff496c --- /dev/null +++ b/src/__mocks__/rate-limits-mainnet.json @@ -0,0 +1,55946 @@ +{ + "$PAAL": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "1XMM": { + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "AISTR": { + "bsc-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "ANIMA": { + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + } + }, + "APRS": { + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "11910000000000000000000000", + "isEnabled": true, + "rate": "137847213400000000000" + }, + "out": { + "capacity": "18090000000000000000000000", + "isEnabled": true, + "rate": "209375000000000000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "347222200000000000000" + }, + "out": { + "capacity": "27000000000000000000000000", + "isEnabled": true, + "rate": "312500000000000000000" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "20370000000000000000000000", + "isEnabled": true, + "rate": "235763873800000000000" + }, + "out": { + "capacity": "14931000000000000000000000", + "isEnabled": true, + "rate": "172812500000000000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "347222200000000000000" + }, + "out": { + "capacity": "27000000000000000000000000", + "isEnabled": true, + "rate": "312500000000000000000" + } + } + } + } + } + }, + "APU": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "30600000000000000000000000", + "isEnabled": true, + "rate": "8499999976200000000000" + }, + "out": { + "capacity": "32900000000000000000000000", + "isEnabled": true, + "rate": "9138888863300000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "45700000000000000000000000", + "isEnabled": true, + "rate": "12694444408900000000000" + }, + "out": { + "capacity": "49600000000000000000000000", + "isEnabled": true, + "rate": "13777777739200000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "44700000000000000000000000", + "isEnabled": true, + "rate": "12416666631900000000000" + }, + "out": { + "capacity": "34300000000000000000000000", + "isEnabled": true, + "rate": "9527777751100000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "56600000000000000000000000", + "isEnabled": true, + "rate": "15722222178200000000000" + }, + "out": { + "capacity": "46200000000000000000000000", + "isEnabled": true, + "rate": "12833333297400000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "36000000000000000000000000", + "isEnabled": true, + "rate": "9999999972000000000000" + }, + "out": { + "capacity": "56400000000000000000000000", + "isEnabled": true, + "rate": "15666666622800000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27777777700000000000000" + } + } + } + } + } + }, + "avBTC": { + "avalanche-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "avETH": { + "avalanche-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "avETHx": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "avUSD": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "avUSDx": { + "avalanche-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "AXS": { + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BANANA": { + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1017000000000000000000000", + "isEnabled": true, + "rate": "11770832580000000000" + }, + "out": { + "capacity": "460350000000000000000000", + "isEnabled": true, + "rate": "5328125000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "17361110000000000000" + }, + "out": { + "capacity": "1350000000000000000000000", + "isEnabled": true, + "rate": "15625000000000000000" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "538500000000000000000000", + "isEnabled": true, + "rate": "6232638490000000000" + }, + "out": { + "capacity": "507600000000000000000000", + "isEnabled": true, + "rate": "5875000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "17361110000000000000" + }, + "out": { + "capacity": "1350000000000000000000000", + "isEnabled": true, + "rate": "15625000000000000000" + } + } + } + } + } + }, + "BANK": { + "bsc-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BARD": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "beraBTC": { + "berachain-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BETS": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "11970000000000000000000000", + "isEnabled": true, + "rate": "19950000000000000000000" + }, + "out": { + "capacity": "11730000000000000000000000", + "isEnabled": true, + "rate": "19550000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "50000000000000000000000" + }, + "out": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "50000000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "18810000000000000000000000", + "isEnabled": true, + "rate": "31350000000000000000000" + }, + "out": { + "capacity": "13020000000000000000000000", + "isEnabled": true, + "rate": "21700000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "50000000000000000000000" + }, + "out": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "50000000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "19350000000000000000000000", + "isEnabled": true, + "rate": "32250000000000000000000" + }, + "out": { + "capacity": "13260000000000000000000000", + "isEnabled": true, + "rate": "22100000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "50000000000000000000000" + }, + "out": { + "capacity": "30000000000000000000000000", + "isEnabled": true, + "rate": "50000000000000000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-unichain-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": null, + "standard": null + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BKN": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BMX": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "65300000000000000000000", + "isEnabled": true, + "rate": "18133810000000000000" + }, + "out": { + "capacity": "50800000000000000000000", + "isEnabled": true, + "rate": "14107160000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27770000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27770000000000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "65100000000000000000000", + "isEnabled": true, + "rate": "18078270000000000000" + }, + "out": { + "capacity": "36500000000000000000000", + "isEnabled": true, + "rate": "10136050000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27770000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27770000000000000000" + } + } + } + } + }, + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "35500000000000000000000", + "isEnabled": true, + "rate": "9858350000000000000" + }, + "out": { + "capacity": "55300000000000000000000", + "isEnabled": true, + "rate": "15356810000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27770000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27770000000000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BOB": { + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BOLD": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "berachain-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-scroll-1": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-scroll-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BONE": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "celo-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-andromeda-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-blast-1": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-scroll-1": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zircuit-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": null, + "standard": null + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "celo-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-andromeda-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-scroll-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polkadot-mainnet-astar": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polkadot-mainnet-astar": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "xdai-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BR": { + "berachain-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "2980000000000000000000000", + "isEnabled": true, + "rate": "34568000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "682000000000000000", + "isEnabled": true, + "rate": "68200000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000", + "isEnabled": true, + "rate": "100000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "326000000000000000", + "isEnabled": true, + "rate": "32600000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000", + "isEnabled": true, + "rate": "100000000000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "2780000000000000000000000", + "isEnabled": true, + "rate": "32248000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "2865000000000000000000000", + "isEnabled": true, + "rate": "33234000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "2370000000000000000000000", + "isEnabled": true, + "rate": "27492000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "283500000000000", + "isEnabled": true, + "rate": "3288600000" + }, + "out": { + "capacity": "2075000000000000000000000", + "isEnabled": true, + "rate": "24070000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "5800000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "471000000000000000", + "isEnabled": true, + "rate": "47100000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000", + "isEnabled": true, + "rate": "100000000000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "2070000000000000000000000", + "isEnabled": true, + "rate": "24012000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "511000000000000000", + "isEnabled": true, + "rate": "51100000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000", + "isEnabled": true, + "rate": "100000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "676000000000000000", + "isEnabled": true, + "rate": "67600000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000", + "isEnabled": true, + "rate": "100000000000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "2620000000000000000000000", + "isEnabled": true, + "rate": "30392000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "595000000000000000", + "isEnabled": true, + "rate": "59500000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000", + "isEnabled": true, + "rate": "100000000000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "347500000000000", + "isEnabled": true, + "rate": "4031000000" + }, + "out": { + "capacity": "273000000000000", + "isEnabled": true, + "rate": "3166800000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "5800000000" + }, + "out": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "5800000000" + } + } + } + } + } + }, + "brBTC": { + "aptos-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "91400000", + "isEnabled": true, + "rate": "1057" + }, + "out": { + "capacity": "113000000", + "isEnabled": true, + "rate": "1307" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "107200000", + "isEnabled": true, + "rate": "1240" + }, + "out": { + "capacity": "113800000", + "isEnabled": true, + "rate": "1317" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "berachain-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "127800000", + "isEnabled": true, + "rate": "1479" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "94200000", + "isEnabled": true, + "rate": "1090" + }, + "out": { + "capacity": "72600000", + "isEnabled": true, + "rate": "840" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "91600000", + "isEnabled": true, + "rate": "1060" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "120800000", + "isEnabled": true, + "rate": "1398" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "73600000", + "isEnabled": true, + "rate": "851" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-xlayer-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "133600000", + "isEnabled": true, + "rate": "1546" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "80400000", + "isEnabled": true, + "rate": "930" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "108400000", + "isEnabled": true, + "rate": "1254" + }, + "out": { + "capacity": "118800000", + "isEnabled": true, + "rate": "1375" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "berachain-mainnet": { + "custom": null, + "standard": null + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "135400000", + "isEnabled": true, + "rate": "1567" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "132200000", + "isEnabled": true, + "rate": "1530" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "111800000", + "isEnabled": true, + "rate": "1294" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "ethereum-mainnet-xlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "73000000", + "isEnabled": true, + "rate": "844" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "73200000", + "isEnabled": true, + "rate": "847" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "120600000", + "isEnabled": true, + "rate": "1395" + }, + "out": { + "capacity": "139600000", + "isEnabled": true, + "rate": "1615" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "139400000", + "isEnabled": true, + "rate": "1613" + }, + "out": { + "capacity": "85800000", + "isEnabled": true, + "rate": "993" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + } + }, + "BTR": { + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "BYTES": { + "avalanche-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CANNED": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CGX": { + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CHEX": { + "bsc-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CHIKA": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CKP": { + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "44400000000000000000000", + "isEnabled": true, + "rate": "12432000000000000000" + }, + "out": { + "capacity": "30500000000000000000000", + "isEnabled": true, + "rate": "8540000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "28000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "28000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "56500000000000000000000", + "isEnabled": true, + "rate": "15820000000000000000" + }, + "out": { + "capacity": "62300000000000000000000", + "isEnabled": true, + "rate": "17444000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "28000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "28000000000000000000" + } + } + } + } + } + }, + "clBTC": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CRTV": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "DAMN": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "DEGEN": { + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "DFX": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "3145000000000000000000000", + "isEnabled": true, + "rate": "35853000000000000000" + }, + "out": { + "capacity": "2865000000000000000000000", + "isEnabled": true, + "rate": "32661000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "2840000000000000000000000", + "isEnabled": true, + "rate": "32376000000000000000" + }, + "out": { + "capacity": "2025000000000000000000000", + "isEnabled": true, + "rate": "23085000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "2065000000000000000000000", + "isEnabled": true, + "rate": "23541000000000000000" + }, + "out": { + "capacity": "2795000000000000000000000", + "isEnabled": true, + "rate": "31863000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "3105000000000000000000000", + "isEnabled": true, + "rate": "35397000000000000000" + }, + "out": { + "capacity": "1705000000000000000000000", + "isEnabled": true, + "rate": "19437000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "3080000000000000000000000", + "isEnabled": true, + "rate": "35112000000000000000" + }, + "out": { + "capacity": "2095000000000000000000000", + "isEnabled": true, + "rate": "23883000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1600000000000000000000000", + "isEnabled": true, + "rate": "18240000000000000000" + }, + "out": { + "capacity": "1980000000000000000000000", + "isEnabled": true, + "rate": "22572000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57000000000000000000" + } + } + } + } + } + }, + "DIP": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "6730000000000000000000000", + "isEnabled": true, + "rate": "1869594000000000000000" + }, + "out": { + "capacity": "3300000000000000000000000", + "isEnabled": true, + "rate": "916740000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "2778000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "2778000000000000000000" + } + } + } + } + } + }, + "DOBO": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "DOLO": { + "berachain-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "DPI": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "386802000000000000000", + "isEnabled": true, + "rate": "26100000000000000" + }, + "out": { + "capacity": "431262000000000000000", + "isEnabled": true, + "rate": "29100000000000000" + } + }, + "standard": { + "in": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + }, + "out": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1698415000000000000000", + "isEnabled": true, + "rate": "117900000000000000" + }, + "out": { + "capacity": "873841000000000000000", + "isEnabled": true, + "rate": "60660000000000000" + } + }, + "standard": { + "in": { + "capacity": "2593000000000000000000", + "isEnabled": true, + "rate": "180000000000000000" + }, + "out": { + "capacity": "2593000000000000000000", + "isEnabled": true, + "rate": "180000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "245271000000000000000", + "isEnabled": true, + "rate": "16550000000000000" + }, + "out": { + "capacity": "472017000000000000000", + "isEnabled": true, + "rate": "31850000000000000" + } + }, + "standard": { + "in": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + }, + "out": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "469053000000000000000", + "isEnabled": true, + "rate": "31650000000000000" + }, + "out": { + "capacity": "246012000000000000000", + "isEnabled": true, + "rate": "16600000000000000" + } + }, + "standard": { + "in": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + }, + "out": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1571358000000000000000", + "isEnabled": true, + "rate": "109080000000000000" + }, + "out": { + "capacity": "902364000000000000000", + "isEnabled": true, + "rate": "62640000000000000" + } + }, + "standard": { + "in": { + "capacity": "2593000000000000000000", + "isEnabled": true, + "rate": "180000000000000000" + }, + "out": { + "capacity": "2593000000000000000000", + "isEnabled": true, + "rate": "180000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "223041000000000000000", + "isEnabled": true, + "rate": "15050000000000000" + }, + "out": { + "capacity": "312702000000000000000", + "isEnabled": true, + "rate": "21100000000000000" + } + }, + "standard": { + "in": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + }, + "out": { + "capacity": "741000000000000000000", + "isEnabled": true, + "rate": "50000000000000000" + } + } + } + } + } + }, + "dsETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "6383000000000000000", + "isEnabled": true, + "rate": "441900000000000" + }, + "out": { + "capacity": "5967000000000000000", + "isEnabled": true, + "rate": "413100000000000" + } + }, + "standard": { + "in": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + }, + "out": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "11200000000000000000", + "isEnabled": true, + "rate": "761600000000000" + }, + "out": { + "capacity": "11800000000000000000", + "isEnabled": true, + "rate": "802400000000000" + } + }, + "standard": { + "in": { + "capacity": "25000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "25000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "5642000000000000000", + "isEnabled": true, + "rate": "390600000000000" + }, + "out": { + "capacity": "6786000000000000000", + "isEnabled": true, + "rate": "469800000000000" + } + }, + "standard": { + "in": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + }, + "out": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "5213000000000000000", + "isEnabled": true, + "rate": "360900000000000" + }, + "out": { + "capacity": "6084000000000000000", + "isEnabled": true, + "rate": "421200000000000" + } + }, + "standard": { + "in": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + }, + "out": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "8175000000000000000", + "isEnabled": true, + "rate": "555900000000000" + }, + "out": { + "capacity": "10575000000000000000", + "isEnabled": true, + "rate": "719100000000000" + } + }, + "standard": { + "in": { + "capacity": "25000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "25000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "6981000000000000000", + "isEnabled": true, + "rate": "483300000000000" + }, + "out": { + "capacity": "5317000000000000000", + "isEnabled": true, + "rate": "368100000000000" + } + }, + "standard": { + "in": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + }, + "out": { + "capacity": "13000000000000000000", + "isEnabled": true, + "rate": "900000000000000" + } + } + } + } + } + }, + "EARNM": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "240000000000000000000000", + "isEnabled": true, + "rate": "66662400000000000000" + }, + "out": { + "capacity": "359375000000000000000000", + "isEnabled": true, + "rate": "99820000000000000000" + } + }, + "standard": { + "in": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + }, + "out": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "311250000000000000000000", + "isEnabled": true, + "rate": "86452800000000000000" + }, + "out": { + "capacity": "340000000000000000000000", + "isEnabled": true, + "rate": "94438400000000000000" + } + }, + "standard": { + "in": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + }, + "out": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "60000000000000000000000000", + "isEnabled": true, + "rate": "16666800000000000000000" + }, + "out": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13889000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": null, + "standard": null + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "36800000000000000000000000", + "isEnabled": true, + "rate": "10222304000000000000000" + }, + "out": { + "capacity": "58400000000000000000000000", + "isEnabled": true, + "rate": "16222352000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "410625000000000000000000", + "isEnabled": true, + "rate": "114055200000000000000" + }, + "out": { + "capacity": "219375000000000000000000", + "isEnabled": true, + "rate": "60933600000000000000" + } + }, + "standard": { + "in": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + }, + "out": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "195000000000000000000000", + "isEnabled": true, + "rate": "54163200000000000000" + }, + "out": { + "capacity": "266250000000000000000000", + "isEnabled": true, + "rate": "73953600000000000000" + } + }, + "standard": { + "in": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + }, + "out": { + "capacity": "625000000000000000000000", + "isEnabled": true, + "rate": "173600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "23300000000000000000000000", + "isEnabled": true, + "rate": "6472274000000000000000" + }, + "out": { + "capacity": "29750000000000000000000000", + "isEnabled": true, + "rate": "8263955000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13889000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13889000000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13889000000000000000000" + }, + "out": { + "capacity": "45700000000000000000000000", + "isEnabled": true, + "rate": "12694546000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "62700000000000000000000000", + "isEnabled": true, + "rate": "17416806000000000000000" + }, + "out": { + "capacity": "63100000000000000000000000", + "isEnabled": true, + "rate": "17527918000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "29250000000000000000000000", + "isEnabled": true, + "rate": "8125065000000000000000" + }, + "out": { + "capacity": "29350000000000000000000000", + "isEnabled": true, + "rate": "8152843000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13889000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13889000000000000000000" + } + } + } + } + } + }, + "EDEN": { + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "egETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "62400000000000000000", + "isEnabled": true, + "rate": "5778240000000000" + }, + "out": { + "capacity": "61200000000000000000", + "isEnabled": true, + "rate": "5667120000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "55200000000000000000", + "isEnabled": true, + "rate": "5111520000000000" + }, + "out": { + "capacity": "69200000000000000000", + "isEnabled": true, + "rate": "6407920000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + }, + "sonic-mainnet": { + "custom": null, + "standard": null + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "65500000000000000000", + "isEnabled": true, + "rate": "6065300000000000" + }, + "out": { + "capacity": "64400000000000000000", + "isEnabled": true, + "rate": "5963440000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + } + }, + "elizaOS": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "EmCH": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "enzoBTC": { + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-hashkey-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-hashkey-1": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "ETHx": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "598000000000000000000", + "isEnabled": true, + "rate": "33488000000000000" + }, + "out": { + "capacity": "578000000000000000000", + "isEnabled": true, + "rate": "32368000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "464000000000000000000", + "isEnabled": true, + "rate": "25984000000000000" + }, + "out": { + "capacity": "572000000000000000000", + "isEnabled": true, + "rate": "32032000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "469000000000000000000", + "isEnabled": true, + "rate": "26264000000000000" + }, + "out": { + "capacity": "603000000000000000000", + "isEnabled": true, + "rate": "33768000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "632000000000000000000", + "isEnabled": true, + "rate": "35392000000000000" + }, + "out": { + "capacity": "668000000000000000000", + "isEnabled": true, + "rate": "37408000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "56000000000000000" + } + } + } + } + } + }, + "eUSX": { + "plasma-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "FEED": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": null, + "remote": { + "shibarium-mainnet": { + "custom": null, + "standard": null + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "FF": { + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "FHE": { + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mind-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mind-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mind-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "FLUID": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1254000000000000000000000", + "isEnabled": true, + "rate": "14513888888888888888" + }, + "out": { + "capacity": "802000000000000000000000", + "isEnabled": true, + "rate": "9282407407407407407" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1292000000000000000000000", + "isEnabled": true, + "rate": "14953703703703703703" + }, + "out": { + "capacity": "828000000000000000000000", + "isEnabled": true, + "rate": "9583333333333333333" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "186500000000000000000000", + "isEnabled": true, + "rate": "2158551000000000000" + }, + "out": { + "capacity": "317500000000000000000000", + "isEnabled": true, + "rate": "3674745000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "216000000000000000000000", + "isEnabled": true, + "rate": "2499999999999999999" + }, + "out": { + "capacity": "215000000000000000000000", + "isEnabled": true, + "rate": "2488425925925925925" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037037037037037" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037037037037037" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1202000000000000000000000", + "isEnabled": true, + "rate": "13912037037037037036" + }, + "out": { + "capacity": "1250000000000000000000000", + "isEnabled": true, + "rate": "14467592592592592592" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "668000000000000000000000", + "isEnabled": true, + "rate": "7731481481481481481" + }, + "out": { + "capacity": "840000000000000000000000", + "isEnabled": true, + "rate": "9722222222222222222" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "341000000000000000000000", + "isEnabled": true, + "rate": "3946734000000000000" + }, + "out": { + "capacity": "286500000000000000000000", + "isEnabled": true, + "rate": "3315951000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "315500000000000000000000", + "isEnabled": true, + "rate": "3651620370370370370" + }, + "out": { + "capacity": "260000000000000000000000", + "isEnabled": true, + "rate": "3009259259259259259" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037037037037037" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037037037037037" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "864000000000000000000000", + "isEnabled": true, + "rate": "9999999999999999999" + }, + "out": { + "capacity": "1066000000000000000000000", + "isEnabled": true, + "rate": "12337962962962962962" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "762000000000000000000000", + "isEnabled": true, + "rate": "8819444444444444444" + }, + "out": { + "capacity": "902000000000000000000000", + "isEnabled": true, + "rate": "10439814814814814814" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148148148148148148" + } + } + }, + "plasma-mainnet": { + "custom": null, + "standard": null + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314814814814814814" + }, + "out": { + "capacity": "336500000000000000000000", + "isEnabled": true, + "rate": "3894675925925925925" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037037037037037" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037037037037037" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "152500000000000000000000", + "isEnabled": true, + "rate": "1765035000000000000" + }, + "out": { + "capacity": "206500000000000000000000", + "isEnabled": true, + "rate": "2390031000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "239000000000000000000000", + "isEnabled": true, + "rate": "2766186000000000000" + }, + "out": { + "capacity": "312000000000000000000000", + "isEnabled": true, + "rate": "3611088000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "206000000000000000000000", + "isEnabled": true, + "rate": "2384244000000000000" + }, + "out": { + "capacity": "159000000000000000000000", + "isEnabled": true, + "rate": "1840266000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "208500000000000", + "isEnabled": true, + "rate": "2413179000" + }, + "out": { + "capacity": "302500000000000000000000", + "isEnabled": true, + "rate": "3501135000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "5787000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "315500000000000", + "isEnabled": true, + "rate": "14606451100" + }, + "out": { + "capacity": "288000000000000", + "isEnabled": true, + "rate": "13333305600" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "23148100000" + }, + "out": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "23148100000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "200500000000000", + "isEnabled": true, + "rate": "9282388100" + }, + "out": { + "capacity": "264500000000000", + "isEnabled": true, + "rate": "12245344900" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "23148100000" + }, + "out": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "23148100000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "333000000000000", + "isEnabled": true, + "rate": "15416634600" + }, + "out": { + "capacity": "262500000000000", + "isEnabled": true, + "rate": "12152752500" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "23148100000" + }, + "out": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "23148100000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "235500000000000", + "isEnabled": true, + "rate": "2725677000" + }, + "out": { + "capacity": "268000000000000", + "isEnabled": true, + "rate": "3101832000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "5787000000" + }, + "out": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "5787000000" + } + } + } + } + } + }, + "GEN": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "GHO": { + "avalanche-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "798000000000000000000000", + "isEnabled": true, + "rate": "159600000000000000000" + }, + "out": { + "capacity": "961500000000000000000000", + "isEnabled": true, + "rate": "192300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "462000000000000000000000", + "isEnabled": true, + "rate": "92400000000000000000" + }, + "out": { + "capacity": "1026000000000000000000000", + "isEnabled": true, + "rate": "205200000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "973500000000000000000000", + "isEnabled": true, + "rate": "194700000000000000000" + }, + "out": { + "capacity": "645000000000000000000000", + "isEnabled": true, + "rate": "129000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "690000000000000000000000", + "isEnabled": true, + "rate": "138000000000000000000" + }, + "out": { + "capacity": "901500000000000000000000", + "isEnabled": true, + "rate": "180300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "693000000000000000000000", + "isEnabled": true, + "rate": "138600000000000000000" + }, + "out": { + "capacity": "760500000000000000000000", + "isEnabled": true, + "rate": "152100000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "897000000000000000000000", + "isEnabled": true, + "rate": "179400000000000000000" + }, + "out": { + "capacity": "646500000000000000000000", + "isEnabled": true, + "rate": "129300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "555000000000000000000000", + "isEnabled": true, + "rate": "111000000000000000000" + }, + "out": { + "capacity": "618000000000000000000000", + "isEnabled": true, + "rate": "123600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1038000000000000000000000", + "isEnabled": true, + "rate": "207600000000000000000" + }, + "out": { + "capacity": "888000000000000000000000", + "isEnabled": true, + "rate": "177600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "853500000000000000000000", + "isEnabled": true, + "rate": "170700000000000000000" + }, + "out": { + "capacity": "1035000000000000000000000", + "isEnabled": true, + "rate": "207000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "912000000000000000000000", + "isEnabled": true, + "rate": "182400000000000000000" + }, + "out": { + "capacity": "1005000000000000000000000", + "isEnabled": true, + "rate": "201000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "559500000000000000000000", + "isEnabled": true, + "rate": "111900000000000000000" + }, + "out": { + "capacity": "825000000000000000000000", + "isEnabled": true, + "rate": "165000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "643500000000000000000000", + "isEnabled": true, + "rate": "128700000000000000000" + }, + "out": { + "capacity": "744000000000000000000000", + "isEnabled": true, + "rate": "148800000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "864000000000000000000000", + "isEnabled": true, + "rate": "172800000000000000000" + }, + "out": { + "capacity": "496500000000000000000000", + "isEnabled": true, + "rate": "99300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "769500000000000000000000", + "isEnabled": true, + "rate": "153900000000000000000" + }, + "out": { + "capacity": "601500000000000000000000", + "isEnabled": true, + "rate": "120300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "808500000000000000000000", + "isEnabled": true, + "rate": "161700000000000000000" + }, + "out": { + "capacity": "714000000000000000000000", + "isEnabled": true, + "rate": "142800000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000500000000000000000000", + "isEnabled": true, + "rate": "200100000000000000000" + }, + "out": { + "capacity": "856500000000000000000000", + "isEnabled": true, + "rate": "171300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "460500000000000000000000", + "isEnabled": true, + "rate": "92100000000000000000" + }, + "out": { + "capacity": "672000000000000000000000", + "isEnabled": true, + "rate": "134400000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "907500000000000000000000", + "isEnabled": true, + "rate": "181500000000000000000" + }, + "out": { + "capacity": "936000000000000000000000", + "isEnabled": true, + "rate": "187200000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "906000000000000000000000", + "isEnabled": true, + "rate": "181200000000000000000" + }, + "out": { + "capacity": "754500000000000000000000", + "isEnabled": true, + "rate": "150900000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "811500000000000000000000", + "isEnabled": true, + "rate": "162300000000000000000" + }, + "out": { + "capacity": "655500000000000000000000", + "isEnabled": true, + "rate": "131100000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "561000000000000000000000", + "isEnabled": true, + "rate": "112200000000000000000" + }, + "out": { + "capacity": "894000000000000000000000", + "isEnabled": true, + "rate": "178800000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "829500000000000000000000", + "isEnabled": true, + "rate": "165900000000000000000" + }, + "out": { + "capacity": "519000000000000000000000", + "isEnabled": true, + "rate": "103800000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "997500000000000000000000", + "isEnabled": true, + "rate": "199500000000000000000" + }, + "out": { + "capacity": "981000000000000000000000", + "isEnabled": true, + "rate": "196200000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "861000000000000000000000", + "isEnabled": true, + "rate": "172200000000000000000" + }, + "out": { + "capacity": "933000000000000000000000", + "isEnabled": true, + "rate": "186600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "852000000000000000000000", + "isEnabled": true, + "rate": "170400000000000000000" + }, + "out": { + "capacity": "751500000000000000000000", + "isEnabled": true, + "rate": "150300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "616500000000000000000000", + "isEnabled": true, + "rate": "123300000000000000000" + }, + "out": { + "capacity": "1006500000000000000000000", + "isEnabled": true, + "rate": "201300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "766500000000000000000000", + "isEnabled": true, + "rate": "153300000000000000000" + }, + "out": { + "capacity": "540000000000000000000000", + "isEnabled": true, + "rate": "108000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "541500000000000000000000", + "isEnabled": true, + "rate": "108300000000000000000" + }, + "out": { + "capacity": "708000000000000000000000", + "isEnabled": true, + "rate": "141600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "574500000000000000000000", + "isEnabled": true, + "rate": "114900000000000000000" + }, + "out": { + "capacity": "583500000000000000000000", + "isEnabled": true, + "rate": "116700000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "936000000000000000000000", + "isEnabled": true, + "rate": "187200000000000000000" + }, + "out": { + "capacity": "487500000000000000000000", + "isEnabled": true, + "rate": "97500000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "846000000000000000000000", + "isEnabled": true, + "rate": "169200000000000000000" + }, + "out": { + "capacity": "783000000000000000000000", + "isEnabled": true, + "rate": "156600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "865500000000000000000000", + "isEnabled": true, + "rate": "173100000000000000000" + }, + "out": { + "capacity": "951000000000000000000000", + "isEnabled": true, + "rate": "190200000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "642000000000000000000000", + "isEnabled": true, + "rate": "128400000000000000000" + }, + "out": { + "capacity": "604500000000000000000000", + "isEnabled": true, + "rate": "120900000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + }, + "xdai-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "847500000000000000000000", + "isEnabled": true, + "rate": "169500000000000000000" + }, + "out": { + "capacity": "1026000000000000000000000", + "isEnabled": true, + "rate": "205200000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "654000000000000000000000", + "isEnabled": true, + "rate": "130800000000000000000" + }, + "out": { + "capacity": "492000000000000000000000", + "isEnabled": true, + "rate": "98400000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "666000000000000000000000", + "isEnabled": true, + "rate": "133200000000000000000" + }, + "out": { + "capacity": "642000000000000000000000", + "isEnabled": true, + "rate": "128400000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "478500000000000000000000", + "isEnabled": true, + "rate": "95700000000000000000" + }, + "out": { + "capacity": "508500000000000000000000", + "isEnabled": true, + "rate": "101700000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "808500000000000000000000", + "isEnabled": true, + "rate": "161700000000000000000" + }, + "out": { + "capacity": "525000000000000000000000", + "isEnabled": true, + "rate": "105000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "822000000000000000000000", + "isEnabled": true, + "rate": "164400000000000000000" + }, + "out": { + "capacity": "924000000000000000000000", + "isEnabled": true, + "rate": "184800000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "300000000000000000000" + } + } + } + } + } + }, + "GRT": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "302000000000000000000000", + "isEnabled": true, + "rate": "3495370369140000000" + }, + "out": { + "capacity": "587000000000000000000000", + "isEnabled": true, + "rate": "6793981479090000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "554000000000000000000000", + "isEnabled": true, + "rate": "6412037034780000000" + }, + "out": { + "capacity": "534000000000000000000000", + "isEnabled": true, + "rate": "6180555553380000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "316000000000000000000000", + "isEnabled": true, + "rate": "3657407406120000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "5787037035000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "611000000000000000000000", + "isEnabled": true, + "rate": "7071759256770000000" + }, + "out": { + "capacity": "466000000000000000000000", + "isEnabled": true, + "rate": "5393518516620000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000000" + } + } + } + } + } + }, + "hyETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "15120000000000000000", + "isEnabled": true, + "rate": "1080000000000000" + }, + "out": { + "capacity": "16436000000000000000", + "isEnabled": true, + "rate": "1174000000000000" + } + }, + "standard": { + "in": { + "capacity": "28000000000000000000", + "isEnabled": true, + "rate": "2000000000000000" + }, + "out": { + "capacity": "28000000000000000000", + "isEnabled": true, + "rate": "2000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "272000000000000000000", + "isEnabled": true, + "rate": "18876800000000000" + }, + "out": { + "capacity": "189000000000000000000", + "isEnabled": true, + "rate": "13116600000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000", + "isEnabled": true, + "rate": "34700000000000000" + }, + "out": { + "capacity": "500000000000000000000", + "isEnabled": true, + "rate": "34700000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "10612000000000000000", + "isEnabled": true, + "rate": "758000000000000" + }, + "out": { + "capacity": "13692000000000000000", + "isEnabled": true, + "rate": "978000000000000" + } + }, + "standard": { + "in": { + "capacity": "28000000000000000000", + "isEnabled": true, + "rate": "2000000000000000" + }, + "out": { + "capacity": "28000000000000000000", + "isEnabled": true, + "rate": "2000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "11452000000000000000", + "isEnabled": true, + "rate": "818000000000000" + }, + "out": { + "capacity": "12572000000000000000", + "isEnabled": true, + "rate": "898000000000000" + } + }, + "standard": { + "in": { + "capacity": "28000000000000000000", + "isEnabled": true, + "rate": "2000000000000000" + }, + "out": { + "capacity": "28000000000000000000", + "isEnabled": true, + "rate": "2000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": null, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + } + } + } + }, + "IBTC": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "189450000", + "isEnabled": true, + "rate": "35069" + }, + "out": { + "capacity": "266400000", + "isEnabled": true, + "rate": "49313" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "210150000", + "isEnabled": true, + "rate": "38901" + }, + "out": { + "capacity": "135900000", + "isEnabled": true, + "rate": "25156" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "202050000", + "isEnabled": true, + "rate": "37401" + }, + "out": { + "capacity": "184950000", + "isEnabled": true, + "rate": "34236" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "225450000", + "isEnabled": true, + "rate": "41733" + }, + "out": { + "capacity": "265050000", + "isEnabled": true, + "rate": "49063" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "243450000", + "isEnabled": true, + "rate": "45065" + }, + "out": { + "capacity": "266850000", + "isEnabled": true, + "rate": "49396" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "267300000", + "isEnabled": true, + "rate": "49480" + }, + "out": { + "capacity": "204300000", + "isEnabled": true, + "rate": "37818" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "220950000", + "isEnabled": true, + "rate": "40900" + }, + "out": { + "capacity": "170100000", + "isEnabled": true, + "rate": "31487" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "264600000", + "isEnabled": true, + "rate": "48980" + }, + "out": { + "capacity": "156150000", + "isEnabled": true, + "rate": "28905" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "295650000", + "isEnabled": true, + "rate": "54728" + }, + "out": { + "capacity": "173250000", + "isEnabled": true, + "rate": "32070" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "231750000", + "isEnabled": true, + "rate": "42899" + }, + "out": { + "capacity": "278100000", + "isEnabled": true, + "rate": "51479" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "167400000", + "isEnabled": true, + "rate": "30987" + }, + "out": { + "capacity": "234900000", + "isEnabled": true, + "rate": "43482" + } + }, + "standard": { + "in": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + }, + "out": { + "capacity": "450000000", + "isEnabled": true, + "rate": "83300" + } + } + } + } + } + }, + "ILMT": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "447000000000000", + "isEnabled": true, + "rate": "124166666666" + }, + "out": { + "capacity": "6390000000000000000000000", + "isEnabled": true, + "rate": "1775000000001420000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000", + "isEnabled": true, + "rate": "277777777778" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "2777777777780000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "531000000000000", + "isEnabled": true, + "rate": "147500000000" + }, + "out": { + "capacity": "671000000000000", + "isEnabled": true, + "rate": "186388888889" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000", + "isEnabled": true, + "rate": "277777777778" + }, + "out": { + "capacity": "1000000000000000", + "isEnabled": true, + "rate": "277777777778" + } + } + } + } + } + }, + "IXT": { + "bsc-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "JASMY": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "2120000000000000000000000", + "isEnabled": true, + "rate": "588888851200000000000" + }, + "out": { + "capacity": "3280000000000000000000000", + "isEnabled": true, + "rate": "911111052800000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "1388888800000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "1388888800000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2380000000000000000000000", + "isEnabled": true, + "rate": "661111068800000000000" + }, + "out": { + "capacity": "2335000000000000000000000", + "isEnabled": true, + "rate": "648611069600000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "1388888800000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "1388888800000000000000" + } + } + } + } + } + }, + "JCT": { + "bsc-mainnet": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "kHYPE": { + "hyperliquid-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "KNET": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LAND": { + "bsc-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "10520000000000000000000", + "isEnabled": true, + "rate": "2919300000000000000" + }, + "out": { + "capacity": "6600000000000000000000", + "isEnabled": true, + "rate": "1831500000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + }, + "out": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "9640000000000000000000", + "isEnabled": true, + "rate": "2675100000000000000" + }, + "out": { + "capacity": "12320000000000000000000", + "isEnabled": true, + "rate": "3418800000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + }, + "out": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "10140000000000000000000", + "isEnabled": true, + "rate": "2813850000000000000" + }, + "out": { + "capacity": "13840000000000000000000", + "isEnabled": true, + "rate": "3840600000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + }, + "out": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "11620000000000000000000", + "isEnabled": true, + "rate": "3224550000000000000" + }, + "out": { + "capacity": "10340000000000000000000", + "isEnabled": true, + "rate": "2869350000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + }, + "out": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "6660000000000000000000", + "isEnabled": true, + "rate": "1848150000000000000" + }, + "out": { + "capacity": "10280000000000000000000", + "isEnabled": true, + "rate": "2852700000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + }, + "out": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "10060000000000000000000", + "isEnabled": true, + "rate": "2791650000000000000" + }, + "out": { + "capacity": "13040000000000000000000", + "isEnabled": true, + "rate": "3618600000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + }, + "out": { + "capacity": "20000000000000000000000", + "isEnabled": true, + "rate": "5550000000000000000" + } + } + } + } + } + }, + "LBTC": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "2605000000", + "isEnabled": true, + "rate": "241203" + }, + "out": { + "capacity": "2145000000", + "isEnabled": true, + "rate": "198611" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1880000000", + "isEnabled": true, + "rate": "174074" + }, + "out": { + "capacity": "1795000000", + "isEnabled": true, + "rate": "166203" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "2080000000", + "isEnabled": true, + "rate": "192592" + }, + "out": { + "capacity": "2305000000", + "isEnabled": true, + "rate": "213425" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "2890000000", + "isEnabled": true, + "rate": "267592" + }, + "out": { + "capacity": "3255000000", + "isEnabled": true, + "rate": "301388" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "2975000000", + "isEnabled": true, + "rate": "275462" + }, + "out": { + "capacity": "1780000000", + "isEnabled": true, + "rate": "164814" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1980000000", + "isEnabled": true, + "rate": "183333" + }, + "out": { + "capacity": "3430000000", + "isEnabled": true, + "rate": "317592" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "stable-mainnet": { + "custom": { + "in": { + "capacity": "3350000000", + "isEnabled": true, + "rate": "310185" + }, + "out": { + "capacity": "2880000000", + "isEnabled": true, + "rate": "266666" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "berachain-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "3165000000", + "isEnabled": true, + "rate": "293055" + }, + "out": { + "capacity": "2425000000", + "isEnabled": true, + "rate": "224537" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "3420000000", + "isEnabled": true, + "rate": "316666" + }, + "out": { + "capacity": "1690000000", + "isEnabled": true, + "rate": "156481" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2305000000", + "isEnabled": true, + "rate": "213425" + }, + "out": { + "capacity": "1710000000", + "isEnabled": true, + "rate": "158333" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "3140000000", + "isEnabled": true, + "rate": "290740" + }, + "out": { + "capacity": "1505000000", + "isEnabled": true, + "rate": "139351" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "2775000000", + "isEnabled": true, + "rate": "256944" + }, + "out": { + "capacity": "1885000000", + "isEnabled": true, + "rate": "174537" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "3170000000", + "isEnabled": true, + "rate": "293518" + }, + "out": { + "capacity": "2445000000", + "isEnabled": true, + "rate": "226388" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "stable-mainnet": { + "custom": { + "in": { + "capacity": "2585000000", + "isEnabled": true, + "rate": "239351" + }, + "out": { + "capacity": "2665000000", + "isEnabled": true, + "rate": "246759" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "corn-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "2040000000", + "isEnabled": true, + "rate": "188888" + }, + "out": { + "capacity": "1550000000", + "isEnabled": true, + "rate": "143518" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1835000000", + "isEnabled": true, + "rate": "169907" + }, + "out": { + "capacity": "2040000000", + "isEnabled": true, + "rate": "188888" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": null, + "standard": null + }, + "monad-mainnet": { + "custom": null, + "standard": null + }, + "polygon-mainnet-katana": { + "custom": null, + "standard": null + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "2840000000", + "isEnabled": true, + "rate": "262962" + }, + "out": { + "capacity": "1800000000", + "isEnabled": true, + "rate": "166666" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "stable-mainnet": { + "custom": null, + "standard": null + } + } + }, + "etherlink-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1515000000", + "isEnabled": true, + "rate": "140277" + }, + "out": { + "capacity": "2630000000", + "isEnabled": true, + "rate": "243518" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "2730000000", + "isEnabled": true, + "rate": "252777" + }, + "out": { + "capacity": "2345000000", + "isEnabled": true, + "rate": "217129" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "2095000000", + "isEnabled": true, + "rate": "193981" + }, + "out": { + "capacity": "2805000000", + "isEnabled": true, + "rate": "259722" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1555000000", + "isEnabled": true, + "rate": "143981" + }, + "out": { + "capacity": "2600000000", + "isEnabled": true, + "rate": "240740" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "corn-mainnet": { + "custom": { + "in": { + "capacity": "2240000000", + "isEnabled": true, + "rate": "207407" + }, + "out": { + "capacity": "1695000000", + "isEnabled": true, + "rate": "156944" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2820000000", + "isEnabled": true, + "rate": "261111" + }, + "out": { + "capacity": "3490000000", + "isEnabled": true, + "rate": "323148" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "etherlink-mainnet": { + "custom": { + "in": { + "capacity": "3260000000", + "isEnabled": true, + "rate": "301851" + }, + "out": { + "capacity": "1590000000", + "isEnabled": true, + "rate": "147222" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "1705000000", + "isEnabled": true, + "rate": "157870" + }, + "out": { + "capacity": "2200000000", + "isEnabled": true, + "rate": "203703" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "2975000000", + "isEnabled": true, + "rate": "275462" + }, + "out": { + "capacity": "3015000000", + "isEnabled": true, + "rate": "279166" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "2530000000", + "isEnabled": true, + "rate": "234259" + }, + "out": { + "capacity": "3130000000", + "isEnabled": true, + "rate": "289814" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "stable-mainnet": { + "custom": null, + "standard": null + }, + "tac-mainnet": { + "custom": { + "in": { + "capacity": "2700000000", + "isEnabled": true, + "rate": "250000" + }, + "out": { + "capacity": "2595000000", + "isEnabled": true, + "rate": "240277" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "monad-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "2085000000", + "isEnabled": true, + "rate": "193055" + }, + "out": { + "capacity": "3255000000", + "isEnabled": true, + "rate": "301388" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1740000000", + "isEnabled": true, + "rate": "161111" + }, + "out": { + "capacity": "3395000000", + "isEnabled": true, + "rate": "314351" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1655000000", + "isEnabled": true, + "rate": "153240" + }, + "out": { + "capacity": "1630000000", + "isEnabled": true, + "rate": "150925" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "2720000000", + "isEnabled": true, + "rate": "251851" + }, + "out": { + "capacity": "3260000000", + "isEnabled": true, + "rate": "301851" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "polygon-mainnet-katana": { + "custom": null, + "standard": null + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1910000000", + "isEnabled": true, + "rate": "176851" + }, + "out": { + "capacity": "1560000000", + "isEnabled": true, + "rate": "144444" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "polygon-mainnet-katana": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "2710000000", + "isEnabled": true, + "rate": "250925" + }, + "out": { + "capacity": "2365000000", + "isEnabled": true, + "rate": "218981" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "2535000000", + "isEnabled": true, + "rate": "234722" + }, + "out": { + "capacity": "3400000000", + "isEnabled": true, + "rate": "314814" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1850000000", + "isEnabled": true, + "rate": "171296" + }, + "out": { + "capacity": "2830000000", + "isEnabled": true, + "rate": "262037" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "2200000000", + "isEnabled": true, + "rate": "203703" + }, + "out": { + "capacity": "2695000000", + "isEnabled": true, + "rate": "249537" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "2745000000", + "isEnabled": true, + "rate": "254166" + }, + "out": { + "capacity": "3405000000", + "isEnabled": true, + "rate": "315277" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1615000000", + "isEnabled": true, + "rate": "149537" + }, + "out": { + "capacity": "3045000000", + "isEnabled": true, + "rate": "281944" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "stable-mainnet": { + "custom": { + "in": { + "capacity": "2195000000", + "isEnabled": true, + "rate": "203240" + }, + "out": { + "capacity": "3000000000", + "isEnabled": true, + "rate": "277777" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "2235000000", + "isEnabled": true, + "rate": "206944" + }, + "out": { + "capacity": "3220000000", + "isEnabled": true, + "rate": "298148" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "2855000000", + "isEnabled": true, + "rate": "264351" + }, + "out": { + "capacity": "3280000000", + "isEnabled": true, + "rate": "303703" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2860000000", + "isEnabled": true, + "rate": "264814" + }, + "out": { + "capacity": "1525000000", + "isEnabled": true, + "rate": "141203" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1805000000", + "isEnabled": true, + "rate": "167129" + }, + "out": { + "capacity": "2605000000", + "isEnabled": true, + "rate": "241203" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "3260000000", + "isEnabled": true, + "rate": "301851" + }, + "out": { + "capacity": "1630000000", + "isEnabled": true, + "rate": "150925" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "2250000000", + "isEnabled": true, + "rate": "208333" + }, + "out": { + "capacity": "3380000000", + "isEnabled": true, + "rate": "312962" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "stable-mainnet": { + "custom": { + "in": { + "capacity": "3230000000", + "isEnabled": true, + "rate": "299074" + }, + "out": { + "capacity": "2370000000", + "isEnabled": true, + "rate": "219444" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "stable-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1900000000", + "isEnabled": true, + "rate": "175925" + }, + "out": { + "capacity": "1950000000", + "isEnabled": true, + "rate": "180555" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "3115000000", + "isEnabled": true, + "rate": "288425" + }, + "out": { + "capacity": "1970000000", + "isEnabled": true, + "rate": "182407" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2070000000", + "isEnabled": true, + "rate": "191666" + }, + "out": { + "capacity": "2325000000", + "isEnabled": true, + "rate": "215277" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "1760000000", + "isEnabled": true, + "rate": "162962" + }, + "out": { + "capacity": "3205000000", + "isEnabled": true, + "rate": "296759" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "2255000000", + "isEnabled": true, + "rate": "208796" + }, + "out": { + "capacity": "1965000000", + "isEnabled": true, + "rate": "181944" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + }, + "tac-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "2475000000", + "isEnabled": true, + "rate": "229166" + }, + "out": { + "capacity": "1790000000", + "isEnabled": true, + "rate": "165740" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + } + } + } + }, + "LDY": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1635000000000000000000000", + "isEnabled": true, + "rate": "18922400000000000000" + }, + "out": { + "capacity": "1113000000000000000000000", + "isEnabled": true, + "rate": "12881120000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1995000000000000000000000", + "isEnabled": true, + "rate": "23088800000000000000" + }, + "out": { + "capacity": "1224000000000000000000000", + "isEnabled": true, + "rate": "14165760000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1215000000000000000000000", + "isEnabled": true, + "rate": "14061600000000000000" + }, + "out": { + "capacity": "1647000000000000000000000", + "isEnabled": true, + "rate": "19061280000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1101000000000000000000000", + "isEnabled": true, + "rate": "12742240000000000000" + }, + "out": { + "capacity": "1644000000000000000000000", + "isEnabled": true, + "rate": "19026560000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1812000000000000000000000", + "isEnabled": true, + "rate": "20970880000000000000" + }, + "out": { + "capacity": "1185000000000000000000000", + "isEnabled": true, + "rate": "13714400000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1260000000000000000000000", + "isEnabled": true, + "rate": "14582400000000000000" + }, + "out": { + "capacity": "1119000000000000000000000", + "isEnabled": true, + "rate": "12950560000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000" + } + } + } + } + } + }, + "LEASH": { + "avalanche-mainnet": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "celo-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-andromeda-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-blast-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-scroll-1": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zircuit-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "celo-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-andromeda-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-scroll-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polkadot-mainnet-astar": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polkadot-mainnet-astar": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "xdai-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LEND": { + "avalanche-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LINK": { + "0g-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ab-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "aptos-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3135000000000", + "isEnabled": true, + "rate": "870276000" + }, + "out": { + "capacity": "1990000000000", + "isEnabled": true, + "rate": "552424000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1595000000000", + "isEnabled": true, + "rate": "442772000" + }, + "out": { + "capacity": "1945000000000", + "isEnabled": true, + "rate": "539932000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1885000000000", + "isEnabled": true, + "rate": "523276000" + }, + "out": { + "capacity": "3380000000000", + "isEnabled": true, + "rate": "938288000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + } + } + } + } + }, + "celo-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "19350000000000000000000", + "isEnabled": true, + "rate": "5371560000000000000" + }, + "out": { + "capacity": "32800000000000000000000", + "isEnabled": true, + "rate": "9105280000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-andromeda-1": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "32600000000000000000000", + "isEnabled": true, + "rate": "9049760000000000000" + }, + "out": { + "capacity": "29850000000000000000000", + "isEnabled": true, + "rate": "8286360000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "2285000000000", + "isEnabled": true, + "rate": "634316000" + }, + "out": { + "capacity": "15550000000000000000000", + "isEnabled": true, + "rate": "4316680000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "17150000000000000000000", + "isEnabled": true, + "rate": "4760840000000000000" + }, + "out": { + "capacity": "19500000000000000000000", + "isEnabled": true, + "rate": "5413200000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "16550000000000000000000", + "isEnabled": true, + "rate": "4594280000000000000" + }, + "out": { + "capacity": "25850000000000000000000", + "isEnabled": true, + "rate": "7175960000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "24950000000000000000000", + "isEnabled": true, + "rate": "6926120000000000000" + }, + "out": { + "capacity": "20300000000000000000000", + "isEnabled": true, + "rate": "5635280000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ronin-mainnet": { + "custom": null, + "standard": null + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "19850000000000", + "isEnabled": true, + "rate": "5510360000" + }, + "out": { + "capacity": "17550000000000000000000", + "isEnabled": true, + "rate": "4871880000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-blast-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "30850000000000000000000", + "isEnabled": true, + "rate": "8563960000000000000" + }, + "out": { + "capacity": "28350000000000000000000", + "isEnabled": true, + "rate": "7869960000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "16100000000000000000000", + "isEnabled": true, + "rate": "4469360000000000000" + }, + "out": { + "capacity": "16150000000000000000000", + "isEnabled": true, + "rate": "4483240000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "26750000000000000000000", + "isEnabled": true, + "rate": "7425800000000000000" + }, + "out": { + "capacity": "27100000000000000000000", + "isEnabled": true, + "rate": "7522960000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "30600000000000000000000", + "isEnabled": true, + "rate": "8494560000000000000" + }, + "out": { + "capacity": "25200000000000000000000", + "isEnabled": true, + "rate": "6995520000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-scroll-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "28600000000000000000000", + "isEnabled": true, + "rate": "7939360000000000000" + }, + "out": { + "capacity": "25950000000000000000000", + "isEnabled": true, + "rate": "7203720000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "19800000000000000000000", + "isEnabled": true, + "rate": "5496480000000000000" + }, + "out": { + "capacity": "24400000000000000000000", + "isEnabled": true, + "rate": "6773440000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "jovay-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "0g-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ab-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "1710000000000", + "isEnabled": true, + "rate": "474696000" + }, + "out": { + "capacity": "22100000000000000000000", + "isEnabled": true, + "rate": "6134960000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "celo-mainnet": { + "custom": { + "in": { + "capacity": "19600000000000000000000", + "isEnabled": true, + "rate": "5440960000000000000" + }, + "out": { + "capacity": "26250000000000000000000", + "isEnabled": true, + "rate": "7287000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-andromeda-1": { + "custom": { + "in": { + "capacity": "17050000000000000000000", + "isEnabled": true, + "rate": "4733080000000000000" + }, + "out": { + "capacity": "29900000000000000000000", + "isEnabled": true, + "rate": "8300240000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "33650000000000000000000", + "isEnabled": true, + "rate": "9341240000000000000" + }, + "out": { + "capacity": "24250000000000000000000", + "isEnabled": true, + "rate": "6731800000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "23700000000000000000000", + "isEnabled": true, + "rate": "6579120000000000000" + }, + "out": { + "capacity": "32350000000000000000000", + "isEnabled": true, + "rate": "8980360000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "16950000000000000000000", + "isEnabled": true, + "rate": "4705320000000000000" + }, + "out": { + "capacity": "22950000000000000000000", + "isEnabled": true, + "rate": "6370920000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-scroll-1": { + "custom": { + "in": { + "capacity": "25500000000000000000000", + "isEnabled": true, + "rate": "7078800000000000000" + }, + "out": { + "capacity": "28350000000000000000000", + "isEnabled": true, + "rate": "7869960000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "20150000000000000000000", + "isEnabled": true, + "rate": "5593640000000000000" + }, + "out": { + "capacity": "20500000000000000000000", + "isEnabled": true, + "rate": "5690800000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "jovay-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "morph-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polkadot-mainnet-astar": { + "custom": { + "in": { + "capacity": "31900000000000000000000", + "isEnabled": true, + "rate": "2953940000000000000" + }, + "out": { + "capacity": "28450000000000000000000", + "isEnabled": true, + "rate": "2634470000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "22800000000000000000000", + "isEnabled": true, + "rate": "2111280000000000000" + }, + "out": { + "capacity": "25550000000000000000000", + "isEnabled": true, + "rate": "2365930000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "17550000000000", + "isEnabled": true, + "rate": "4871880000" + }, + "out": { + "capacity": "21750000000000000000000", + "isEnabled": true, + "rate": "6037800000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "31350000000000000000000", + "isEnabled": true, + "rate": "2903010000000000000" + }, + "out": { + "capacity": "30600000000000000000000", + "isEnabled": true, + "rate": "2833560000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "16250000000000000000000", + "isEnabled": true, + "rate": "1504750000000000000" + }, + "out": { + "capacity": "27450000000000000000000", + "isEnabled": true, + "rate": "2541870000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "stable-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "tac-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "19200000000000000000000", + "isEnabled": true, + "rate": "1777920000000000000" + }, + "out": { + "capacity": "33900000000000000000000", + "isEnabled": true, + "rate": "3139140000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "xdc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "morph-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polkadot-mainnet-astar": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "21200000000000000000000", + "isEnabled": true, + "rate": "1963120000000000000" + }, + "out": { + "capacity": "26600000000000000000000", + "isEnabled": true, + "rate": "2463160000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "23850000000000000000000", + "isEnabled": true, + "rate": "2208510000000000000" + }, + "out": { + "capacity": "18600000000000000000000", + "isEnabled": true, + "rate": "1722360000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "28450000000000000000000", + "isEnabled": true, + "rate": "2634470000000000000" + }, + "out": { + "capacity": "27350000000000000000000", + "isEnabled": true, + "rate": "2532610000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "33250000000000000000000", + "isEnabled": true, + "rate": "3078950000000000000" + }, + "out": { + "capacity": "23750000000000000000000", + "isEnabled": true, + "rate": "2199250000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "21100000000000", + "isEnabled": true, + "rate": "5857360000" + }, + "out": { + "capacity": "20750000000000", + "isEnabled": true, + "rate": "5760200000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + }, + "out": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "25300000000000", + "isEnabled": true, + "rate": "7023280000" + }, + "out": { + "capacity": "30700000000000", + "isEnabled": true, + "rate": "8522320000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + }, + "out": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "18300000000000", + "isEnabled": true, + "rate": "5080080000" + }, + "out": { + "capacity": "26100000000000", + "isEnabled": true, + "rate": "7245360000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + }, + "out": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "28800000000000000000000", + "isEnabled": true, + "rate": "2666880000000000000" + }, + "out": { + "capacity": "18050000000000000000000", + "isEnabled": true, + "rate": "1671430000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "polkadot-mainnet-astar": { + "custom": { + "in": { + "capacity": "18250000000000000000000", + "isEnabled": true, + "rate": "1689950000000000000" + }, + "out": { + "capacity": "19350000000000000000000", + "isEnabled": true, + "rate": "1791810000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "2045000000000", + "isEnabled": true, + "rate": "567692000" + }, + "out": { + "capacity": "21000000000000000000000", + "isEnabled": true, + "rate": "5829600000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "22300000000000000000000", + "isEnabled": true, + "rate": "2064980000000000000" + }, + "out": { + "capacity": "16200000000000000000000", + "isEnabled": true, + "rate": "1500120000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "19650000000000", + "isEnabled": true, + "rate": "5454840000" + }, + "out": { + "capacity": "17400000000000000000000", + "isEnabled": true, + "rate": "4830240000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000", + "isEnabled": true, + "rate": "13880000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "13880000000000000000" + } + } + } + } + }, + "stable-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "tac-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "32900000000000000000000", + "isEnabled": true, + "rate": "3046540000000000000" + }, + "out": { + "capacity": "29200000000000000000000", + "isEnabled": true, + "rate": "2703920000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "4630000000000000000" + } + } + } + } + }, + "xdc-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LsETH": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LUA": { + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LUAUSD": { + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LUISA": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "LYP": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "15100000000000000000000", + "isEnabled": true, + "rate": "25166666666656600000" + }, + "out": { + "capacity": "19000000000000000000000", + "isEnabled": true, + "rate": "31666666666654000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "83333333333300000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "83333333333300000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "19450000000000000000000", + "isEnabled": true, + "rate": "32416666666653700000" + }, + "out": { + "capacity": "20450000000000000000000", + "isEnabled": true, + "rate": "34083333333319700000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "83333333333300000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "83333333333300000000" + } + } + } + } + } + }, + "mBTC": { + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "194000000", + "isEnabled": true, + "rate": "8981" + }, + "out": { + "capacity": "164800000", + "isEnabled": true, + "rate": "7629" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "170000000", + "isEnabled": true, + "rate": "7870" + }, + "out": { + "capacity": "213200000", + "isEnabled": true, + "rate": "9870" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "250400000", + "isEnabled": true, + "rate": "11592" + }, + "out": { + "capacity": "235200000", + "isEnabled": true, + "rate": "10888" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "222000000", + "isEnabled": true, + "rate": "10277" + }, + "out": { + "capacity": "122000000", + "isEnabled": true, + "rate": "5647" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "161600000", + "isEnabled": true, + "rate": "7481" + }, + "out": { + "capacity": "195200000", + "isEnabled": true, + "rate": "9036" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "132800000", + "isEnabled": true, + "rate": "6147" + }, + "out": { + "capacity": "228400000", + "isEnabled": true, + "rate": "10573" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + } + } + }, + "ethereum-mainnet-zircuit-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "246000000", + "isEnabled": true, + "rate": "11388" + }, + "out": { + "capacity": "267600000", + "isEnabled": true, + "rate": "12388" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "208400000", + "isEnabled": true, + "rate": "9647" + }, + "out": { + "capacity": "234800000", + "isEnabled": true, + "rate": "10870" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "132800000", + "isEnabled": true, + "rate": "6147" + }, + "out": { + "capacity": "266000000", + "isEnabled": true, + "rate": "12314" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "157600000", + "isEnabled": true, + "rate": "7296" + }, + "out": { + "capacity": "135600000", + "isEnabled": true, + "rate": "6277" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "244800000", + "isEnabled": true, + "rate": "11333" + }, + "out": { + "capacity": "263200000", + "isEnabled": true, + "rate": "12184" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "136400000", + "isEnabled": true, + "rate": "6314" + }, + "out": { + "capacity": "214400000", + "isEnabled": true, + "rate": "9925" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "154800000", + "isEnabled": true, + "rate": "7166" + }, + "out": { + "capacity": "155200000", + "isEnabled": true, + "rate": "7184" + } + }, + "standard": { + "in": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + }, + "out": { + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" + } + } + } + } + } + }, + "mDLP": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "280800000000000000000000", + "isEnabled": true, + "rate": "3246750000000000000" + }, + "out": { + "capacity": "187616000000000000000000", + "isEnabled": true, + "rate": "2169310000000000000" + } + }, + "standard": { + "in": { + "capacity": "416000000000000000000000", + "isEnabled": true, + "rate": "4810000000000000000" + }, + "out": { + "capacity": "416000000000000000000000", + "isEnabled": true, + "rate": "4810000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "279968000000000000000000", + "isEnabled": true, + "rate": "3237130000000000000" + }, + "out": { + "capacity": "173472000000000000000000", + "isEnabled": true, + "rate": "2005770000000000000" + } + }, + "standard": { + "in": { + "capacity": "416000000000000000000000", + "isEnabled": true, + "rate": "4810000000000000000" + }, + "out": { + "capacity": "416000000000000000000000", + "isEnabled": true, + "rate": "4810000000000000000" + } + } + } + } + } + }, + "MEEM": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "6120000000000000000000", + "isEnabled": true, + "rate": "1701360000000000000" + }, + "out": { + "capacity": "4140000000000000000000", + "isEnabled": true, + "rate": "1150920000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "2780000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "2780000000000000000" + } + } + } + } + } + }, + "Memento": { + "avalanche-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "300000000000000000000", + "isEnabled": true, + "rate": "3472200000000000" + }, + "out": { + "capacity": "356000000000000000000", + "isEnabled": true, + "rate": "4120344000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "433400000000000000000", + "isEnabled": true, + "rate": "5016203514000000" + }, + "out": { + "capacity": "452000000000000000000", + "isEnabled": true, + "rate": "5231448000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "729300000000000000000", + "isEnabled": true, + "rate": "8440971903000000" + }, + "out": { + "capacity": "344000000000000000000", + "isEnabled": true, + "rate": "3981456000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "742500000000000000000", + "isEnabled": true, + "rate": "8593749675000000" + }, + "out": { + "capacity": "478000000000000000000", + "isEnabled": true, + "rate": "5532372000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "33275000000000000000000", + "isEnabled": true, + "rate": "385127314770000000" + }, + "out": { + "capacity": "18950000000000000000000", + "isEnabled": true, + "rate": "219328703816000000" + } + }, + "standard": { + "in": { + "capacity": "55000000000000000000000", + "isEnabled": true, + "rate": "636574074000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "578703704000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "701800000000000000000", + "isEnabled": true, + "rate": "8122684878000000" + }, + "out": { + "capacity": "674000000000000000000", + "isEnabled": true, + "rate": "7800876000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "437800000000000000000", + "isEnabled": true, + "rate": "5067129438000000" + }, + "out": { + "capacity": "659000000000000000000", + "isEnabled": true, + "rate": "7627266000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "19635000000000000000000", + "isEnabled": true, + "rate": "227256944418000000" + }, + "out": { + "capacity": "20650000000000000000000", + "isEnabled": true, + "rate": "239004629752000000" + } + }, + "standard": { + "in": { + "capacity": "55000000000000000000000", + "isEnabled": true, + "rate": "636574074000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "578703704000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "672100000000000000000", + "isEnabled": true, + "rate": "7778934891000000" + }, + "out": { + "capacity": "572000000000000000000", + "isEnabled": true, + "rate": "6620328000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "730400000000000000000", + "isEnabled": true, + "rate": "8453703384000000" + }, + "out": { + "capacity": "483000000000000000000", + "isEnabled": true, + "rate": "5590242000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "695200000000000000000", + "isEnabled": true, + "rate": "8046295992000000" + }, + "out": { + "capacity": "415000000000000000000", + "isEnabled": true, + "rate": "4803210000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "499400000000000000000", + "isEnabled": true, + "rate": "5780092374000000" + }, + "out": { + "capacity": "615000000000000000000", + "isEnabled": true, + "rate": "7118010000000000" + } + }, + "standard": { + "in": { + "capacity": "1100000000000000000000", + "isEnabled": true, + "rate": "12731481000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574000000000000" + } + } + } + } + } + }, + "METO": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "46307692354000000000000000", + "isEnabled": true, + "rate": "12863247040000000000000" + }, + "out": { + "capacity": "31000000031000000000000000", + "isEnabled": true, + "rate": "8611110560000000000000" + } + }, + "standard": { + "in": { + "capacity": "76923077000000000000000000", + "isEnabled": true, + "rate": "21367520000000000000000" + }, + "out": { + "capacity": "76923077000000000000000000", + "isEnabled": true, + "rate": "21367520000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "38692307731000000000000000", + "isEnabled": true, + "rate": "10747862560000000000000" + }, + "out": { + "capacity": "35846153882000000000000000", + "isEnabled": true, + "rate": "9957264320000000000000" + } + }, + "standard": { + "in": { + "capacity": "76923077000000000000000000", + "isEnabled": true, + "rate": "21367520000000000000000" + }, + "out": { + "capacity": "76923077000000000000000000", + "isEnabled": true, + "rate": "21367520000000000000000" + } + } + } + } + } + }, + "MEW": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1610000000000", + "isEnabled": true, + "rate": "447222221" + }, + "out": { + "capacity": "2315000000000", + "isEnabled": true, + "rate": "643055555" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1980000000000", + "isEnabled": true, + "rate": "549999999" + }, + "out": { + "capacity": "2670000000000", + "isEnabled": true, + "rate": "741666666" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "2220000000000", + "isEnabled": true, + "rate": "616666666" + }, + "out": { + "capacity": "3005000000000", + "isEnabled": true, + "rate": "834722221" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "2045000000000", + "isEnabled": true, + "rate": "568055555" + }, + "out": { + "capacity": "2415000000000", + "isEnabled": true, + "rate": "670833332" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3030000000000", + "isEnabled": true, + "rate": "841666666" + }, + "out": { + "capacity": "3415000000000", + "isEnabled": true, + "rate": "948611110" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3310000000000", + "isEnabled": true, + "rate": "919444443" + }, + "out": { + "capacity": "3270000000000", + "isEnabled": true, + "rate": "908333332" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1980000000000", + "isEnabled": true, + "rate": "549999999" + }, + "out": { + "capacity": "2895000000000", + "isEnabled": true, + "rate": "804166666" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "3460000000000", + "isEnabled": true, + "rate": "961111110" + }, + "out": { + "capacity": "3345000000000", + "isEnabled": true, + "rate": "929166666" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "1388888888" + } + } + } + } + } + }, + "MICHI": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "5450000000000", + "isEnabled": true, + "rate": "42903609" + }, + "out": { + "capacity": "5870000000000", + "isEnabled": true, + "rate": "46209943" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "78722220" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "78722220" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3680000000000", + "isEnabled": true, + "rate": "28969776" + }, + "out": { + "capacity": "4350000000000", + "isEnabled": true, + "rate": "34244165" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "78722220" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "78722220" + } + } + } + } + } + }, + "MILO": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "2430000000000000000000000", + "isEnabled": true, + "rate": "56249640000000000000" + }, + "out": { + "capacity": "3360000000000000000000000", + "isEnabled": true, + "rate": "77777280000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "115740000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "115740000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1560000000000000000000000", + "isEnabled": true, + "rate": "36110880000000000000" + }, + "out": { + "capacity": "2105000000000000000000000", + "isEnabled": true, + "rate": "48726540000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "115740000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "115740000000000000000" + } + } + } + } + } + }, + "mmETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "41300000000000000000", + "isEnabled": true, + "rate": "3824380000000000" + }, + "out": { + "capacity": "36600000000000000000", + "isEnabled": true, + "rate": "3389160000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "51800000000000000000", + "isEnabled": true, + "rate": "4796680000000000" + }, + "out": { + "capacity": "62000000000000000000", + "isEnabled": true, + "rate": "5741200000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + } + }, + "mstETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "62800000000000000000", + "isEnabled": true, + "rate": "5815280000000000" + }, + "out": { + "capacity": "30600000000000000000", + "isEnabled": true, + "rate": "2833560000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "69400000000000000000", + "isEnabled": true, + "rate": "6426440000000000" + }, + "out": { + "capacity": "40800000000000000000", + "isEnabled": true, + "rate": "3778080000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "54500000000000000000", + "isEnabled": true, + "rate": "5046700000000000" + }, + "out": { + "capacity": "64000000000000000000", + "isEnabled": true, + "rate": "5926400000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "42800000000000000000", + "isEnabled": true, + "rate": "3963280000000000" + }, + "out": { + "capacity": "57500000000000000000", + "isEnabled": true, + "rate": "5324500000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + } + }, + "mswETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "30700000000000000000", + "isEnabled": true, + "rate": "2842820000000000" + }, + "out": { + "capacity": "68700000000000000000", + "isEnabled": true, + "rate": "6361620000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "52800000000000000000", + "isEnabled": true, + "rate": "4889280000000000" + }, + "out": { + "capacity": "52000000000000000000", + "isEnabled": true, + "rate": "4815200000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "9260000000000000" + } + } + } + } + } + }, + "MVI": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "774367000000000000000", + "isEnabled": true, + "rate": "55760000000000000" + }, + "out": { + "capacity": "402182000000000000000", + "isEnabled": true, + "rate": "28960000000000000" + } + }, + "standard": { + "in": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + }, + "out": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "2203113000000000000000", + "isEnabled": true, + "rate": "152030000000000000" + }, + "out": { + "capacity": "1506516000000000000000", + "isEnabled": true, + "rate": "103960000000000000" + } + }, + "standard": { + "in": { + "capacity": "3333000000000000000000", + "isEnabled": true, + "rate": "230000000000000000" + }, + "out": { + "capacity": "3333000000000000000000", + "isEnabled": true, + "rate": "230000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "482174000000000000000", + "isEnabled": true, + "rate": "34720000000000000" + }, + "out": { + "capacity": "595496000000000000000", + "isEnabled": true, + "rate": "42880000000000000" + } + }, + "standard": { + "in": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + }, + "out": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "564388000000000000000", + "isEnabled": true, + "rate": "40640000000000000" + }, + "out": { + "capacity": "539946000000000000000", + "isEnabled": true, + "rate": "38880000000000000" + } + }, + "standard": { + "in": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + }, + "out": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1739826000000000000000", + "isEnabled": true, + "rate": "120060000000000000" + }, + "out": { + "capacity": "1566510000000000000000", + "isEnabled": true, + "rate": "108100000000000000" + } + }, + "standard": { + "in": { + "capacity": "3333000000000000000000", + "isEnabled": true, + "rate": "230000000000000000" + }, + "out": { + "capacity": "3333000000000000000000", + "isEnabled": true, + "rate": "230000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "586608000000000000000", + "isEnabled": true, + "rate": "42240000000000000" + }, + "out": { + "capacity": "553278000000000000000", + "isEnabled": true, + "rate": "39840000000000000" + } + }, + "standard": { + "in": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + }, + "out": { + "capacity": "1111000000000000000000", + "isEnabled": true, + "rate": "80000000000000000" + } + } + } + } + } + }, + "mwBETH": { + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "336500000000000000000", + "isEnabled": true, + "rate": "30958000000000000" + }, + "out": { + "capacity": "262000000000000000000", + "isEnabled": true, + "rate": "24104000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000", + "isEnabled": true, + "rate": "46000000000000000" + }, + "out": { + "capacity": "500000000000000000000", + "isEnabled": true, + "rate": "46000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "329500000000000000000", + "isEnabled": true, + "rate": "30314000000000000" + }, + "out": { + "capacity": "211500000000000000000", + "isEnabled": true, + "rate": "19458000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000", + "isEnabled": true, + "rate": "46000000000000000" + }, + "out": { + "capacity": "500000000000000000000", + "isEnabled": true, + "rate": "46000000000000000" + } + } + } + } + } + }, + "MYST": { + "avalanche-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "NEIRO": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "NEKO": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "NPC": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "NUON": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "45700000000000000000000", + "isEnabled": true, + "rate": "25386350000000000000" + }, + "out": { + "capacity": "55300000000000000000000", + "isEnabled": true, + "rate": "30719150000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "44600000000000000000000", + "isEnabled": true, + "rate": "24775300000000000000" + }, + "out": { + "capacity": "42700000000000000000000", + "isEnabled": true, + "rate": "23719850000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "51000000000000000000000", + "isEnabled": true, + "rate": "28330500000000000000" + }, + "out": { + "capacity": "34800000000000000000000", + "isEnabled": true, + "rate": "19331400000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "55400000000000000000000", + "isEnabled": true, + "rate": "30774700000000000000" + }, + "out": { + "capacity": "58900000000000000000000", + "isEnabled": true, + "rate": "32718950000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "62000000000000000000000", + "isEnabled": true, + "rate": "34441000000000000000" + }, + "out": { + "capacity": "48300000000000000000000", + "isEnabled": true, + "rate": "26830650000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "54500000000000000000000", + "isEnabled": true, + "rate": "30274750000000000000" + }, + "out": { + "capacity": "45700000000000000000000", + "isEnabled": true, + "rate": "25386350000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + } + }, + "NXPC": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "OHM": { + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "ORNG": { + "avalanche-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "OSIS": { + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "11250225000000000000000", + "isEnabled": true, + "rate": "3105000000000000000" + }, + "out": { + "capacity": "5266772000000000000000", + "isEnabled": true, + "rate": "1453600000000000000" + } + }, + "standard": { + "in": { + "capacity": "16667000000000000000000", + "isEnabled": true, + "rate": "4600000000000000000" + }, + "out": { + "capacity": "16667000000000000000000", + "isEnabled": true, + "rate": "4600000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "7616819000000000000000", + "isEnabled": true, + "rate": "2102200000000000000" + }, + "out": { + "capacity": "7516817000000000000000", + "isEnabled": true, + "rate": "2074600000000000000" + } + }, + "standard": { + "in": { + "capacity": "16667000000000000000000", + "isEnabled": true, + "rate": "4600000000000000000" + }, + "out": { + "capacity": "16667000000000000000000", + "isEnabled": true, + "rate": "4600000000000000000" + } + } + } + } + } + }, + "OVER": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "oXAUT": { + "avalanche-mainnet": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "6730000000000", + "isEnabled": true, + "rate": "3365000000" + }, + "out": { + "capacity": "6670000000000", + "isEnabled": true, + "rate": "3335000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "ethereum-mainnet-worldchain-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "6040000000000", + "isEnabled": true, + "rate": "3020000000" + }, + "out": { + "capacity": "3660000000000", + "isEnabled": true, + "rate": "1830000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "4170000000000", + "isEnabled": true, + "rate": "2085000000" + }, + "out": { + "capacity": "5240000000000", + "isEnabled": true, + "rate": "2620000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "5400000000000", + "isEnabled": true, + "rate": "2700000000" + }, + "out": { + "capacity": "4830000000000", + "isEnabled": true, + "rate": "2415000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-worldchain-1": { + "custom": { + "in": { + "capacity": "3950000000000", + "isEnabled": true, + "rate": "1975000000" + }, + "out": { + "capacity": "4760000000000", + "isEnabled": true, + "rate": "2380000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + } + }, + "PEPE": { + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "28300000000000000000", + "isEnabled": true, + "rate": "7861111111111111" + }, + "out": { + "capacity": "26800000000000000000000000000", + "isEnabled": true, + "rate": "7444444444444445040000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000", + "isEnabled": true, + "rate": "13888888888888890" + }, + "out": { + "capacity": "50000000000000000000000000000", + "isEnabled": true, + "rate": "13888888888888890000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "320000000000000", + "isEnabled": true, + "rate": "88888888888" + }, + "out": { + "capacity": "316500000000000", + "isEnabled": true, + "rate": "87916666666" + } + }, + "standard": { + "in": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "138888888889" + }, + "out": { + "capacity": "500000000000000", + "isEnabled": true, + "rate": "138888888889" + } + } + } + } + } + }, + "PFVS": { + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "pippin": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "PIXEL": { + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "139200000000000000000000000", + "isEnabled": true, + "rate": "1611111100800000000000" + }, + "out": { + "capacity": "103140000000000000000000000", + "isEnabled": true, + "rate": "1193750000000000000000" + } + }, + "standard": { + "in": { + "capacity": "300000000000000000000000000", + "isEnabled": true, + "rate": "3472222200000000000000" + }, + "out": { + "capacity": "270000000000000000000000000", + "isEnabled": true, + "rate": "3125000000000000000000" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "203700000000000000000000000", + "isEnabled": true, + "rate": "2357638873800000000000" + }, + "out": { + "capacity": "99900000000000000000000000", + "isEnabled": true, + "rate": "1156250000000000000000" + } + }, + "standard": { + "in": { + "capacity": "300000000000000000000000000", + "isEnabled": true, + "rate": "3472222200000000000000" + }, + "out": { + "capacity": "270000000000000000000000000", + "isEnabled": true, + "rate": "3125000000000000000000" + } + } + } + } + } + }, + "PTsUSDE": { + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "pufETH": { + "berachain-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "RDP": { + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "23600000000000000000000", + "isEnabled": true, + "rate": "273760000000000000" + }, + "out": { + "capacity": "22900000000000000000000", + "isEnabled": true, + "rate": "265640000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "580000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "580000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "24050000000000000000000", + "isEnabled": true, + "rate": "278980000000000000" + }, + "out": { + "capacity": "16350000000000000000000", + "isEnabled": true, + "rate": "189660000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "580000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "580000000000000000" + } + } + } + } + } + }, + "REG": { + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "25650000000000000000000", + "isEnabled": true, + "rate": "7182000000000000000" + }, + "out": { + "capacity": "20300000000000000000000", + "isEnabled": true, + "rate": "5684000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "18450000000000000000000", + "isEnabled": true, + "rate": "5166000000000000000" + }, + "out": { + "capacity": "22450000000000000000000", + "isEnabled": true, + "rate": "6286000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "20650000000000000000000", + "isEnabled": true, + "rate": "5782000000000000000" + }, + "out": { + "capacity": "31050000000000000000000", + "isEnabled": true, + "rate": "8694000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "21050000000000000000000", + "isEnabled": true, + "rate": "5894000000000000000" + }, + "out": { + "capacity": "27850000000000000000000", + "isEnabled": true, + "rate": "7798000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + } + } + } + } + }, + "xdai-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "21050000000000000000000", + "isEnabled": true, + "rate": "5894000000000000000" + }, + "out": { + "capacity": "24850000000000000000000", + "isEnabled": true, + "rate": "6958000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "31450000000000000000000", + "isEnabled": true, + "rate": "8806000000000000000" + }, + "out": { + "capacity": "31250000000000000000000", + "isEnabled": true, + "rate": "8750000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "14000000000000000000" + } + } + } + } + } + }, + "RETH": { + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "909000000000000000000", + "isEnabled": true, + "rate": "2922435000000000" + }, + "out": { + "capacity": "765000000000000000000", + "isEnabled": true, + "rate": "2459475000000000" + } + }, + "standard": { + "in": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + }, + "out": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + } + } + }, + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "720000000000000000000", + "isEnabled": true, + "rate": "2314800000000000" + }, + "out": { + "capacity": "1209600000000000000000", + "isEnabled": true, + "rate": "3888864000000000" + } + }, + "standard": { + "in": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + }, + "out": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + } + } + }, + "tac-mainnet": { + "custom": null, + "standard": null + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "925200000000000000000", + "isEnabled": true, + "rate": "2974518000000000" + }, + "out": { + "capacity": "864000000000000000000", + "isEnabled": true, + "rate": "2777760000000000" + } + }, + "standard": { + "in": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + }, + "out": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "833400000000000000000", + "isEnabled": true, + "rate": "2679381000000000" + }, + "out": { + "capacity": "709200000000000000000", + "isEnabled": true, + "rate": "2280078000000000" + } + }, + "standard": { + "in": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + }, + "out": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + } + } + } + } + }, + "tac-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1117800000000000000000", + "isEnabled": true, + "rate": "3593727000000000" + }, + "out": { + "capacity": "1206000000000000000000", + "isEnabled": true, + "rate": "3877290000000000" + } + }, + "standard": { + "in": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + }, + "out": { + "capacity": "1800000000000000000000", + "isEnabled": true, + "rate": "5787000000000000" + } + } + } + } + } + }, + "RIZE": { + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "rsETH": { + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zircuit-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SAS": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "savBTC": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "savETH": { + "avalanche-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "savUSD": { + "avalanche-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polygon-mainnet-katana": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polygon-mainnet-katana": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SD": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "204288000000000000000000", + "isEnabled": true, + "rate": "2364208000000000000" + }, + "out": { + "capacity": "181248000000000000000000", + "isEnabled": true, + "rate": "2097568000000000000" + } + }, + "standard": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + }, + "out": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "139008000000000000000000", + "isEnabled": true, + "rate": "1608728000000000000" + }, + "out": { + "capacity": "221952000000000000000000", + "isEnabled": true, + "rate": "2568632000000000000" + } + }, + "standard": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + }, + "out": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "135552000000000000000000", + "isEnabled": true, + "rate": "1568732000000000000" + }, + "out": { + "capacity": "121344000000000000000000", + "isEnabled": true, + "rate": "1404304000000000000" + } + }, + "standard": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + }, + "out": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "185856000000000000000000", + "isEnabled": true, + "rate": "2150896000000000000" + }, + "out": { + "capacity": "220032000000000000000000", + "isEnabled": true, + "rate": "2546412000000000000" + } + }, + "standard": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + }, + "out": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "235776000000000000000000", + "isEnabled": true, + "rate": "2728616000000000000" + }, + "out": { + "capacity": "203904000000000000000000", + "isEnabled": true, + "rate": "2359764000000000000" + } + }, + "standard": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + }, + "out": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "268032000000000000000000", + "isEnabled": true, + "rate": "3101912000000000000" + }, + "out": { + "capacity": "248064000000000000000000", + "isEnabled": true, + "rate": "2870824000000000000" + } + }, + "standard": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + }, + "out": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4444000000000000000" + } + } + } + } + } + }, + "sDAI": { + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "135500000000000000000000", + "isEnabled": true, + "rate": "37614800000000000000" + }, + "out": { + "capacity": "133250000000000000000000", + "isEnabled": true, + "rate": "36990200000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "69400000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "69400000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "133000000000000000000000", + "isEnabled": true, + "rate": "36920800000000000000" + }, + "out": { + "capacity": "82500000000000000000000", + "isEnabled": true, + "rate": "22902000000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "69400000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "69400000000000000000" + } + } + } + } + } + }, + "SDL": { + "ethereum-mainnet-andromeda-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "302250000000000000000000", + "isEnabled": true, + "rate": "83622500000000000000" + }, + "out": { + "capacity": "436500000000000000000000", + "isEnabled": true, + "rate": "120765000000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-andromeda-1": { + "custom": { + "in": { + "capacity": "311250000000000000000000", + "isEnabled": true, + "rate": "86112500000000000000" + }, + "out": { + "capacity": "444750000000000000000000", + "isEnabled": true, + "rate": "123047500000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "331500000000000000000000", + "isEnabled": true, + "rate": "91715000000000000000" + }, + "out": { + "capacity": "261750000000000000000000", + "isEnabled": true, + "rate": "72417500000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-andromeda-1": { + "custom": { + "in": { + "capacity": "353250000000000000000000", + "isEnabled": true, + "rate": "97732500000000000000" + }, + "out": { + "capacity": "327750000000000000000000", + "isEnabled": true, + "rate": "90677500000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "378750000000000000000000", + "isEnabled": true, + "rate": "104787500000000000000" + }, + "out": { + "capacity": "240750000000000000000000", + "isEnabled": true, + "rate": "66607500000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "207500000000000000000" + } + } + } + } + } + }, + "SDM": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": null, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + } + } + } + }, + "sDOLA": { + "berachain-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SDT": { + "bsc-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "345500000000000000000000", + "isEnabled": true, + "rate": "95966080000000000000" + }, + "out": { + "capacity": "245000000000000000000000", + "isEnabled": true, + "rate": "68051200000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "174500000000000000000000", + "isEnabled": true, + "rate": "48469120000000000000" + }, + "out": { + "capacity": "342500000000000000000000", + "isEnabled": true, + "rate": "95132800000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "326500000000000000000000", + "isEnabled": true, + "rate": "90688640000000000000" + }, + "out": { + "capacity": "292000000000000000000000", + "isEnabled": true, + "rate": "81105920000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "314500000000000000000000", + "isEnabled": true, + "rate": "87355520000000000000" + }, + "out": { + "capacity": "222000000000000000000000", + "isEnabled": true, + "rate": "61662720000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "246000000000000000000000", + "isEnabled": true, + "rate": "68328960000000000000" + }, + "out": { + "capacity": "287500000000000000000000", + "isEnabled": true, + "rate": "79856000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + }, + "out": { + "capacity": "500000000000000000000000", + "isEnabled": true, + "rate": "138880000000000000000" + } + } + } + } + } + }, + "SDY": { + "avalanche-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1680000000000000000000000", + "isEnabled": true, + "rate": "19488000000000000000" + }, + "out": { + "capacity": "2880000000000000000000000", + "isEnabled": true, + "rate": "33408000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3240000000000000000000000", + "isEnabled": true, + "rate": "37584000000000000000" + }, + "out": { + "capacity": "2095000000000000000000000", + "isEnabled": true, + "rate": "24302000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3040000000000000000000000", + "isEnabled": true, + "rate": "35264000000000000000" + }, + "out": { + "capacity": "1780000000000000000000000", + "isEnabled": true, + "rate": "20648000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "3420000000000000000000000", + "isEnabled": true, + "rate": "39672000000000000000" + }, + "out": { + "capacity": "3270000000000000000000000", + "isEnabled": true, + "rate": "37932000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "2640000000000000000000000", + "isEnabled": true, + "rate": "30624000000000000000" + }, + "out": { + "capacity": "3215000000000000000000000", + "isEnabled": true, + "rate": "37294000000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "58000000000000000000" + } + } + } + } + } + }, + "SHIB": { + "avalanche-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "celo-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-andromeda-1": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-blast-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-scroll-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zircuit-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "celo-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-andromeda-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-scroll-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zircuit-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polkadot-mainnet-astar": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "xdai-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polkadot-mainnet-astar": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "xdai-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SHIPA": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": null, + "remote": { + "shibarium-mainnet": { + "custom": null, + "standard": null + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SHIRO": { + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SILO": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "sINV": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "6230000000000000000000", + "isEnabled": true, + "rate": "68530000000000000" + }, + "out": { + "capacity": "6970000000000000000000", + "isEnabled": true, + "rate": "76670000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "4090000000000000000000", + "isEnabled": true, + "rate": "44990000000000000" + }, + "out": { + "capacity": "5190000000000000000000", + "isEnabled": true, + "rate": "57090000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "6020000000000000000000", + "isEnabled": true, + "rate": "66220000000000000" + }, + "out": { + "capacity": "5920000000000000000000", + "isEnabled": true, + "rate": "65120000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "5780000000000000000000", + "isEnabled": true, + "rate": "63580000000000000" + }, + "out": { + "capacity": "5340000000000000000000", + "isEnabled": true, + "rate": "58740000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "6800000000000000000000", + "isEnabled": true, + "rate": "74800000000000000" + }, + "out": { + "capacity": "3700000000000000000000", + "isEnabled": true, + "rate": "40700000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3170000000000000000000", + "isEnabled": true, + "rate": "34870000000000000" + }, + "out": { + "capacity": "6150000000000000000000", + "isEnabled": true, + "rate": "67650000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "5490000000000000000000", + "isEnabled": true, + "rate": "60390000000000000" + }, + "out": { + "capacity": "5850000000000000000000", + "isEnabled": true, + "rate": "64350000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "3670000000000000000000", + "isEnabled": true, + "rate": "40370000000000000" + }, + "out": { + "capacity": "6250000000000000000000", + "isEnabled": true, + "rate": "68750000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "4580000000000000000000", + "isEnabled": true, + "rate": "50380000000000000" + }, + "out": { + "capacity": "4720000000000000000000", + "isEnabled": true, + "rate": "51920000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + }, + "out": { + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" + } + } + } + } + } + }, + "SKYA": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SNOW": { + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SOIL": { + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "SolvBTC": { + "avalanche-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1085000000000000000", + "isEnabled": true, + "rate": "50231160000000" + }, + "out": { + "capacity": "1522500000000000000", + "isEnabled": true, + "rate": "70485660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1030000000000000000", + "isEnabled": true, + "rate": "47684880000000" + }, + "out": { + "capacity": "1645000000000000000", + "isEnabled": true, + "rate": "76156920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1045000000000000000", + "isEnabled": true, + "rate": "48379320000000" + }, + "out": { + "capacity": "1497500000000000000", + "isEnabled": true, + "rate": "69328260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1500000000000000000", + "isEnabled": true, + "rate": "69444000000000" + }, + "out": { + "capacity": "1662500000000000000", + "isEnabled": true, + "rate": "76967100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1705000000000000000", + "isEnabled": true, + "rate": "78934680000000" + }, + "out": { + "capacity": "1662500000000000000", + "isEnabled": true, + "rate": "76967100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "860000000000000000", + "isEnabled": true, + "rate": "39814560000000" + }, + "out": { + "capacity": "897500000000000000", + "isEnabled": true, + "rate": "41550660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1185000000000000000", + "isEnabled": true, + "rate": "54860760000000" + }, + "out": { + "capacity": "965000000000000000", + "isEnabled": true, + "rate": "44675640000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "837500000000000000", + "isEnabled": true, + "rate": "38772900000000" + }, + "out": { + "capacity": "1055000000000000000", + "isEnabled": true, + "rate": "48842280000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1027500000000000000", + "isEnabled": true, + "rate": "47569140000000" + }, + "out": { + "capacity": "1575000000000000000", + "isEnabled": true, + "rate": "72916200000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "berachain-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1197500000000000000", + "isEnabled": true, + "rate": "55439460000000" + }, + "out": { + "capacity": "1255000000000000000", + "isEnabled": true, + "rate": "58101480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1122500000000000000", + "isEnabled": true, + "rate": "51967260000000" + }, + "out": { + "capacity": "1412500000000000000", + "isEnabled": true, + "rate": "65393100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1225000000000000000", + "isEnabled": true, + "rate": "56712600000000" + }, + "out": { + "capacity": "1372500000000000000", + "isEnabled": true, + "rate": "63541260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1602500000000000000", + "isEnabled": true, + "rate": "74189340000000" + }, + "out": { + "capacity": "1192500000000000000", + "isEnabled": true, + "rate": "55207980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "782500000000000000", + "isEnabled": true, + "rate": "36226620000000" + }, + "out": { + "capacity": "1567500000000000000", + "isEnabled": true, + "rate": "72568980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1167500000000000000", + "isEnabled": true, + "rate": "54050580000000" + }, + "out": { + "capacity": "847500000000000000", + "isEnabled": true, + "rate": "39235860000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1585000000000000000", + "isEnabled": true, + "rate": "73379160000000" + }, + "out": { + "capacity": "885000000000000000", + "isEnabled": true, + "rate": "40971960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "835000000000000000", + "isEnabled": true, + "rate": "38657160000000" + }, + "out": { + "capacity": "1297500000000000000", + "isEnabled": true, + "rate": "60069060000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1645000000000000000", + "isEnabled": true, + "rate": "76156920000000" + }, + "out": { + "capacity": "1675000000000000000", + "isEnabled": true, + "rate": "77545800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1042500000000000000", + "isEnabled": true, + "rate": "48263580000000" + }, + "out": { + "capacity": "1277500000000000000", + "isEnabled": true, + "rate": "59143140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "817500000000000000", + "isEnabled": true, + "rate": "37846980000000" + }, + "out": { + "capacity": "1067500000000000000", + "isEnabled": true, + "rate": "49420980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1142500000000000000", + "isEnabled": true, + "rate": "52893180000000" + }, + "out": { + "capacity": "997500000000000000", + "isEnabled": true, + "rate": "46180260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "927500000000000000", + "isEnabled": true, + "rate": "42939540000000" + }, + "out": { + "capacity": "1227500000000000000", + "isEnabled": true, + "rate": "56828340000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1255000000000000000", + "isEnabled": true, + "rate": "58101480000000" + }, + "out": { + "capacity": "765000000000000000", + "isEnabled": true, + "rate": "35416440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1255000000000000000", + "isEnabled": true, + "rate": "58101480000000" + }, + "out": { + "capacity": "1140000000000000000", + "isEnabled": true, + "rate": "52777440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1230000000000000000", + "isEnabled": true, + "rate": "56944080000000" + }, + "out": { + "capacity": "1137500000000000000", + "isEnabled": true, + "rate": "52661700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1492500000000000000", + "isEnabled": true, + "rate": "69096780000000" + }, + "out": { + "capacity": "930000000000000000", + "isEnabled": true, + "rate": "43055280000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1735000000000000000", + "isEnabled": true, + "rate": "80323560000000" + }, + "out": { + "capacity": "1460000000000000000", + "isEnabled": true, + "rate": "67592160000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1745000000000000000", + "isEnabled": true, + "rate": "80786520000000" + }, + "out": { + "capacity": "1547500000000000000", + "isEnabled": true, + "rate": "71643060000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1610000000000000000", + "isEnabled": true, + "rate": "74536560000000" + }, + "out": { + "capacity": "762500000000000000", + "isEnabled": true, + "rate": "35300700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1282500000000000000", + "isEnabled": true, + "rate": "59374620000000" + }, + "out": { + "capacity": "1015000000000000000", + "isEnabled": true, + "rate": "46990440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1467500000000000000", + "isEnabled": true, + "rate": "67939380000000" + }, + "out": { + "capacity": "1135000000000000000", + "isEnabled": true, + "rate": "52545960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1435000000000000000", + "isEnabled": true, + "rate": "66434760000000" + }, + "out": { + "capacity": "1347500000000000000", + "isEnabled": true, + "rate": "62383860000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1520000000000000000", + "isEnabled": true, + "rate": "70369920000000" + }, + "out": { + "capacity": "1327500000000000000", + "isEnabled": true, + "rate": "61457940000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": null, + "standard": null + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "875000000000000000", + "isEnabled": true, + "rate": "40509000000000" + }, + "out": { + "capacity": "1392500000000000000", + "isEnabled": true, + "rate": "64467180000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "251250000", + "isEnabled": true, + "rate": "11631" + }, + "out": { + "capacity": "2977500000000000000", + "isEnabled": true, + "rate": "137846340000000" + } + }, + "standard": { + "in": { + "capacity": "750000000", + "isEnabled": true, + "rate": "34722" + }, + "out": { + "capacity": "7500000000000000000", + "isEnabled": true, + "rate": "347220000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1437500000000000000", + "isEnabled": true, + "rate": "66550500000000" + }, + "out": { + "capacity": "840000000000000000", + "isEnabled": true, + "rate": "38888640000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": null, + "standard": null + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1330000000000000000", + "isEnabled": true, + "rate": "61573680000000" + }, + "out": { + "capacity": "1270000000000000000", + "isEnabled": true, + "rate": "58795920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1197500000000000000", + "isEnabled": true, + "rate": "55439460000000" + }, + "out": { + "capacity": "1667500000000000000", + "isEnabled": true, + "rate": "77198580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1382500000000000000", + "isEnabled": true, + "rate": "64004220000000" + }, + "out": { + "capacity": "1570000000000000000", + "isEnabled": true, + "rate": "72684720000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1447500000000000000", + "isEnabled": true, + "rate": "67013460000000" + }, + "out": { + "capacity": "1380000000000000000", + "isEnabled": true, + "rate": "63888480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1217500000000000000", + "isEnabled": true, + "rate": "56365380000000" + }, + "out": { + "capacity": "1287500000000000000", + "isEnabled": true, + "rate": "59606100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "952500000000000000", + "isEnabled": true, + "rate": "44096940000000" + }, + "out": { + "capacity": "1172500000000000000", + "isEnabled": true, + "rate": "54282060000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1035000000000000000", + "isEnabled": true, + "rate": "47916360000000" + }, + "out": { + "capacity": "980000000000000000", + "isEnabled": true, + "rate": "45370080000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1652500000000000000", + "isEnabled": true, + "rate": "76504140000000" + }, + "out": { + "capacity": "1105000000000000000", + "isEnabled": true, + "rate": "51157080000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1565000000000000000", + "isEnabled": true, + "rate": "72453240000000" + }, + "out": { + "capacity": "780000000000000000", + "isEnabled": true, + "rate": "36110880000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1582500000000000000", + "isEnabled": true, + "rate": "73263420000000" + }, + "out": { + "capacity": "980000000000000000", + "isEnabled": true, + "rate": "45370080000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1140000000000000000", + "isEnabled": true, + "rate": "52777440000000" + }, + "out": { + "capacity": "847500000000000000", + "isEnabled": true, + "rate": "39235860000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1675000000000000000", + "isEnabled": true, + "rate": "77545800000000" + }, + "out": { + "capacity": "1602500000000000000", + "isEnabled": true, + "rate": "74189340000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1062500000000000000", + "isEnabled": true, + "rate": "49189500000000" + }, + "out": { + "capacity": "1145000000000000000", + "isEnabled": true, + "rate": "53008920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1090000000000000000", + "isEnabled": true, + "rate": "50462640000000" + }, + "out": { + "capacity": "1430000000000000000", + "isEnabled": true, + "rate": "66203280000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1450000000000000000", + "isEnabled": true, + "rate": "67129200000000" + }, + "out": { + "capacity": "1145000000000000000", + "isEnabled": true, + "rate": "53008920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1730000000000000000", + "isEnabled": true, + "rate": "80092080000000" + }, + "out": { + "capacity": "1547500000000000000", + "isEnabled": true, + "rate": "71643060000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "987500000000000000", + "isEnabled": true, + "rate": "45717300000000" + }, + "out": { + "capacity": "895000000000000000", + "isEnabled": true, + "rate": "41434920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1135000000000000000", + "isEnabled": true, + "rate": "52545960000000" + }, + "out": { + "capacity": "907500000000000000", + "isEnabled": true, + "rate": "42013620000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1560000000000000000", + "isEnabled": true, + "rate": "72221760000000" + }, + "out": { + "capacity": "1277500000000000000", + "isEnabled": true, + "rate": "59143140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1285000000000000000", + "isEnabled": true, + "rate": "59490360000000" + }, + "out": { + "capacity": "1300000000000000000", + "isEnabled": true, + "rate": "60184800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1727500000000000000", + "isEnabled": true, + "rate": "79976340000000" + }, + "out": { + "capacity": "1155000000000000000", + "isEnabled": true, + "rate": "53471880000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1270000000000000000", + "isEnabled": true, + "rate": "58795920000000" + }, + "out": { + "capacity": "1277500000000000000", + "isEnabled": true, + "rate": "59143140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1285000000000000000", + "isEnabled": true, + "rate": "59490360000000" + }, + "out": { + "capacity": "1477500000000000000", + "isEnabled": true, + "rate": "68402340000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1400000000000000000", + "isEnabled": true, + "rate": "64814400000000" + }, + "out": { + "capacity": "850000000000000000", + "isEnabled": true, + "rate": "39351600000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1012500000000000000", + "isEnabled": true, + "rate": "46874700000000" + }, + "out": { + "capacity": "827500000000000000", + "isEnabled": true, + "rate": "38309940000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1077500000000000000", + "isEnabled": true, + "rate": "49883940000000" + }, + "out": { + "capacity": "1432500000000000000", + "isEnabled": true, + "rate": "66319020000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1175000000000000000", + "isEnabled": true, + "rate": "54397800000000" + }, + "out": { + "capacity": "1462500000000000000", + "isEnabled": true, + "rate": "67707900000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "817500000000000000", + "isEnabled": true, + "rate": "37846980000000" + }, + "out": { + "capacity": "817500000000000000", + "isEnabled": true, + "rate": "37846980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1047500000000000000", + "isEnabled": true, + "rate": "48495060000000" + }, + "out": { + "capacity": "942500000000000000", + "isEnabled": true, + "rate": "43633980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "937500000000000000", + "isEnabled": true, + "rate": "43402500000000" + }, + "out": { + "capacity": "1155000000000000000", + "isEnabled": true, + "rate": "53471880000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1202500000000000000", + "isEnabled": true, + "rate": "55670940000000" + }, + "out": { + "capacity": "910000000000000000", + "isEnabled": true, + "rate": "42129360000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1285000000000000000", + "isEnabled": true, + "rate": "59490360000000" + }, + "out": { + "capacity": "1450000000000000000", + "isEnabled": true, + "rate": "67129200000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1160000000000000000", + "isEnabled": true, + "rate": "53703360000000" + }, + "out": { + "capacity": "1527500000000000000", + "isEnabled": true, + "rate": "70717140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-taiko-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "775000000000000000", + "isEnabled": true, + "rate": "35879400000000" + }, + "out": { + "capacity": "1107500000000000000", + "isEnabled": true, + "rate": "51272820000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": 6, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "855000000000000000", + "isEnabled": true, + "rate": "39583080000000" + }, + "out": { + "capacity": "1380000000000000000", + "isEnabled": true, + "rate": "63888480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1382500000000000000", + "isEnabled": true, + "rate": "64004220000000" + }, + "out": { + "capacity": "902500000000000000", + "isEnabled": true, + "rate": "41782140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "95850000000000000000", + "isEnabled": true, + "rate": "1109367900000000" + }, + "out": { + "capacity": "1577500000000000000", + "isEnabled": true, + "rate": "73031940000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1736100000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1242500000000000000", + "isEnabled": true, + "rate": "57522780000000" + }, + "out": { + "capacity": "1140000000000000000", + "isEnabled": true, + "rate": "52777440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1237500000000000000", + "isEnabled": true, + "rate": "57291300000000" + }, + "out": { + "capacity": "997500000000000000", + "isEnabled": true, + "rate": "46180260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1640000000000000000", + "isEnabled": true, + "rate": "75925440000000" + }, + "out": { + "capacity": "777500000000000000", + "isEnabled": true, + "rate": "35995140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "845000000000000000", + "isEnabled": true, + "rate": "39120120000000" + }, + "out": { + "capacity": "1390000000000000000", + "isEnabled": true, + "rate": "64351440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1737500000000000000", + "isEnabled": true, + "rate": "80439300000000" + }, + "out": { + "capacity": "792500000000000000", + "isEnabled": true, + "rate": "36689580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1382500000000000000", + "isEnabled": true, + "rate": "64004220000000" + }, + "out": { + "capacity": "897500000000000000", + "isEnabled": true, + "rate": "41550660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1137500000000000000", + "isEnabled": true, + "rate": "52661700000000" + }, + "out": { + "capacity": "1645000000000000000", + "isEnabled": true, + "rate": "76156920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1470000000000000000", + "isEnabled": true, + "rate": "68055120000000" + }, + "out": { + "capacity": "867500000000000000", + "isEnabled": true, + "rate": "40161780000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1557500000000000000", + "isEnabled": true, + "rate": "72106020000000" + }, + "out": { + "capacity": "1695000000000000000", + "isEnabled": true, + "rate": "78471720000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "752500000000000000", + "isEnabled": true, + "rate": "34837740000000" + }, + "out": { + "capacity": "1117500000000000000", + "isEnabled": true, + "rate": "51735780000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-taiko-1": { + "custom": { + "in": { + "capacity": "1702500000000000000", + "isEnabled": true, + "rate": "78818940000000" + }, + "out": { + "capacity": "1325000000000000000", + "isEnabled": true, + "rate": "61342200000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1040000000000000000", + "isEnabled": true, + "rate": "48147840000000" + }, + "out": { + "capacity": "82950000000000000000", + "isEnabled": true, + "rate": "960008000000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1736000000000000" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1592500000000000000", + "isEnabled": true, + "rate": "73726380000000" + }, + "out": { + "capacity": "810000000000000000", + "isEnabled": true, + "rate": "37499760000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "757500000000000000", + "isEnabled": true, + "rate": "35069220000000" + }, + "out": { + "capacity": "1390000000000000000", + "isEnabled": true, + "rate": "64351440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "3260000000000000000", + "isEnabled": true, + "rate": "37731240000000" + }, + "out": { + "capacity": "13500000000000000000", + "isEnabled": true, + "rate": "156249000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000", + "isEnabled": true, + "rate": "57870000000000" + }, + "out": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "347220000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1565000000000000000", + "isEnabled": true, + "rate": "72453240000000" + }, + "out": { + "capacity": "1740000000000000000", + "isEnabled": true, + "rate": "80555040000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "101000000", + "isEnabled": true, + "rate": "4675" + }, + "out": { + "capacity": "1557500000000000000", + "isEnabled": true, + "rate": "72106020000000" + } + }, + "standard": { + "in": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1350000000000000000", + "isEnabled": true, + "rate": "62499600000000" + }, + "out": { + "capacity": "24120000000000000000", + "isEnabled": true, + "rate": "279164880000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "60000000000000000000", + "isEnabled": true, + "rate": "694440000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "875000000000000000", + "isEnabled": true, + "rate": "40509000000000" + }, + "out": { + "capacity": "930000000000000000", + "isEnabled": true, + "rate": "43055280000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "947500000000000000", + "isEnabled": true, + "rate": "43865460000000" + }, + "out": { + "capacity": "1037500000000000000", + "isEnabled": true, + "rate": "48032100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1455000000000000000", + "isEnabled": true, + "rate": "67360680000000" + }, + "out": { + "capacity": "997500000000000000", + "isEnabled": true, + "rate": "46180260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1692500000000000000", + "isEnabled": true, + "rate": "78355980000000" + }, + "out": { + "capacity": "1597500000000000000", + "isEnabled": true, + "rate": "73957860000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "765000000000000000", + "isEnabled": true, + "rate": "35416440000000" + }, + "out": { + "capacity": "935000000000000000", + "isEnabled": true, + "rate": "43286760000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1632500000000000000", + "isEnabled": true, + "rate": "75578220000000" + }, + "out": { + "capacity": "1592500000000000000", + "isEnabled": true, + "rate": "73726380000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "810000000000000000", + "isEnabled": true, + "rate": "37499760000000" + }, + "out": { + "capacity": "915000000000000000", + "isEnabled": true, + "rate": "42360840000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "830000000000000000", + "isEnabled": true, + "rate": "38425680000000" + }, + "out": { + "capacity": "927500000000000000", + "isEnabled": true, + "rate": "42939540000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1645000000000000000", + "isEnabled": true, + "rate": "76156920000000" + }, + "out": { + "capacity": "982500000000000000", + "isEnabled": true, + "rate": "45485820000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1590000000000000000", + "isEnabled": true, + "rate": "73610640000000" + }, + "out": { + "capacity": "1212500000000000000", + "isEnabled": true, + "rate": "56133900000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "807500000000000000", + "isEnabled": true, + "rate": "37384020000000" + }, + "out": { + "capacity": "1662500000000000000", + "isEnabled": true, + "rate": "76967100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "855000000000000000", + "isEnabled": true, + "rate": "39583080000000" + }, + "out": { + "capacity": "1230000000000000000", + "isEnabled": true, + "rate": "56944080000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "monad-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "19530000000000000000", + "isEnabled": true, + "rate": "226040220000000" + }, + "out": { + "capacity": "2240000000000000000", + "isEnabled": true, + "rate": "25925760000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "347220000000000" + }, + "out": { + "capacity": "5000000000000000000", + "isEnabled": true, + "rate": "57870000000000" + } + } + } + } + }, + "sei-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1277500000000000000", + "isEnabled": true, + "rate": "59143140000000" + }, + "out": { + "capacity": "1317500000000000000", + "isEnabled": true, + "rate": "60994980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1125000000000000000", + "isEnabled": true, + "rate": "52083000000000" + }, + "out": { + "capacity": "1040000000000000000", + "isEnabled": true, + "rate": "48147840000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "912500000000000000", + "isEnabled": true, + "rate": "42245100000000" + }, + "out": { + "capacity": "1135000000000000000", + "isEnabled": true, + "rate": "52545960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "820000000000000000", + "isEnabled": true, + "rate": "37962720000000" + }, + "out": { + "capacity": "1060000000000000000", + "isEnabled": true, + "rate": "49073760000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1377500000000000000", + "isEnabled": true, + "rate": "63772740000000" + }, + "out": { + "capacity": "1097500000000000000", + "isEnabled": true, + "rate": "50809860000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "750000000000000000", + "isEnabled": true, + "rate": "34722000000000" + }, + "out": { + "capacity": "930000000000000000", + "isEnabled": true, + "rate": "43055280000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "419250000", + "isEnabled": true, + "rate": "19409" + }, + "out": { + "capacity": "415500000", + "isEnabled": true, + "rate": "19235" + } + }, + "standard": { + "in": { + "capacity": "750000000", + "isEnabled": true, + "rate": "34722" + }, + "out": { + "capacity": "750000000", + "isEnabled": true, + "rate": "34722" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "160000000", + "isEnabled": true, + "rate": "7407" + }, + "out": { + "capacity": "155500000", + "isEnabled": true, + "rate": "7199" + } + }, + "standard": { + "in": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "990000000000000000", + "isEnabled": true, + "rate": "45833040000000" + }, + "out": { + "capacity": "1147500000000000000", + "isEnabled": true, + "rate": "53124660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1487500000000000000", + "isEnabled": true, + "rate": "68865300000000" + }, + "out": { + "capacity": "1390000000000000000", + "isEnabled": true, + "rate": "64351440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "39600000000000000000", + "isEnabled": true, + "rate": "458330400000000" + }, + "out": { + "capacity": "912500000000000000", + "isEnabled": true, + "rate": "42245100000000" + } + }, + "standard": { + "in": { + "capacity": "60000000000000000000", + "isEnabled": true, + "rate": "694440000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1257500000000000000", + "isEnabled": true, + "rate": "58217220000000" + }, + "out": { + "capacity": "1390000000000000000", + "isEnabled": true, + "rate": "64351440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1340000000000000000", + "isEnabled": true, + "rate": "62036640000000" + }, + "out": { + "capacity": "1330000000000000000", + "isEnabled": true, + "rate": "61573680000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + } + }, + "SolvBTC.BERA": { + "berachain-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1215000000000000000", + "isEnabled": true, + "rate": "56249640000000" + }, + "out": { + "capacity": "800000000000000000", + "isEnabled": true, + "rate": "37036800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "947500000000000000", + "isEnabled": true, + "rate": "43865460000000" + }, + "out": { + "capacity": "762500000000000000", + "isEnabled": true, + "rate": "35300700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "887500000000000000", + "isEnabled": true, + "rate": "41087700000000" + }, + "out": { + "capacity": "1537500000000000000", + "isEnabled": true, + "rate": "71180100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 10, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1572500000000000000", + "isEnabled": true, + "rate": "72800460000000" + }, + "out": { + "capacity": "970000000000000000", + "isEnabled": true, + "rate": "44907120000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1057500000000000000", + "isEnabled": true, + "rate": "48958020000000" + }, + "out": { + "capacity": "1330000000000000000", + "isEnabled": true, + "rate": "61573680000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1050000000000000000", + "isEnabled": true, + "rate": "48610800000000" + }, + "out": { + "capacity": "1720000000000000000", + "isEnabled": true, + "rate": "79629120000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1667500000000000000", + "isEnabled": true, + "rate": "77198580000000" + }, + "out": { + "capacity": "985000000000000000", + "isEnabled": true, + "rate": "45601560000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1645000000000000000", + "isEnabled": true, + "rate": "76156920000000" + }, + "out": { + "capacity": "1337500000000000000", + "isEnabled": true, + "rate": "61920900000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "932500000000000000", + "isEnabled": true, + "rate": "43171020000000" + }, + "out": { + "capacity": "1087500000000000000", + "isEnabled": true, + "rate": "50346900000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1435000000000000000", + "isEnabled": true, + "rate": "66434760000000" + }, + "out": { + "capacity": "1140000000000000000", + "isEnabled": true, + "rate": "52777440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1422500000000000000", + "isEnabled": true, + "rate": "65856060000000" + }, + "out": { + "capacity": "1525000000000000000", + "isEnabled": true, + "rate": "70601400000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1380000000000000000", + "isEnabled": true, + "rate": "63888480000000" + }, + "out": { + "capacity": "1255000000000000000", + "isEnabled": true, + "rate": "58101480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + } + }, + "SolvBTC.JUP": { + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "810000000000000000", + "isEnabled": true, + "rate": "37499760000000" + }, + "out": { + "capacity": "1457500000000000000", + "isEnabled": true, + "rate": "67476420000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1282500000000000000", + "isEnabled": true, + "rate": "59374620000000" + }, + "out": { + "capacity": "1132500000000000000", + "isEnabled": true, + "rate": "52430220000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1225000000000000000", + "isEnabled": true, + "rate": "56712600000000" + }, + "out": { + "capacity": "1142500000000000000", + "isEnabled": true, + "rate": "52893180000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "2940000000", + "isEnabled": true, + "rate": "34027" + }, + "out": { + "capacity": "34850000000000000000", + "isEnabled": true, + "rate": "403353900000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "57870" + }, + "out": { + "capacity": "50000000000000000000", + "isEnabled": true, + "rate": "578700000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "33900000000000000000", + "isEnabled": true, + "rate": "392358600000000" + }, + "out": { + "capacity": "53800000000000000000", + "isEnabled": true, + "rate": "622681200000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "1157400000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "1157400000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1675000000", + "isEnabled": true, + "rate": "19386" + }, + "out": { + "capacity": "1845000000", + "isEnabled": true, + "rate": "21354" + } + }, + "standard": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "57870" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "57870" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1457500000000000000", + "isEnabled": true, + "rate": "67476420000000" + }, + "out": { + "capacity": "1075000000000000000", + "isEnabled": true, + "rate": "49768200000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "69000000000000000000", + "isEnabled": true, + "rate": "798606000000000" + }, + "out": { + "capacity": "67600000000000000000", + "isEnabled": true, + "rate": "782402400000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "1157400000000000" + }, + "out": { + "capacity": "100000000000000000000", + "isEnabled": true, + "rate": "1157400000000000" + } + } + } + } + } + }, + "STABLE": { + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "4704000000000000000000", + "isEnabled": true, + "rate": "54432000000000000" + }, + "out": { + "capacity": "2716000000000000000000", + "isEnabled": true, + "rate": "31428000000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + }, + "out": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3661000000000000000000", + "isEnabled": true, + "rate": "42363000000000000" + }, + "out": { + "capacity": "3430000000000000000000", + "isEnabled": true, + "rate": "39690000000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + }, + "out": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3976000000000000000000", + "isEnabled": true, + "rate": "46008000000000000" + }, + "out": { + "capacity": "3766000000000000000000", + "isEnabled": true, + "rate": "43578000000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + }, + "out": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "2625000000000000000000", + "isEnabled": true, + "rate": "30375000000000000" + }, + "out": { + "capacity": "4809000000000000000000", + "isEnabled": true, + "rate": "55647000000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + }, + "out": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "3528000000000000000000", + "isEnabled": true, + "rate": "40824000000000000" + }, + "out": { + "capacity": "3885000000000000000000", + "isEnabled": true, + "rate": "44955000000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + }, + "out": { + "capacity": "7000000000000000000000", + "isEnabled": true, + "rate": "81000000000000000" + } + } + } + } + } + }, + "STABUL": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + } + }, + "stBTC": { + "bitcoin-mainnet-bsquared-1": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bitcoin-mainnet-bsquared-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "STBU": { + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "stTAO": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "145600000000", + "isEnabled": true, + "rate": "15142400" + }, + "out": { + "capacity": "209200000000", + "isEnabled": true, + "rate": "21756800" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "157600000000", + "isEnabled": true, + "rate": "16390400" + }, + "out": { + "capacity": "269600000000", + "isEnabled": true, + "rate": "28038400" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "191600000000", + "isEnabled": true, + "rate": "19926400" + }, + "out": { + "capacity": "129200000000", + "isEnabled": true, + "rate": "13436800" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "134400000000", + "isEnabled": true, + "rate": "13977600" + }, + "out": { + "capacity": "243600000000", + "isEnabled": true, + "rate": "25334400" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "241600000000", + "isEnabled": true, + "rate": "25126400" + }, + "out": { + "capacity": "121600000000", + "isEnabled": true, + "rate": "12646400" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "184400000000", + "isEnabled": true, + "rate": "19177600" + }, + "out": { + "capacity": "207600000000", + "isEnabled": true, + "rate": "21590400" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "145200000000", + "isEnabled": true, + "rate": "15100800" + }, + "out": { + "capacity": "139200000000", + "isEnabled": true, + "rate": "14476800" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "272400000000", + "isEnabled": true, + "rate": "28329600" + }, + "out": { + "capacity": "272400000000", + "isEnabled": true, + "rate": "28329600" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "234000000000", + "isEnabled": true, + "rate": "24336000" + }, + "out": { + "capacity": "159200000000", + "isEnabled": true, + "rate": "16556800" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "232000000000", + "isEnabled": true, + "rate": "24128000" + }, + "out": { + "capacity": "133200000000", + "isEnabled": true, + "rate": "13852800" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "241600000000", + "isEnabled": true, + "rate": "25126400" + }, + "out": { + "capacity": "123600000000", + "isEnabled": true, + "rate": "12854400" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "127600000000", + "isEnabled": true, + "rate": "13270400" + }, + "out": { + "capacity": "233200000000", + "isEnabled": true, + "rate": "24252800" + } + }, + "standard": { + "in": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + }, + "out": { + "capacity": "400000000000", + "isEnabled": true, + "rate": "41600000" + } + } + } + } + } + }, + "suBTC": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "4216000000000000000", + "isEnabled": true, + "rate": "48800200000000" + }, + "out": { + "capacity": "3976000000000000000", + "isEnabled": true, + "rate": "46022200000000" + } + }, + "standard": { + "in": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + }, + "out": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3480000000000000000", + "isEnabled": true, + "rate": "40281000000000" + }, + "out": { + "capacity": "5272000000000000000", + "isEnabled": true, + "rate": "61023400000000" + } + }, + "standard": { + "in": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + }, + "out": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "5112000000000000000", + "isEnabled": true, + "rate": "59171400000000" + }, + "out": { + "capacity": "5400000000000000000", + "isEnabled": true, + "rate": "62505000000000" + } + }, + "standard": { + "in": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + }, + "out": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "2768000000000000000", + "isEnabled": true, + "rate": "32039600000000" + }, + "out": { + "capacity": "5280000000000000000", + "isEnabled": true, + "rate": "61116000000000" + } + }, + "standard": { + "in": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + }, + "out": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "4056000000000000000", + "isEnabled": true, + "rate": "46948200000000" + }, + "out": { + "capacity": "3696000000000000000", + "isEnabled": true, + "rate": "42781200000000" + } + }, + "standard": { + "in": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + }, + "out": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3256000000000000000", + "isEnabled": true, + "rate": "37688200000000" + }, + "out": { + "capacity": "4528000000000000000", + "isEnabled": true, + "rate": "52411600000000" + } + }, + "standard": { + "in": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + }, + "out": { + "capacity": "8000000000000000000", + "isEnabled": true, + "rate": "92600000000000" + } + } + } + } + } + }, + "suETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "86100000000000000000", + "isEnabled": true, + "rate": "975800000000000" + }, + "out": { + "capacity": "57000000000000000000", + "isEnabled": true, + "rate": "646000000000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "74100000000000000000", + "isEnabled": true, + "rate": "839800000000000" + }, + "out": { + "capacity": "95850000000000000000", + "isEnabled": true, + "rate": "1086300000000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "79050000000000000000", + "isEnabled": true, + "rate": "895900000000000" + }, + "out": { + "capacity": "78600000000000000000", + "isEnabled": true, + "rate": "890800000000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "48900000000000000000", + "isEnabled": true, + "rate": "554200000000000" + }, + "out": { + "capacity": "91350000000000000000", + "isEnabled": true, + "rate": "1035300000000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "97200000000000000000", + "isEnabled": true, + "rate": "1101600000000000" + }, + "out": { + "capacity": "58500000000000000000", + "isEnabled": true, + "rate": "663000000000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "62700000000000000000", + "isEnabled": true, + "rate": "710600000000000" + }, + "out": { + "capacity": "90450000000000000000", + "isEnabled": true, + "rate": "1025100000000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1700000000000000" + } + } + } + } + } + }, + "sUSD1+": { + "bsc-mainnet": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "suUSD": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "78200000000000000000000", + "isEnabled": true, + "rate": "904774000000000000" + }, + "out": { + "capacity": "100200000000000000000000", + "isEnabled": true, + "rate": "1159314000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "89400000000000000000000", + "isEnabled": true, + "rate": "1034358000000000000" + }, + "out": { + "capacity": "101000000000000000000000", + "isEnabled": true, + "rate": "1168570000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "116000000000000000000000", + "isEnabled": true, + "rate": "1342120000000000000" + }, + "out": { + "capacity": "139200000000000000000000", + "isEnabled": true, + "rate": "1610544000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "66600000000000000000000", + "isEnabled": true, + "rate": "770562000000000000" + }, + "out": { + "capacity": "78000000000000000000000", + "isEnabled": true, + "rate": "902460000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "64800000000000000000000", + "isEnabled": true, + "rate": "749736000000000000" + }, + "out": { + "capacity": "64600000000000000000000", + "isEnabled": true, + "rate": "747422000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "71000000000000000000000", + "isEnabled": true, + "rate": "821470000000000000" + }, + "out": { + "capacity": "111600000000000000000000", + "isEnabled": true, + "rate": "1291212000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "2314000000000000000" + } + } + } + } + } + }, + "SXT": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "syrupUSDC": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "syrupUSDT": { + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "tETH": { + "avalanche-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "tac-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "tac-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "THE": { + "binance-smart-chain-mainnet-opbnb-1": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "binance-smart-chain-mainnet-opbnb-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "297000000000000000000000", + "isEnabled": true, + "rate": "165132000000000000000" + }, + "out": { + "capacity": "394500000000000000000000", + "isEnabled": true, + "rate": "219342000000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "417000000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "417000000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "432000000000000000000000", + "isEnabled": true, + "rate": "240192000000000000000" + }, + "out": { + "capacity": "390750000000000000000000", + "isEnabled": true, + "rate": "217257000000000000000" + } + }, + "standard": { + "in": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "417000000000000000000" + }, + "out": { + "capacity": "750000000000000000000000", + "isEnabled": true, + "rate": "417000000000000000000" + } + } + } + } + } + }, + "TRADE": { + "bsc-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": null, + "standard": null + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "TREE": { + "avalanche-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "TURBO": { + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "4704000000000000000000000", + "isEnabled": true, + "rate": "1306666636800000000000" + }, + "out": { + "capacity": "3822000000000000000000000", + "isEnabled": true, + "rate": "1061666642400000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000000", + "isEnabled": true, + "rate": "1944444400000000000000" + }, + "out": { + "capacity": "7000000000000000000000000", + "isEnabled": true, + "rate": "1944444400000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "4781000000000000000000000", + "isEnabled": true, + "rate": "1328055525200000000000" + }, + "out": { + "capacity": "2744000000000000000000000", + "isEnabled": true, + "rate": "762222204800000000000" + } + }, + "standard": { + "in": { + "capacity": "7000000000000000000000000", + "isEnabled": true, + "rate": "1944444400000000000000" + }, + "out": { + "capacity": "7000000000000000000000000", + "isEnabled": true, + "rate": "1944444400000000000000" + } + } + } + } + } + }, + "TURTLE": { + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "una.USDC": { + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "99600000000", + "isEnabled": true, + "rate": "27665560" + }, + "out": { + "capacity": "129000000000", + "isEnabled": true, + "rate": "35831900" + } + }, + "standard": { + "in": { + "capacity": "300000000000", + "isEnabled": true, + "rate": "83330000" + }, + "out": { + "capacity": "300000000000", + "isEnabled": true, + "rate": "83330000" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "171300000000", + "isEnabled": true, + "rate": "47581430" + }, + "out": { + "capacity": "140100000000", + "isEnabled": true, + "rate": "38915110" + } + }, + "standard": { + "in": { + "capacity": "300000000000", + "isEnabled": true, + "rate": "83330000" + }, + "out": { + "capacity": "300000000000", + "isEnabled": true, + "rate": "83330000" + } + } + } + } + } + }, + "una.WEMIX": { + "avalanche-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "62600000000000000000000", + "isEnabled": true, + "rate": "17387150000000000000" + }, + "out": { + "capacity": "118800000000000000000000", + "isEnabled": true, + "rate": "32996700000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "83000000000000000000000", + "isEnabled": true, + "rate": "23053250000000000000" + }, + "out": { + "capacity": "129000000000000000000000", + "isEnabled": true, + "rate": "35829750000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "117000000000000000000000", + "isEnabled": true, + "rate": "32496750000000000000" + }, + "out": { + "capacity": "135400000000000000000000", + "isEnabled": true, + "rate": "37607350000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 3, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "71600000000000000000000", + "isEnabled": true, + "rate": "19886900000000000000" + }, + "out": { + "capacity": "90000000000000000000000", + "isEnabled": true, + "rate": "24997500000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "106600000000000000000000", + "isEnabled": true, + "rate": "29608150000000000000" + }, + "out": { + "capacity": "70200000000000000000000", + "isEnabled": true, + "rate": "19498050000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "127000000000000000000000", + "isEnabled": true, + "rate": "35274250000000000000" + }, + "out": { + "capacity": "73400000000000000000000", + "isEnabled": true, + "rate": "20386850000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "102000000000000000000000", + "isEnabled": true, + "rate": "28330500000000000000" + }, + "out": { + "capacity": "139000000000000000000000", + "isEnabled": true, + "rate": "38607250000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "118800000000000000000000", + "isEnabled": true, + "rate": "32996700000000000000" + }, + "out": { + "capacity": "95200000000000000000000", + "isEnabled": true, + "rate": "26441800000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "78400000000000000000000", + "isEnabled": true, + "rate": "21775600000000000000" + }, + "out": { + "capacity": "131400000000000000000000", + "isEnabled": true, + "rate": "36496350000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "63400000000000000000000", + "isEnabled": true, + "rate": "17609350000000000000" + }, + "out": { + "capacity": "123800000000000000000000", + "isEnabled": true, + "rate": "34385450000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "136000000000000000000000", + "isEnabled": true, + "rate": "37774000000000000000" + }, + "out": { + "capacity": "92200000000000000000000", + "isEnabled": true, + "rate": "25608550000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "126000000000000000000000", + "isEnabled": true, + "rate": "34996500000000000000" + }, + "out": { + "capacity": "82400000000000000000000", + "isEnabled": true, + "rate": "22886600000000000000" + } + }, + "standard": { + "in": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + }, + "out": { + "capacity": "200000000000000000000000", + "isEnabled": true, + "rate": "55550000000000000000" + } + } + } + } + } + }, + "uniBTC": { + "aptos-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "94000000", + "isEnabled": true, + "rate": "1088" + }, + "out": { + "capacity": "134200000", + "isEnabled": true, + "rate": "1553" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "berachain-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "129000000", + "isEnabled": true, + "rate": "1493" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "97800000", + "isEnabled": true, + "rate": "1132" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bitcoin-mainnet-bsquared-1": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "89000000", + "isEnabled": true, + "rate": "5150" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "139800000", + "isEnabled": true, + "rate": "1618" + }, + "out": { + "capacity": "75000000", + "isEnabled": true, + "rate": "868" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "96000000", + "isEnabled": true, + "rate": "1111" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "corn-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "120200000", + "isEnabled": true, + "rate": "1391" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "98000000", + "isEnabled": true, + "rate": "1134" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "61400000", + "isEnabled": true, + "rate": "710" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "96000000", + "isEnabled": true, + "rate": "5555" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "139800000", + "isEnabled": true, + "rate": "8090" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "ethereum-mainnet-unichain-1": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "130600000", + "isEnabled": true, + "rate": "1511" + }, + "out": { + "capacity": "93600000", + "isEnabled": true, + "rate": "1083" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "ethereum-mainnet-xlayer-1": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "70200000", + "isEnabled": true, + "rate": "812" + }, + "out": { + "capacity": "78400000", + "isEnabled": true, + "rate": "907" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "66000000", + "isEnabled": true, + "rate": "763" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "120400000", + "isEnabled": true, + "rate": "1393" + }, + "out": { + "capacity": "125600000", + "isEnabled": true, + "rate": "1453" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "115800000", + "isEnabled": true, + "rate": "1340" + }, + "out": { + "capacity": "73400000", + "isEnabled": true, + "rate": "849" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "120400000", + "isEnabled": true, + "rate": "1393" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "bitcoin-mainnet-bsquared-1": { + "custom": { + "in": { + "capacity": "101600000", + "isEnabled": true, + "rate": "1176" + }, + "out": { + "capacity": "84000000", + "isEnabled": true, + "rate": "972" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "109000000", + "isEnabled": true, + "rate": "1261" + }, + "out": { + "capacity": "69000000", + "isEnabled": true, + "rate": "798" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "corn-mainnet": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "61200000", + "isEnabled": true, + "rate": "70816" + }, + "out": { + "capacity": "113800000", + "isEnabled": true, + "rate": "131682" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "231428" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "231428" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "127000000", + "isEnabled": true, + "rate": "1470" + }, + "out": { + "capacity": "82000000", + "isEnabled": true, + "rate": "949" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "107800000", + "isEnabled": true, + "rate": "1247" + }, + "out": { + "capacity": "137800000", + "isEnabled": true, + "rate": "1595" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "113600000", + "isEnabled": true, + "rate": "6574" + }, + "out": { + "capacity": "115800000", + "isEnabled": true, + "rate": "6701" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "118000000", + "isEnabled": true, + "rate": "6828" + }, + "out": { + "capacity": "78000000", + "isEnabled": true, + "rate": "4513" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "94800000", + "isEnabled": true, + "rate": "1097" + }, + "out": { + "capacity": "134400000", + "isEnabled": true, + "rate": "1555" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "ethereum-mainnet-xlayer-1": { + "custom": { + "in": { + "capacity": "91000000", + "isEnabled": true, + "rate": "1053" + }, + "out": { + "capacity": "73400000", + "isEnabled": true, + "rate": "849" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "0", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "115200000", + "isEnabled": true, + "rate": "1333" + }, + "out": { + "capacity": "75200000", + "isEnabled": true, + "rate": "870" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "tac-mainnet": { + "custom": { + "in": { + "capacity": "137000000", + "isEnabled": true, + "rate": "1585" + }, + "out": { + "capacity": "123800000", + "isEnabled": true, + "rate": "1432" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "113200000", + "isEnabled": true, + "rate": "1310" + }, + "out": { + "capacity": "117400000", + "isEnabled": true, + "rate": "1358" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "96800000", + "isEnabled": true, + "rate": "1120" + }, + "out": { + "capacity": "117600000", + "isEnabled": true, + "rate": "1361" + } + }, + "standard": { + "in": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + }, + "out": { + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" + } + } + } + } + }, + "tac-mainnet": { + "minBlockConfirmation": null, + "remote": { + "mainnet": { + "custom": null, + "standard": null + } + } + } + }, + "UNIO": { + "bsc-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "32000000000000000000000000", + "isEnabled": true, + "rate": "8888883200000000000000" + }, + "out": { + "capacity": "34650000000000000000000000", + "isEnabled": true, + "rate": "9624993840000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13888880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13888880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "6300000000000000000000000", + "isEnabled": true, + "rate": "218400000000000000000" + }, + "out": { + "capacity": "4800000000000000000000000", + "isEnabled": true, + "rate": "166400000000000000000" + } + }, + "standard": { + "in": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + }, + "out": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "33900000000000000000000000", + "isEnabled": true, + "rate": "9416660640000000000000" + }, + "out": { + "capacity": "23750000000000000000000000", + "isEnabled": true, + "rate": "6597218000000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13888880000000000000000" + }, + "out": { + "capacity": "50000000000000000000000000", + "isEnabled": true, + "rate": "13888880000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "6345000000000000000000000", + "isEnabled": true, + "rate": "219960000000000000000" + }, + "out": { + "capacity": "10200000000000000000000000", + "isEnabled": true, + "rate": "353600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + }, + "out": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "7485000000000000000000000", + "isEnabled": true, + "rate": "259480000000000000000" + }, + "out": { + "capacity": "9495000000000000000000000", + "isEnabled": true, + "rate": "329160000000000000000" + } + }, + "standard": { + "in": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + }, + "out": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "9630000000000000000000000", + "isEnabled": true, + "rate": "333840000000000000000" + }, + "out": { + "capacity": "6120000000000000000000000", + "isEnabled": true, + "rate": "212160000000000000000" + } + }, + "standard": { + "in": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + }, + "out": { + "capacity": "15000000000000000000000000", + "isEnabled": true, + "rate": "520000000000000000000" + } + } + } + } + } + }, + "USAGI": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 5, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "USD+": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "96800000000", + "isEnabled": true, + "rate": "26620000" + }, + "out": { + "capacity": "110200000000", + "isEnabled": true, + "rate": "30305000" + } + }, + "standard": { + "in": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + }, + "out": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "77400000000", + "isEnabled": true, + "rate": "21285000" + }, + "out": { + "capacity": "87200000000", + "isEnabled": true, + "rate": "23980000" + } + }, + "standard": { + "in": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + }, + "out": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "92000000000", + "isEnabled": true, + "rate": "25300000" + }, + "out": { + "capacity": "99000000000", + "isEnabled": true, + "rate": "27225000" + } + }, + "standard": { + "in": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + }, + "out": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "86800000000", + "isEnabled": true, + "rate": "23870000" + }, + "out": { + "capacity": "82400000000", + "isEnabled": true, + "rate": "22660000" + } + }, + "standard": { + "in": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + }, + "out": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "104600000000", + "isEnabled": true, + "rate": "28765000" + }, + "out": { + "capacity": "105400000000", + "isEnabled": true, + "rate": "28985000" + } + }, + "standard": { + "in": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + }, + "out": { + "capacity": "200000000000", + "isEnabled": true, + "rate": "55000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + } + } + } + }, + "USD0": { + "bsc-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1491000000000000000000000", + "isEnabled": true, + "rate": "17395000000000000000" + }, + "out": { + "capacity": "1020000000000000000000000", + "isEnabled": true, + "rate": "11900000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "975000000000000000000000", + "isEnabled": true, + "rate": "11375000000000000000" + }, + "out": { + "capacity": "1500000000000000000000000", + "isEnabled": true, + "rate": "17500000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1203000000000000000000000", + "isEnabled": true, + "rate": "14035000000000000000" + }, + "out": { + "capacity": "906000000000000000000000", + "isEnabled": true, + "rate": "10570000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1506000000000000000000000", + "isEnabled": true, + "rate": "17570000000000000000" + }, + "out": { + "capacity": "1251000000000000000000000", + "isEnabled": true, + "rate": "14595000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + } + } + } + }, + "USD1": { + "ab-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "aptos-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ab-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "aptos-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "morph-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plume-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "monad-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "morph-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plume-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "USDC": { + "0g-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "avalanche-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "19250000000", + "isEnabled": true, + "rate": "3850000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "50000000000", + "isEnabled": true, + "rate": "10000000" + } + } + } + } + }, + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-unichain-1": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "0g-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "wemix-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "wemix-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "USDf": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "xdc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "xdc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "USDFI": { + "bsc-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "29950000000000000000000", + "isEnabled": true, + "rate": "341430000000000000" + }, + "out": { + "capacity": "18450000000000000000000", + "isEnabled": true, + "rate": "210330000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "34250000000000000000000", + "isEnabled": true, + "rate": "390450000000000000" + }, + "out": { + "capacity": "29900000000000000000000", + "isEnabled": true, + "rate": "340860000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "24500000000000000000000", + "isEnabled": true, + "rate": "279300000000000000" + }, + "out": { + "capacity": "27400000000000000000000", + "isEnabled": true, + "rate": "312360000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "20550000000000000000000", + "isEnabled": true, + "rate": "234270000000000000" + }, + "out": { + "capacity": "18600000000000000000000", + "isEnabled": true, + "rate": "212040000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "29850000000000000000000", + "isEnabled": true, + "rate": "340290000000000000" + }, + "out": { + "capacity": "30450000000000000000000", + "isEnabled": true, + "rate": "347130000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "17350000000000000000000", + "isEnabled": true, + "rate": "197790000000000000" + }, + "out": { + "capacity": "25300000000000000000000", + "isEnabled": true, + "rate": "288420000000000000" + } + }, + "standard": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + }, + "out": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "570000000000000000" + } + } + } + } + } + }, + "USDM": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "578000000000000000000000", + "isEnabled": true, + "rate": "6704800000000000000" + }, + "out": { + "capacity": "603000000000000000000000", + "isEnabled": true, + "rate": "6994800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "616000000000000000000000", + "isEnabled": true, + "rate": "7145600000000000000" + }, + "out": { + "capacity": "343000000000000000000000", + "isEnabled": true, + "rate": "3978800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "592000000000000000000000", + "isEnabled": true, + "rate": "6867200000000000000" + }, + "out": { + "capacity": "690000000000000000000000", + "isEnabled": true, + "rate": "8004000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "305000000000000000000000", + "isEnabled": true, + "rate": "3538000000000000000" + }, + "out": { + "capacity": "355000000000000000000000", + "isEnabled": true, + "rate": "4118000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "356000000000000000000000", + "isEnabled": true, + "rate": "4129600000000000000" + }, + "out": { + "capacity": "484000000000000000000000", + "isEnabled": true, + "rate": "5614400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "633000000000000000000000", + "isEnabled": true, + "rate": "7342800000000000000" + }, + "out": { + "capacity": "450000000000000000000000", + "isEnabled": true, + "rate": "5220000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "496000000000000000000000", + "isEnabled": true, + "rate": "5753600000000000000" + }, + "out": { + "capacity": "501000000000000000000000", + "isEnabled": true, + "rate": "5811600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "330000000000000000000000", + "isEnabled": true, + "rate": "3828000000000000000" + }, + "out": { + "capacity": "457000000000000000000000", + "isEnabled": true, + "rate": "5301200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "658000000000000000000000", + "isEnabled": true, + "rate": "7632800000000000000" + }, + "out": { + "capacity": "636000000000000000000000", + "isEnabled": true, + "rate": "7377600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "539000000000000000000000", + "isEnabled": true, + "rate": "6252400000000000000" + }, + "out": { + "capacity": "670000000000000000000000", + "isEnabled": true, + "rate": "7772000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "384000000000000000000000", + "isEnabled": true, + "rate": "4454400000000000000" + }, + "out": { + "capacity": "594000000000000000000000", + "isEnabled": true, + "rate": "6890400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "567000000000000000000000", + "isEnabled": true, + "rate": "6577200000000000000" + }, + "out": { + "capacity": "573000000000000000000000", + "isEnabled": true, + "rate": "6646800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "660000000000000000000000", + "isEnabled": true, + "rate": "7656000000000000000" + }, + "out": { + "capacity": "356000000000000000000000", + "isEnabled": true, + "rate": "4129600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "334000000000000000000000", + "isEnabled": true, + "rate": "3874400000000000000" + }, + "out": { + "capacity": "556000000000000000000000", + "isEnabled": true, + "rate": "6449600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "324000000000000000000000", + "isEnabled": true, + "rate": "3758400000000000000" + }, + "out": { + "capacity": "386000000000000000000000", + "isEnabled": true, + "rate": "4477600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "363000000000000000000000", + "isEnabled": true, + "rate": "4210800000000000000" + }, + "out": { + "capacity": "394000000000000000000000", + "isEnabled": true, + "rate": "4570400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "563000000000000000000000", + "isEnabled": true, + "rate": "6530800000000000000" + }, + "out": { + "capacity": "601000000000000000000000", + "isEnabled": true, + "rate": "6971600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "387000000000000000000000", + "isEnabled": true, + "rate": "4489200000000000000" + }, + "out": { + "capacity": "381000000000000000000000", + "isEnabled": true, + "rate": "4419600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "387000000000000000000000", + "isEnabled": true, + "rate": "4489200000000000000" + }, + "out": { + "capacity": "542000000000000000000000", + "isEnabled": true, + "rate": "6287200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "613000000000000000000000", + "isEnabled": true, + "rate": "7110800000000000000" + }, + "out": { + "capacity": "321000000000000000000000", + "isEnabled": true, + "rate": "3723600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "342000000000000000000000", + "isEnabled": true, + "rate": "3967200000000000000" + }, + "out": { + "capacity": "345000000000000000000000", + "isEnabled": true, + "rate": "4002000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "427000000000000000000000", + "isEnabled": true, + "rate": "4953200000000000000" + }, + "out": { + "capacity": "669000000000000000000000", + "isEnabled": true, + "rate": "7760400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "491000000000000000000000", + "isEnabled": true, + "rate": "5695600000000000000" + }, + "out": { + "capacity": "418000000000000000000000", + "isEnabled": true, + "rate": "4848800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "315000000000000000000000", + "isEnabled": true, + "rate": "3654000000000000000" + }, + "out": { + "capacity": "637000000000000000000000", + "isEnabled": true, + "rate": "7389200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "652000000000000000000000", + "isEnabled": true, + "rate": "7563200000000000000" + }, + "out": { + "capacity": "307000000000000000000000", + "isEnabled": true, + "rate": "3561200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "439000000000000000000000", + "isEnabled": true, + "rate": "5092400000000000000" + }, + "out": { + "capacity": "483000000000000000000000", + "isEnabled": true, + "rate": "5602800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "300000000000000000000000", + "isEnabled": true, + "rate": "3480000000000000000" + }, + "out": { + "capacity": "674000000000000000000000", + "isEnabled": true, + "rate": "7818400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "617000000000000000000000", + "isEnabled": true, + "rate": "7157200000000000000" + }, + "out": { + "capacity": "326000000000000000000000", + "isEnabled": true, + "rate": "3781600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "349000000000000000000000", + "isEnabled": true, + "rate": "4048400000000000000" + }, + "out": { + "capacity": "344000000000000000000000", + "isEnabled": true, + "rate": "3990400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "582000000000000000000000", + "isEnabled": true, + "rate": "6751200000000000000" + }, + "out": { + "capacity": "313000000000000000000000", + "isEnabled": true, + "rate": "3630800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "487000000000000000000000", + "isEnabled": true, + "rate": "5649200000000000000" + }, + "out": { + "capacity": "478000000000000000000000", + "isEnabled": true, + "rate": "5544800000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "405000000000000000000000", + "isEnabled": true, + "rate": "4698000000000000000" + }, + "out": { + "capacity": "640000000000000000000000", + "isEnabled": true, + "rate": "7424000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "401000000000000000000000", + "isEnabled": true, + "rate": "4651600000000000000" + }, + "out": { + "capacity": "665000000000000000000000", + "isEnabled": true, + "rate": "7714000000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "654000000000000000000000", + "isEnabled": true, + "rate": "7586400000000000000" + }, + "out": { + "capacity": "677000000000000000000000", + "isEnabled": true, + "rate": "7853200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "480000000000000000000000", + "isEnabled": true, + "rate": "5568000000000000000" + }, + "out": { + "capacity": "514000000000000000000000", + "isEnabled": true, + "rate": "5962400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "562000000000000000000000", + "isEnabled": true, + "rate": "6519200000000000000" + }, + "out": { + "capacity": "367000000000000000000000", + "isEnabled": true, + "rate": "4257200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "322000000000000000000000", + "isEnabled": true, + "rate": "3735200000000000000" + }, + "out": { + "capacity": "686000000000000000000000", + "isEnabled": true, + "rate": "7957600000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "350000000000000000000000", + "isEnabled": true, + "rate": "4060000000000000000" + }, + "out": { + "capacity": "452000000000000000000000", + "isEnabled": true, + "rate": "5243200000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "418000000000000000000000", + "isEnabled": true, + "rate": "4848800000000000000" + }, + "out": { + "capacity": "629000000000000000000000", + "isEnabled": true, + "rate": "7296400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "363000000000000000000000", + "isEnabled": true, + "rate": "4210800000000000000" + }, + "out": { + "capacity": "389000000000000000000000", + "isEnabled": true, + "rate": "4512400000000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + } + } + } + }, + "USDO": { + "bsc-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "7276500000000000000000000", + "isEnabled": true, + "rate": "803880000000000000000" + }, + "out": { + "capacity": "6430000000000000000000000", + "isEnabled": true, + "rate": "745880000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10500000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "5838000000000000000000000", + "isEnabled": true, + "rate": "644960000000000000000" + }, + "out": { + "capacity": "4830000000000000000000000", + "isEnabled": true, + "rate": "560280000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10500000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "3391500000000000000000000", + "isEnabled": true, + "rate": "374680000000000000000" + }, + "out": { + "capacity": "5800000000000000000000000", + "isEnabled": true, + "rate": "672800000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10500000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + }, + "out": { + "capacity": "2020000000000000000000000", + "isEnabled": true, + "rate": "23379641600000000000" + } + }, + "standard": { + "in": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870400000000000000" + } + } + } + } + }, + "kaia-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "7686000000000000000000000", + "isEnabled": true, + "rate": "84912000000000000000" + }, + "out": { + "capacity": "13680000000000000000000000", + "isEnabled": true, + "rate": "158688000000000000000" + } + }, + "standard": { + "in": { + "capacity": "21000000000000000000000000", + "isEnabled": true, + "rate": "232000000000000000000" + }, + "out": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "232000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "7213500000000000000000000", + "isEnabled": true, + "rate": "796920000000000000000" + }, + "out": { + "capacity": "3920000000000000000000000", + "isEnabled": true, + "rate": "454720000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10500000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1160000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3674000000000000000000000", + "isEnabled": true, + "rate": "42523169920000000000" + }, + "out": { + "capacity": "1", + "isEnabled": true, + "rate": "0" + } + }, + "standard": { + "in": { + "capacity": "5500000000000000000000000", + "isEnabled": true, + "rate": "63657440000000000000" + }, + "out": { + "capacity": "2", + "isEnabled": true, + "rate": "1" + } + } + }, + "kaia-mainnet": { + "custom": { + "in": { + "capacity": "14238000000000000000000000", + "isEnabled": true, + "rate": "157296000000000000000" + }, + "out": { + "capacity": "6420000000000000000000000", + "isEnabled": true, + "rate": "74472000000000000000" + } + }, + "standard": { + "in": { + "capacity": "21000000000000000000000000", + "isEnabled": true, + "rate": "232000000000000000000" + }, + "out": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "232000000000000000000" + } + } + } + } + } + }, + "USDT": { + "0g-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "3590000000000", + "isEnabled": true, + "rate": "1795000000" + }, + "out": { + "capacity": "5130000000000", + "isEnabled": true, + "rate": "2565000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "16850000000", + "isEnabled": true, + "rate": "3370000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "50000000000", + "isEnabled": true, + "rate": "10000000" + } + } + } + } + }, + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "5960000000000", + "isEnabled": true, + "rate": "2980000000" + }, + "out": { + "capacity": "5120000000000", + "isEnabled": true, + "rate": "2560000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "4020000000000", + "isEnabled": true, + "rate": "2010000000" + }, + "out": { + "capacity": "6600000000000", + "isEnabled": true, + "rate": "3300000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "3170000000000", + "isEnabled": true, + "rate": "1585000000" + }, + "out": { + "capacity": "5890000000000", + "isEnabled": true, + "rate": "2945000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "bitcoin-mainnet-botanix": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "3040000000000", + "isEnabled": true, + "rate": "1520000000" + }, + "out": { + "capacity": "6900000000000", + "isEnabled": true, + "rate": "3450000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "celo-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "4310000000000", + "isEnabled": true, + "rate": "2155000000" + }, + "out": { + "capacity": "5170000000000", + "isEnabled": true, + "rate": "2585000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "4450000000000", + "isEnabled": true, + "rate": "2225000000" + }, + "out": { + "capacity": "5060000000000", + "isEnabled": true, + "rate": "2530000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "6730000000000", + "isEnabled": true, + "rate": "3365000000" + }, + "out": { + "capacity": "3820000000000", + "isEnabled": true, + "rate": "1910000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "celo-mainnet": { + "custom": { + "in": { + "capacity": "4620000000000", + "isEnabled": true, + "rate": "2310000000" + }, + "out": { + "capacity": "4190000000000", + "isEnabled": true, + "rate": "2095000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-hashkey-1": { + "custom": { + "in": { + "capacity": "4080000000000", + "isEnabled": true, + "rate": "2040000000" + }, + "out": { + "capacity": "4240000000000", + "isEnabled": true, + "rate": "2120000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3600000000000", + "isEnabled": true, + "rate": "1800000000" + }, + "out": { + "capacity": "5900000000000", + "isEnabled": true, + "rate": "2950000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "3380000000000", + "isEnabled": true, + "rate": "1690000000" + }, + "out": { + "capacity": "3790000000000", + "isEnabled": true, + "rate": "1895000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "ethereum-mainnet-hashkey-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "3120000000000", + "isEnabled": true, + "rate": "1560000000" + }, + "out": { + "capacity": "3760000000000", + "isEnabled": true, + "rate": "1880000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "4980000000000", + "isEnabled": true, + "rate": "2490000000" + }, + "out": { + "capacity": "6080000000000", + "isEnabled": true, + "rate": "3040000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "4330000000000", + "isEnabled": true, + "rate": "2165000000" + }, + "out": { + "capacity": "4650000000000", + "isEnabled": true, + "rate": "2325000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 2, + "remote": { + "celo-mainnet": { + "custom": { + "in": { + "capacity": "3890000000000", + "isEnabled": true, + "rate": "1945000000" + }, + "out": { + "capacity": "4420000000000", + "isEnabled": true, + "rate": "2210000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "5030000000000", + "isEnabled": true, + "rate": "2515000000" + }, + "out": { + "capacity": "4660000000000", + "isEnabled": true, + "rate": "2330000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-hashkey-1": { + "custom": { + "in": { + "capacity": "5450000000000", + "isEnabled": true, + "rate": "2725000000" + }, + "out": { + "capacity": "6780000000000", + "isEnabled": true, + "rate": "3390000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "4100000000000", + "isEnabled": true, + "rate": "2050000000" + }, + "out": { + "capacity": "6560000000000", + "isEnabled": true, + "rate": "3280000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "5420000000000", + "isEnabled": true, + "rate": "2710000000" + }, + "out": { + "capacity": "6140000000000", + "isEnabled": true, + "rate": "3070000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "0g-mainnet": { + "custom": { + "in": { + "capacity": "5140000000000", + "isEnabled": true, + "rate": "2570000000" + }, + "out": { + "capacity": "5060000000000", + "isEnabled": true, + "rate": "2530000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "5570000000000", + "isEnabled": true, + "rate": "2785000000" + }, + "out": { + "capacity": "4390000000000", + "isEnabled": true, + "rate": "2195000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "bitcoin-mainnet-botanix": { + "custom": { + "in": { + "capacity": "3380000000000", + "isEnabled": true, + "rate": "1690000000" + }, + "out": { + "capacity": "3600000000000", + "isEnabled": true, + "rate": "1800000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "celo-mainnet": { + "custom": { + "in": { + "capacity": "4990000000000", + "isEnabled": true, + "rate": "2495000000" + }, + "out": { + "capacity": "6970000000000", + "isEnabled": true, + "rate": "3485000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "5880000000000", + "isEnabled": true, + "rate": "2940000000" + }, + "out": { + "capacity": "6300000000000", + "isEnabled": true, + "rate": "3150000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-hashkey-1": { + "custom": { + "in": { + "capacity": "5100000000000", + "isEnabled": true, + "rate": "2550000000" + }, + "out": { + "capacity": "6150000000000", + "isEnabled": true, + "rate": "3075000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "6150000000000", + "isEnabled": true, + "rate": "3075000000" + }, + "out": { + "capacity": "4040000000000", + "isEnabled": true, + "rate": "2020000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "6310000000000", + "isEnabled": true, + "rate": "3155000000" + }, + "out": { + "capacity": "6280000000000", + "isEnabled": true, + "rate": "3140000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "4540000000000", + "isEnabled": true, + "rate": "2270000000" + }, + "out": { + "capacity": "5930000000000", + "isEnabled": true, + "rate": "2965000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "4280000000000", + "isEnabled": true, + "rate": "2140000000" + }, + "out": { + "capacity": "6820000000000", + "isEnabled": true, + "rate": "3410000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "6640000000000", + "isEnabled": true, + "rate": "3320000000" + }, + "out": { + "capacity": "4700000000000", + "isEnabled": true, + "rate": "2350000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "6220000000000", + "isEnabled": true, + "rate": "3110000000" + }, + "out": { + "capacity": "6230000000000", + "isEnabled": true, + "rate": "3115000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + }, + "out": { + "capacity": "10000000000000", + "isEnabled": true, + "rate": "5000000000" + } + } + } + } + } + }, + "USELESS": { + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "USUAL": { + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1431000000000000000000000", + "isEnabled": true, + "rate": "16695000000000000000" + }, + "out": { + "capacity": "2034000000000000000000000", + "isEnabled": true, + "rate": "23730000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1356000000000000000000000", + "isEnabled": true, + "rate": "15820000000000000000" + }, + "out": { + "capacity": "1557000000000000000000000", + "isEnabled": true, + "rate": "18165000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1707000000000000000000000", + "isEnabled": true, + "rate": "19915000000000000000" + }, + "out": { + "capacity": "930000000000000000000000", + "isEnabled": true, + "rate": "10850000000000000000" + } + }, + "standard": { + "in": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + }, + "out": { + "capacity": "3000000000000000000000000", + "isEnabled": true, + "rate": "35000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + } + } + } + }, + "USX": { + "plasma-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": null, + "remote": { + "plasma-mainnet": { + "custom": null, + "standard": null + } + } + } + }, + "VOOI": { + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "VRTX": { + "avalanche-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "6770000000000000000000000", + "isEnabled": true, + "rate": "677000000000000000000000" + }, + "out": { + "capacity": "3420000000000000000000000", + "isEnabled": true, + "rate": "342000000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2200000000000000000000000", + "isEnabled": true, + "rate": "25462800000000000000" + }, + "out": { + "capacity": "1740000000000000000000000", + "isEnabled": true, + "rate": "20138760000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "3160000000000000000000000", + "isEnabled": true, + "rate": "36573840000000000000" + }, + "out": { + "capacity": "1885000000000000000000000", + "isEnabled": true, + "rate": "21816990000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + }, + "ethereum-mainnet-mantle-1": { + "custom": { + "in": { + "capacity": "2810000000000000000000000", + "isEnabled": true, + "rate": "32522940000000000000" + }, + "out": { + "capacity": "3090000000000000000000000", + "isEnabled": true, + "rate": "35763660000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "5440000000000000000000000", + "isEnabled": true, + "rate": "544000000000000000000000" + }, + "out": { + "capacity": "4570000000000000000000000", + "isEnabled": true, + "rate": "457000000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "2060000000000000000000000", + "isEnabled": true, + "rate": "23842440000000000000" + }, + "out": { + "capacity": "1895000000000000000000000", + "isEnabled": true, + "rate": "21932730000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + }, + "ethereum-mainnet-blast-1": { + "custom": { + "in": { + "capacity": "2845000000000000000000000", + "isEnabled": true, + "rate": "32928030000000000000" + }, + "out": { + "capacity": "2720000000000000000000000", + "isEnabled": true, + "rate": "31481280000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-blast-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1670000000000000000000000", + "isEnabled": true, + "rate": "19328580000000000000" + }, + "out": { + "capacity": "1530000000000000000000000", + "isEnabled": true, + "rate": "17708220000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "2715000000000000000000000", + "isEnabled": true, + "rate": "31423410000000000000" + }, + "out": { + "capacity": "1785000000000000000000000", + "isEnabled": true, + "rate": "20659590000000000000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + }, + "out": { + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" + } + } + } + } + }, + "ethereum-mainnet-mantle-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "sei-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "6690000000000000000000000", + "isEnabled": true, + "rate": "669000000000000000000000" + }, + "out": { + "capacity": "4380000000000000000000000", + "isEnabled": true, + "rate": "438000000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000000000" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "VSN": { + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "29947500000000000000000000", + "isEnabled": true, + "rate": "25047000000000000000" + }, + "out": { + "capacity": "47850000000000000000000000", + "isEnabled": true, + "rate": "44022000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "33825000000000000000000000", + "isEnabled": true, + "rate": "28290000000000000000" + }, + "out": { + "capacity": "38100000000000000000000000", + "isEnabled": true, + "rate": "35052000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "41085000000000000000000000", + "isEnabled": true, + "rate": "34362000000000000000" + }, + "out": { + "capacity": "40650000000000000000000000", + "isEnabled": true, + "rate": "37398000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "53377500000000000000000000", + "isEnabled": true, + "rate": "44643000000000000000" + }, + "out": { + "capacity": "49725000000000000000000000", + "isEnabled": true, + "rate": "45747000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "25162500000000000000000000", + "isEnabled": true, + "rate": "21045000000000000000" + }, + "out": { + "capacity": "32025000000000000000000000", + "isEnabled": true, + "rate": "29463000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "45375000000000000000000000", + "isEnabled": true, + "rate": "37950000000000000000" + }, + "out": { + "capacity": "37875000000000000000000000", + "isEnabled": true, + "rate": "34845000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "29370000000000000000000000", + "isEnabled": true, + "rate": "24564000000000000000" + }, + "out": { + "capacity": "52350000000000000000000000", + "isEnabled": true, + "rate": "48162000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "36877500000000000000000000", + "isEnabled": true, + "rate": "30843000000000000000" + }, + "out": { + "capacity": "30900000000000000000000000", + "isEnabled": true, + "rate": "28428000000000000000" + } + }, + "standard": { + "in": { + "capacity": "82500000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + }, + "out": { + "capacity": "75000000000000000000000000", + "isEnabled": true, + "rate": "69000000000000000000" + } + } + } + } + } + }, + "W0G": { + "0g-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "0g-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 8, + "remote": { + "0g-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "0g-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WASTR": { + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "polkadot-mainnet-astar": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "4880000000000000000000000", + "isEnabled": true, + "rate": "1355664000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "2778000000000000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "3270000000000000000000000", + "isEnabled": true, + "rate": "908406000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "2778000000000000000000" + } + } + } + } + }, + "polkadot-mainnet-astar": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "5190000000000000000000000", + "isEnabled": true, + "rate": "1441782000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "10000000000000000000000000", + "isEnabled": true, + "rate": "2778000000000000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "10720000000000000000000000", + "isEnabled": true, + "rate": "2978016000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "5556000000000000000000" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polkadot-mainnet-astar": { + "custom": null, + "standard": null + } + } + } + }, + "WBTC": { + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "2100000000", + "isEnabled": true, + "rate": "24305" + }, + "out": { + "capacity": "2381400000", + "isEnabled": true, + "rate": "27562" + } + }, + "standard": { + "in": { + "capacity": "4200000000", + "isEnabled": true, + "rate": "48610" + }, + "out": { + "capacity": "3780000000", + "isEnabled": true, + "rate": "43750" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1650600000", + "isEnabled": true, + "rate": "19103" + }, + "out": { + "capacity": "2570400000", + "isEnabled": true, + "rate": "29750" + } + }, + "standard": { + "in": { + "capacity": "4200000000", + "isEnabled": true, + "rate": "48610" + }, + "out": { + "capacity": "3780000000", + "isEnabled": true, + "rate": "43750" + } + } + } + } + } + }, + "WECO": { + "bsc-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "189000000000000000000000000", + "isEnabled": true, + "rate": "13124160000000000000000" + }, + "out": { + "capacity": "190000000000000000000000000", + "isEnabled": true, + "rate": "13193600000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "177500000000000000000000000", + "isEnabled": true, + "rate": "12325600000000000000000" + }, + "out": { + "capacity": "220500000000000000000000000", + "isEnabled": true, + "rate": "15311520000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "176000000000000000000000000", + "isEnabled": true, + "rate": "12221440000000000000000" + }, + "out": { + "capacity": "253000000000000000000000000", + "isEnabled": true, + "rate": "17568320000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "216500000000000000000000000", + "isEnabled": true, + "rate": "15033760000000000000000" + }, + "out": { + "capacity": "322500000000000000000000000", + "isEnabled": true, + "rate": "22394400000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "199500000000000000000000000", + "isEnabled": true, + "rate": "13853280000000000000000" + }, + "out": { + "capacity": "193000000000000000000000000", + "isEnabled": true, + "rate": "13401920000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "302000000000000000000000000", + "isEnabled": true, + "rate": "20970880000000000000000" + }, + "out": { + "capacity": "238000000000000000000000000", + "isEnabled": true, + "rate": "16526720000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "198500000000000000000000000", + "isEnabled": true, + "rate": "13783840000000000000000" + }, + "out": { + "capacity": "211500000000000000000000000", + "isEnabled": true, + "rate": "14686560000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": null, + "standard": null + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "168000000000000000000000000", + "isEnabled": true, + "rate": "11665920000000000000000" + }, + "out": { + "capacity": "167000000000000000000000000", + "isEnabled": true, + "rate": "11596480000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "204000000000000000000000000", + "isEnabled": true, + "rate": "14165760000000000000000" + }, + "out": { + "capacity": "253000000000000000000000000", + "isEnabled": true, + "rate": "17568320000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "254500000000000000000000000", + "isEnabled": true, + "rate": "17672480000000000000000" + }, + "out": { + "capacity": "168000000000000000000000000", + "isEnabled": true, + "rate": "11665920000000000000000" + } + }, + "standard": { + "in": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + }, + "out": { + "capacity": "500000000000000000000000000", + "isEnabled": true, + "rate": "34720000000000000000000" + } + } + } + } + } + }, + "WETH": { + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "12366000000000000000", + "isEnabled": true, + "rate": "3435000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "18000000000000000000", + "isEnabled": true, + "rate": "5000000000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "36481500000000000000", + "isEnabled": true, + "rate": "10133748660000000" + }, + "out": { + "capacity": "28314000000000000000", + "isEnabled": true, + "rate": "7864998960000000" + } + }, + "standard": { + "in": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "52635000000000000000", + "isEnabled": true, + "rate": "14620831400000000" + }, + "out": { + "capacity": "47825250000000000000", + "isEnabled": true, + "rate": "13284789910000000" + } + }, + "standard": { + "in": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "31458960000000000000", + "isEnabled": true, + "rate": "8738599999999999" + }, + "out": { + "capacity": "60076500000000000000", + "isEnabled": true, + "rate": "16687916666666666" + } + }, + "standard": { + "in": { + "capacity": "100830000000000000000", + "isEnabled": true, + "rate": "28008333333333333" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208333333333333" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "47280750000000000000", + "isEnabled": true, + "rate": "13133539930000000" + }, + "out": { + "capacity": "43923000000000000000", + "isEnabled": true, + "rate": "12200831720000000" + } + }, + "standard": { + "in": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "37389000000000000000", + "isEnabled": true, + "rate": "10385831960000000" + }, + "out": { + "capacity": "30764250000000000000", + "isEnabled": true, + "rate": "8545623870000000" + } + }, + "standard": { + "in": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "58481400000000000000", + "isEnabled": true, + "rate": "16244833333333333" + }, + "out": { + "capacity": "60984000000000000000", + "isEnabled": true, + "rate": "16939999999999999" + } + }, + "standard": { + "in": { + "capacity": "100830000000000000000", + "isEnabled": true, + "rate": "28008333333333333" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208333333333333" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "13453200000000000000", + "isEnabled": true, + "rate": "3737000000000000" + }, + "out": { + "capacity": "9120000000000000000", + "isEnabled": true, + "rate": "2533333333333333" + } + }, + "standard": { + "in": { + "capacity": "33300000000000000000", + "isEnabled": true, + "rate": "9250000000000000" + }, + "out": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "8333333333333333" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "61528500000000000000", + "isEnabled": true, + "rate": "17091247740000000" + }, + "out": { + "capacity": "47825250000000000000", + "isEnabled": true, + "rate": "13284789910000000" + } + }, + "standard": { + "in": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "57263250000000000000", + "isEnabled": true, + "rate": "15906456230000000" + }, + "out": { + "capacity": "36753750000000000000", + "isEnabled": true, + "rate": "10209373650000000" + } + }, + "standard": { + "in": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208330000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "31458960000000000000", + "isEnabled": true, + "rate": "8738599999999999" + }, + "out": { + "capacity": "57807750000000000000", + "isEnabled": true, + "rate": "16057708333333333" + } + }, + "standard": { + "in": { + "capacity": "100830000000000000000", + "isEnabled": true, + "rate": "28008333333333333" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208333333333333" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "36252000000000000000", + "isEnabled": true, + "rate": "10176000000000000" + }, + "out": { + "capacity": "38760000000000000000", + "isEnabled": true, + "rate": "10880000000000000" + } + }, + "standard": { + "in": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + }, + "out": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "40634490000000000000", + "isEnabled": true, + "rate": "11287358333333333" + }, + "out": { + "capacity": "33033000000000000000", + "isEnabled": true, + "rate": "9175833333333333" + } + }, + "standard": { + "in": { + "capacity": "100830000000000000000", + "isEnabled": true, + "rate": "28008333333333333" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208333333333333" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "35290500000000000000", + "isEnabled": true, + "rate": "9802916666666666" + }, + "out": { + "capacity": "40928250000000000000", + "isEnabled": true, + "rate": "11368958333333333" + } + }, + "standard": { + "in": { + "capacity": "100830000000000000000", + "isEnabled": true, + "rate": "28008333333333333" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208333333333333" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "17582400000000000000", + "isEnabled": true, + "rate": "4884000000000000" + }, + "out": { + "capacity": "17940000000000000000", + "isEnabled": true, + "rate": "4983333333333333" + } + }, + "standard": { + "in": { + "capacity": "33300000000000000000", + "isEnabled": true, + "rate": "9250000000000000" + }, + "out": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "8333333333333333" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "59792190000000000000", + "isEnabled": true, + "rate": "16608941666666666" + }, + "out": { + "capacity": "39476250000000000000", + "isEnabled": true, + "rate": "10965624999999999" + } + }, + "standard": { + "in": { + "capacity": "100830000000000000000", + "isEnabled": true, + "rate": "28008333333333333" + }, + "out": { + "capacity": "90750000000000000000", + "isEnabled": true, + "rate": "25208333333333333" + } + } + }, + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WFRAGSOL": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "1000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WHLP": { + "hyperliquid-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WHSK": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-hashkey-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-hashkey-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-hashkey-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WHY": { + "bsc-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WLD": { + "ethereum-mainnet-worldchain-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "36900000000000000000000", + "isEnabled": true, + "rate": "10249971300000000000" + }, + "out": { + "capacity": "67900000000000000000000", + "isEnabled": true, + "rate": "18861058300000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27777700000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-worldchain-1": { + "custom": { + "in": { + "capacity": "50900000000000000000000", + "isEnabled": true, + "rate": "14138849300000000000" + }, + "out": { + "capacity": "67300000000000000000000", + "isEnabled": true, + "rate": "18694392100000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27777700000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "27777700000000000000" + } + } + } + } + } + }, + "WLFI": { + "bsc-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WMTX": { + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "602000000000", + "isEnabled": true, + "rate": "167217540" + }, + "out": { + "capacity": "532000000000", + "isEnabled": true, + "rate": "147773640" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1865000000000", + "isEnabled": true, + "rate": "86349500" + }, + "out": { + "capacity": "3305000000000", + "isEnabled": true, + "rate": "153021500" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "561000000000", + "isEnabled": true, + "rate": "155828970" + }, + "out": { + "capacity": "560000000000", + "isEnabled": true, + "rate": "155551200" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "499000000000", + "isEnabled": true, + "rate": "138607230" + }, + "out": { + "capacity": "349000000000", + "isEnabled": true, + "rate": "96941730" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "617000000000", + "isEnabled": true, + "rate": "171384090" + }, + "out": { + "capacity": "382000000000", + "isEnabled": true, + "rate": "106108140" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "3255000000000", + "isEnabled": true, + "rate": "150706500" + }, + "out": { + "capacity": "2795000000000", + "isEnabled": true, + "rate": "129408500" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "353000000000", + "isEnabled": true, + "rate": "98052810" + }, + "out": { + "capacity": "324000000000", + "isEnabled": true, + "rate": "89997480" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "494000000000", + "isEnabled": true, + "rate": "137218380" + }, + "out": { + "capacity": "529000000000", + "isEnabled": true, + "rate": "146940330" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "384000000000", + "isEnabled": true, + "rate": "106663680" + }, + "out": { + "capacity": "368000000000", + "isEnabled": true, + "rate": "102219360" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "351000000000", + "isEnabled": true, + "rate": "97497270" + }, + "out": { + "capacity": "497000000000", + "isEnabled": true, + "rate": "138051690" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "306000000000", + "isEnabled": true, + "rate": "84997620" + }, + "out": { + "capacity": "638000000000", + "isEnabled": true, + "rate": "177217260" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "2600000000000", + "isEnabled": true, + "rate": "120380000" + }, + "out": { + "capacity": "2820000000000", + "isEnabled": true, + "rate": "130566000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "2600000000000", + "isEnabled": true, + "rate": "120380000" + }, + "out": { + "capacity": "3420000000000", + "isEnabled": true, + "rate": "158346000" + } + }, + "standard": { + "in": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + }, + "out": { + "capacity": "5000000000000", + "isEnabled": true, + "rate": "231500000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "606000000000", + "isEnabled": true, + "rate": "168328620" + }, + "out": { + "capacity": "536000000000", + "isEnabled": true, + "rate": "148884720" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "681000000000", + "isEnabled": true, + "rate": "189161370" + }, + "out": { + "capacity": "666000000000", + "isEnabled": true, + "rate": "184994820" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "533000000000", + "isEnabled": true, + "rate": "148051410" + }, + "out": { + "capacity": "626000000000", + "isEnabled": true, + "rate": "173884020" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "501000000000", + "isEnabled": true, + "rate": "139162770" + }, + "out": { + "capacity": "581000000000", + "isEnabled": true, + "rate": "161384370" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "567000000000", + "isEnabled": true, + "rate": "157495590" + }, + "out": { + "capacity": "484000000000", + "isEnabled": true, + "rate": "134440680" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "382000000000", + "isEnabled": true, + "rate": "106108140" + }, + "out": { + "capacity": "495000000000", + "isEnabled": true, + "rate": "137496150" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "277770000" + } + } + } + } + } + }, + "wOETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "70566000000000000000", + "isEnabled": true, + "rate": "19808000000000000" + }, + "out": { + "capacity": "78774000000000000000", + "isEnabled": true, + "rate": "22112000000000000" + } + }, + "standard": { + "in": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + }, + "out": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "924000000000000000000", + "isEnabled": true, + "rate": "256872000000000000" + }, + "out": { + "capacity": "825000000000000000000", + "isEnabled": true, + "rate": "229350000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000", + "isEnabled": true, + "rate": "417000000000000000" + }, + "out": { + "capacity": "1500000000000000000000", + "isEnabled": true, + "rate": "417000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "77178000000000000000", + "isEnabled": true, + "rate": "21664000000000000" + }, + "out": { + "capacity": "39102000000000000000", + "isEnabled": true, + "rate": "10976000000000000" + } + }, + "standard": { + "in": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + }, + "out": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "400000000000000000000", + "isEnabled": true, + "rate": "111120000000000000" + }, + "out": { + "capacity": "682000000000000000000", + "isEnabled": true, + "rate": "189459600000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "277800000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "277800000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "493500000000000000000", + "isEnabled": true, + "rate": "137193000000000000" + }, + "out": { + "capacity": "484500000000000000000", + "isEnabled": true, + "rate": "134691000000000000" + } + }, + "standard": { + "in": { + "capacity": "1500000000000000000000", + "isEnabled": true, + "rate": "417000000000000000" + }, + "out": { + "capacity": "1500000000000000000000", + "isEnabled": true, + "rate": "417000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "414000000000000000000", + "isEnabled": true, + "rate": "115009200000000000" + }, + "out": { + "capacity": "671000000000000000000", + "isEnabled": true, + "rate": "186403800000000000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "277800000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "277800000000000000" + } + } + } + } + } + }, + "WOLF": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WOW": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "shibarium-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "shibarium-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "WSDM": { + "bsc-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "657000000000", + "isEnabled": true, + "rate": "7884000" + }, + "out": { + "capacity": "596000000000", + "isEnabled": true, + "rate": "7152000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "513000000000", + "isEnabled": true, + "rate": "6156000" + }, + "out": { + "capacity": "558000000000", + "isEnabled": true, + "rate": "6696000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "575000000000", + "isEnabled": true, + "rate": "6900000" + }, + "out": { + "capacity": "574000000000", + "isEnabled": true, + "rate": "6888000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "305000000000", + "isEnabled": true, + "rate": "3660000" + }, + "out": { + "capacity": "406000000000", + "isEnabled": true, + "rate": "4872000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "522000000000", + "isEnabled": true, + "rate": "6264000" + }, + "out": { + "capacity": "386000000000", + "isEnabled": true, + "rate": "4632000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "500000000000", + "isEnabled": true, + "rate": "6000000" + }, + "out": { + "capacity": "527000000000", + "isEnabled": true, + "rate": "6324000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "598000000000", + "isEnabled": true, + "rate": "7176000" + }, + "out": { + "capacity": "459000000000", + "isEnabled": true, + "rate": "5508000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "674000000000", + "isEnabled": true, + "rate": "8088000" + }, + "out": { + "capacity": "364000000000", + "isEnabled": true, + "rate": "4368000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "485000000000", + "isEnabled": true, + "rate": "5820000" + }, + "out": { + "capacity": "380000000000", + "isEnabled": true, + "rate": "4560000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "315000000000", + "isEnabled": true, + "rate": "3780000" + }, + "out": { + "capacity": "578000000000", + "isEnabled": true, + "rate": "6936000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "474000000000", + "isEnabled": true, + "rate": "5688000" + }, + "out": { + "capacity": "300000000000", + "isEnabled": true, + "rate": "3600000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "394000000000", + "isEnabled": true, + "rate": "4728000" + }, + "out": { + "capacity": "362000000000", + "isEnabled": true, + "rate": "4344000" + } + }, + "standard": { + "in": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + }, + "out": { + "capacity": "1000000000000", + "isEnabled": true, + "rate": "12000000" + } + } + } + } + } + }, + "wstETH": { + "0g-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "71706000000000000000", + "isEnabled": true, + "rate": "20128000000000000" + }, + "out": { + "capacity": "56202000000000000000", + "isEnabled": true, + "rate": "15776000000000000" + } + }, + "standard": { + "in": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + }, + "out": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + } + } + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "12366000000000000000", + "isEnabled": true, + "rate": "3435000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "18000000000000000000", + "isEnabled": true, + "rate": "5000000000000000" + } + } + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 4, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1296000000000000000000", + "isEnabled": true, + "rate": "14999999994720000" + }, + "out": { + "capacity": "742000000000000000000", + "isEnabled": true, + "rate": "8587962959940000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "1342000000000000000000", + "isEnabled": true, + "rate": "15532407401940000" + }, + "out": { + "capacity": "614000000000000000000", + "isEnabled": true, + "rate": "7106481478980000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "946000000000000000000", + "isEnabled": true, + "rate": "10949074070220000" + }, + "out": { + "capacity": "1282000000000000000000", + "isEnabled": true, + "rate": "14837962957740000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "0g-mainnet": { + "custom": null, + "standard": null + }, + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "67944000000000000000", + "isEnabled": true, + "rate": "19072000000000000" + }, + "out": { + "capacity": "75354000000000000000", + "isEnabled": true, + "rate": "21152000000000000" + } + }, + "standard": { + "in": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + }, + "out": { + "capacity": "114000000000000000000", + "isEnabled": true, + "rate": "32000000000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "950000000000000000000", + "isEnabled": true, + "rate": "10995370366500000" + }, + "out": { + "capacity": "730000000000000000000", + "isEnabled": true, + "rate": "8449074071100000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "678000000000000000000", + "isEnabled": true, + "rate": "7847222219460000" + }, + "out": { + "capacity": "806000000000000000000", + "isEnabled": true, + "rate": "9328703700420000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "658000000000000000000", + "isEnabled": true, + "rate": "7615740738060000" + }, + "out": { + "capacity": "1274000000000000000000", + "isEnabled": true, + "rate": "14745370365180000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + } + } + }, + "monad-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1234000000000000000000", + "isEnabled": true, + "rate": "14282407402380000" + }, + "out": { + "capacity": "664000000000000000000", + "isEnabled": true, + "rate": "7685185182480000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1268000000000000000000", + "isEnabled": true, + "rate": "14675925920760000" + }, + "out": { + "capacity": "1256000000000000000000", + "isEnabled": true, + "rate": "14537037031920000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "892000000000000000000", + "isEnabled": true, + "rate": "10324074070440000" + }, + "out": { + "capacity": "1292000000000000000000", + "isEnabled": true, + "rate": "14953703698440000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-ink-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "11574074070000000" + }, + "out": { + "capacity": "1124000000000000000000", + "isEnabled": true, + "rate": "13009259254680000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + }, + "monad-mainnet": { + "custom": { + "in": { + "capacity": "1244000000000000000000", + "isEnabled": true, + "rate": "14398148143080000" + }, + "out": { + "capacity": "634000000000000000000", + "isEnabled": true, + "rate": "7337962960380000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + }, + "out": { + "capacity": "2000000000000000000000", + "isEnabled": true, + "rate": "23148148140000000" + } + } + } + } + } + }, + "wstLINK": { + "avalanche-mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "9795000000000000000000", + "isEnabled": true, + "rate": "2612000000000000000" + }, + "out": { + "capacity": "7230000000000000000000", + "isEnabled": true, + "rate": "1928000000000000000" + } + }, + "standard": { + "in": { + "capacity": "15000000000000000000000", + "isEnabled": true, + "rate": "4000000000000000000" + }, + "out": { + "capacity": "15000000000000000000000", + "isEnabled": true, + "rate": "4000000000000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "5805000000000000000000", + "isEnabled": true, + "rate": "1548000000000000000" + }, + "out": { + "capacity": "10245000000000000000000", + "isEnabled": true, + "rate": "2732000000000000000" + } + }, + "standard": { + "in": { + "capacity": "15000000000000000000000", + "isEnabled": true, + "rate": "4000000000000000000" + }, + "out": { + "capacity": "15000000000000000000000", + "isEnabled": true, + "rate": "4000000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "wstPOL": { + "avalanche-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "wUSDx": { + "bsc-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "228830000000", + "isEnabled": true, + "rate": "63563837" + }, + "out": { + "capacity": "314580000000", + "isEnabled": true, + "rate": "87383262" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "185710000000", + "isEnabled": true, + "rate": "51586069" + }, + "out": { + "capacity": "327320000000", + "isEnabled": true, + "rate": "90922148" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "231280000000", + "isEnabled": true, + "rate": "64244392" + }, + "out": { + "capacity": "265580000000", + "isEnabled": true, + "rate": "73772162" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "237650000000", + "isEnabled": true, + "rate": "66013835" + }, + "out": { + "capacity": "249900000000", + "isEnabled": true, + "rate": "69416610" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "315070000000", + "isEnabled": true, + "rate": "87519373" + }, + "out": { + "capacity": "215110000000", + "isEnabled": true, + "rate": "59752729" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "294980000000", + "isEnabled": true, + "rate": "81938822" + }, + "out": { + "capacity": "187180000000", + "isEnabled": true, + "rate": "51994402" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "299390000000", + "isEnabled": true, + "rate": "83163821" + }, + "out": { + "capacity": "193060000000", + "isEnabled": true, + "rate": "53627734" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "289590000000", + "isEnabled": true, + "rate": "80441601" + }, + "out": { + "capacity": "331730000000", + "isEnabled": true, + "rate": "92147147" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "189630000000", + "isEnabled": true, + "rate": "52674957" + }, + "out": { + "capacity": "155330000000", + "isEnabled": true, + "rate": "43147187" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "248430000000", + "isEnabled": true, + "rate": "69008277" + }, + "out": { + "capacity": "154350000000", + "isEnabled": true, + "rate": "42874965" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "325360000000", + "isEnabled": true, + "rate": "90377704" + }, + "out": { + "capacity": "316540000000", + "isEnabled": true, + "rate": "87927706" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "165620000000", + "isEnabled": true, + "rate": "46005518" + }, + "out": { + "capacity": "161700000000", + "isEnabled": true, + "rate": "44916630" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "297920000000", + "isEnabled": true, + "rate": "82755488" + }, + "out": { + "capacity": "212660000000", + "isEnabled": true, + "rate": "59072174" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "261660000000", + "isEnabled": true, + "rate": "72683274" + }, + "out": { + "capacity": "246470000000", + "isEnabled": true, + "rate": "68463833" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "271460000000", + "isEnabled": true, + "rate": "75405494" + }, + "out": { + "capacity": "184240000000", + "isEnabled": true, + "rate": "51177736" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "267540000000", + "isEnabled": true, + "rate": "74316606" + }, + "out": { + "capacity": "317520000000", + "isEnabled": true, + "rate": "88199928" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "308210000000", + "isEnabled": true, + "rate": "85613819" + }, + "out": { + "capacity": "213150000000", + "isEnabled": true, + "rate": "59208285" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "171500000000", + "isEnabled": true, + "rate": "47638850" + }, + "out": { + "capacity": "318500000000", + "isEnabled": true, + "rate": "88472150" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + }, + "ethereum-mainnet-mode-1": { + "minBlockConfirmation": 7, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "202860000000", + "isEnabled": true, + "rate": "56349954" + }, + "out": { + "capacity": "197960000000", + "isEnabled": true, + "rate": "54988844" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "179340000000", + "isEnabled": true, + "rate": "49816626" + }, + "out": { + "capacity": "266560000000", + "isEnabled": true, + "rate": "74044384" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "182280000000", + "isEnabled": true, + "rate": "50633292" + }, + "out": { + "capacity": "218540000000", + "isEnabled": true, + "rate": "60705506" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "247450000000", + "isEnabled": true, + "rate": "68736055" + }, + "out": { + "capacity": "173950000000", + "isEnabled": true, + "rate": "48319405" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "247940000000", + "isEnabled": true, + "rate": "68872166" + }, + "out": { + "capacity": "163660000000", + "isEnabled": true, + "rate": "45461074" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "294980000000", + "isEnabled": true, + "rate": "81938822" + }, + "out": { + "capacity": "173950000000", + "isEnabled": true, + "rate": "48319405" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 5, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "282240000000", + "isEnabled": true, + "rate": "78399936" + }, + "out": { + "capacity": "239610000000", + "isEnabled": true, + "rate": "66558279" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "188160000000", + "isEnabled": true, + "rate": "52266624" + }, + "out": { + "capacity": "267540000000", + "isEnabled": true, + "rate": "74316606" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "235690000000", + "isEnabled": true, + "rate": "65469391" + }, + "out": { + "capacity": "174440000000", + "isEnabled": true, + "rate": "48455516" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "250880000000", + "isEnabled": true, + "rate": "69688832" + }, + "out": { + "capacity": "303310000000", + "isEnabled": true, + "rate": "84252709" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "269500000000", + "isEnabled": true, + "rate": "74861050" + }, + "out": { + "capacity": "281260000000", + "isEnabled": true, + "rate": "78127714" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "177870000000", + "isEnabled": true, + "rate": "49408293" + }, + "out": { + "capacity": "202860000000", + "isEnabled": true, + "rate": "56349954" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "181790000000", + "isEnabled": true, + "rate": "50497181" + }, + "out": { + "capacity": "338100000000", + "isEnabled": true, + "rate": "93916590" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "260680000000", + "isEnabled": true, + "rate": "72411052" + }, + "out": { + "capacity": "148960000000", + "isEnabled": true, + "rate": "41377744" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "254800000000", + "isEnabled": true, + "rate": "70777720" + }, + "out": { + "capacity": "186690000000", + "isEnabled": true, + "rate": "51858291" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "226870000000", + "isEnabled": true, + "rate": "63019393" + }, + "out": { + "capacity": "295960000000", + "isEnabled": true, + "rate": "82211044" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": null, + "standard": null + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "269010000000", + "isEnabled": true, + "rate": "74724939" + }, + "out": { + "capacity": "158760000000", + "isEnabled": true, + "rate": "44099964" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "325360000000", + "isEnabled": true, + "rate": "90377704" + }, + "out": { + "capacity": "295470000000", + "isEnabled": true, + "rate": "82074933" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "214130000000", + "isEnabled": true, + "rate": "59480507" + }, + "out": { + "capacity": "261660000000", + "isEnabled": true, + "rate": "72683274" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "248920000000", + "isEnabled": true, + "rate": "69144388" + }, + "out": { + "capacity": "184240000000", + "isEnabled": true, + "rate": "51177736" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-mode-1": { + "custom": { + "in": { + "capacity": "158760000000", + "isEnabled": true, + "rate": "44099964" + }, + "out": { + "capacity": "249900000000", + "isEnabled": true, + "rate": "69416610" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "303800000000", + "isEnabled": true, + "rate": "84388820" + }, + "out": { + "capacity": "246470000000", + "isEnabled": true, + "rate": "68463833" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "213640000000", + "isEnabled": true, + "rate": "59344396" + }, + "out": { + "capacity": "250390000000", + "isEnabled": true, + "rate": "69552721" + } + }, + "standard": { + "in": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + }, + "out": { + "capacity": "490000000000", + "isEnabled": true, + "rate": "136111000" + } + } + } + } + } + }, + "xGold": { + "bsc-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "hedera-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "hedera-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bsc-mainnet": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "XLAB": { + "bsc-mainnet": { + "minBlockConfirmation": 1, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "xrETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "xRPL": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "xSILO": { + "avalanche-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "xSolvBTC": { + "avalanche-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "950000000000000000", + "isEnabled": true, + "rate": "43981200000000" + }, + "out": { + "capacity": "1235000000000000000", + "isEnabled": true, + "rate": "57175560000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1335000000000000000", + "isEnabled": true, + "rate": "61805160000000" + }, + "out": { + "capacity": "1057500000000000000", + "isEnabled": true, + "rate": "48958020000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1537500000000000000", + "isEnabled": true, + "rate": "71180100000000" + }, + "out": { + "capacity": "1240000000000000000", + "isEnabled": true, + "rate": "57407040000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1167500000000000000", + "isEnabled": true, + "rate": "54050580000000" + }, + "out": { + "capacity": "1492500000000000000", + "isEnabled": true, + "rate": "69096780000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1460000000000000000", + "isEnabled": true, + "rate": "67592160000000" + }, + "out": { + "capacity": "1727500000000000000", + "isEnabled": true, + "rate": "79976340000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1317500000000000000", + "isEnabled": true, + "rate": "60994980000000" + }, + "out": { + "capacity": "885000000000000000", + "isEnabled": true, + "rate": "40971960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1457500000000000000", + "isEnabled": true, + "rate": "67476420000000" + }, + "out": { + "capacity": "885000000000000000", + "isEnabled": true, + "rate": "40971960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1130000000000000000", + "isEnabled": true, + "rate": "52314480000000" + }, + "out": { + "capacity": "800000000000000000", + "isEnabled": true, + "rate": "37036800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "berachain-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "857500000000000000", + "isEnabled": true, + "rate": "39698820000000" + }, + "out": { + "capacity": "1092500000000000000", + "isEnabled": true, + "rate": "50578380000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1650000000000000000", + "isEnabled": true, + "rate": "76388400000000" + }, + "out": { + "capacity": "1027500000000000000", + "isEnabled": true, + "rate": "47569140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "810000000000000000", + "isEnabled": true, + "rate": "37499760000000" + }, + "out": { + "capacity": "1267500000000000000", + "isEnabled": true, + "rate": "58680180000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bitcoin-mainnet-bob-1": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1297500000000000000", + "isEnabled": true, + "rate": "60069060000000" + }, + "out": { + "capacity": "960000000000000000", + "isEnabled": true, + "rate": "44444160000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "887500000000000000", + "isEnabled": true, + "rate": "41087700000000" + }, + "out": { + "capacity": "1027500000000000000", + "isEnabled": true, + "rate": "47569140000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "922500000000000000", + "isEnabled": true, + "rate": "42708060000000" + }, + "out": { + "capacity": "1150000000000000000", + "isEnabled": true, + "rate": "53240400000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "997500000000000000", + "isEnabled": true, + "rate": "46180260000000" + }, + "out": { + "capacity": "1552500000000000000", + "isEnabled": true, + "rate": "71874540000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "792500000000000000", + "isEnabled": true, + "rate": "36689580000000" + }, + "out": { + "capacity": "1035000000000000000", + "isEnabled": true, + "rate": "47916360000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1472500000000000000", + "isEnabled": true, + "rate": "68170860000000" + }, + "out": { + "capacity": "1395000000000000000", + "isEnabled": true, + "rate": "64582920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1672500000000000000", + "isEnabled": true, + "rate": "77430060000000" + }, + "out": { + "capacity": "857500000000000000", + "isEnabled": true, + "rate": "39698820000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1035000000000000000", + "isEnabled": true, + "rate": "47916360000000" + }, + "out": { + "capacity": "1187500000000000000", + "isEnabled": true, + "rate": "54976500000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "920000000000000000", + "isEnabled": true, + "rate": "42592320000000" + }, + "out": { + "capacity": "1522500000000000000", + "isEnabled": true, + "rate": "70485660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1102500000000000000", + "isEnabled": true, + "rate": "51041340000000" + }, + "out": { + "capacity": "1515000000000000000", + "isEnabled": true, + "rate": "70138440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1072500000000000000", + "isEnabled": true, + "rate": "49652460000000" + }, + "out": { + "capacity": "917500000000000000", + "isEnabled": true, + "rate": "42476580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1007500000000000000", + "isEnabled": true, + "rate": "46643220000000" + }, + "out": { + "capacity": "937500000000000000", + "isEnabled": true, + "rate": "43402500000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "910000000000000000", + "isEnabled": true, + "rate": "42129360000000" + }, + "out": { + "capacity": "1447500000000000000", + "isEnabled": true, + "rate": "67013460000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "berachain-mainnet": { + "custom": null, + "standard": null + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "790000000000000000", + "isEnabled": true, + "rate": "36573840000000" + }, + "out": { + "capacity": "880000000000000000", + "isEnabled": true, + "rate": "40740480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "872500000000000000", + "isEnabled": true, + "rate": "40393260000000" + }, + "out": { + "capacity": "1317500000000000000", + "isEnabled": true, + "rate": "60994980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1005000000000000000", + "isEnabled": true, + "rate": "46527480000000" + }, + "out": { + "capacity": "1310000000000000000", + "isEnabled": true, + "rate": "60647760000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "865000000000000000", + "isEnabled": true, + "rate": "40046040000000" + }, + "out": { + "capacity": "1645000000000000000", + "isEnabled": true, + "rate": "76156920000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1087500000000000000", + "isEnabled": true, + "rate": "50346900000000" + }, + "out": { + "capacity": "1432500000000000000", + "isEnabled": true, + "rate": "66319020000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1220000000000000000", + "isEnabled": true, + "rate": "56481120000000" + }, + "out": { + "capacity": "1592500000000000000", + "isEnabled": true, + "rate": "73726380000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1337500000000000000", + "isEnabled": true, + "rate": "61920900000000" + }, + "out": { + "capacity": "1622500000000000000", + "isEnabled": true, + "rate": "75115260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "770000000000000000", + "isEnabled": true, + "rate": "35647920000000" + }, + "out": { + "capacity": "750000000000000000", + "isEnabled": true, + "rate": "34722000000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1147500000000000000", + "isEnabled": true, + "rate": "53124660000000" + }, + "out": { + "capacity": "1625000000000000000", + "isEnabled": true, + "rate": "75231000000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "109250000", + "isEnabled": true, + "rate": "5057" + }, + "out": { + "capacity": "1305000000000000000", + "isEnabled": true, + "rate": "60416280000000" + } + }, + "standard": { + "in": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1307500000000000000", + "isEnabled": true, + "rate": "60532020000000" + }, + "out": { + "capacity": "792500000000000000", + "isEnabled": true, + "rate": "36689580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": null, + "standard": null + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1365000000000000000", + "isEnabled": true, + "rate": "63194040000000" + }, + "out": { + "capacity": "1002500000000000000", + "isEnabled": true, + "rate": "46411740000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "795000000000000000", + "isEnabled": true, + "rate": "36805320000000" + }, + "out": { + "capacity": "1267500000000000000", + "isEnabled": true, + "rate": "58680180000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1487500000000000000", + "isEnabled": true, + "rate": "68865300000000" + }, + "out": { + "capacity": "1200000000000000000", + "isEnabled": true, + "rate": "55555200000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1150000000000000000", + "isEnabled": true, + "rate": "53240400000000" + }, + "out": { + "capacity": "1192500000000000000", + "isEnabled": true, + "rate": "55207980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": null, + "standard": null + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 3, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1677500000000000000", + "isEnabled": true, + "rate": "77661540000000" + }, + "out": { + "capacity": "1550000000000000000", + "isEnabled": true, + "rate": "71758800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "752500000000000000", + "isEnabled": true, + "rate": "34837740000000" + }, + "out": { + "capacity": "850000000000000000", + "isEnabled": true, + "rate": "39351600000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "772500000000000000", + "isEnabled": true, + "rate": "35763660000000" + }, + "out": { + "capacity": "1375000000000000000", + "isEnabled": true, + "rate": "63657000000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1050000000000000000", + "isEnabled": true, + "rate": "48610800000000" + }, + "out": { + "capacity": "1452500000000000000", + "isEnabled": true, + "rate": "67244940000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1010000000000000000", + "isEnabled": true, + "rate": "46758960000000" + }, + "out": { + "capacity": "800000000000000000", + "isEnabled": true, + "rate": "37036800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1725000000000000000", + "isEnabled": true, + "rate": "79860600000000" + }, + "out": { + "capacity": "1552500000000000000", + "isEnabled": true, + "rate": "71874540000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1297500000000000000", + "isEnabled": true, + "rate": "60069060000000" + }, + "out": { + "capacity": "1255000000000000000", + "isEnabled": true, + "rate": "58101480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "982500000000000000", + "isEnabled": true, + "rate": "45485820000000" + }, + "out": { + "capacity": "1667500000000000000", + "isEnabled": true, + "rate": "77198580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "997500000000000000", + "isEnabled": true, + "rate": "46180260000000" + }, + "out": { + "capacity": "1352500000000000000", + "isEnabled": true, + "rate": "62615340000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1600000000000000000", + "isEnabled": true, + "rate": "74073600000000" + }, + "out": { + "capacity": "1220000000000000000", + "isEnabled": true, + "rate": "56481120000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1080000000000000000", + "isEnabled": true, + "rate": "49999680000000" + }, + "out": { + "capacity": "1417500000000000000", + "isEnabled": true, + "rate": "65624580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1620000000000000000", + "isEnabled": true, + "rate": "74999520000000" + }, + "out": { + "capacity": "1215000000000000000", + "isEnabled": true, + "rate": "56249640000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1397500000000000000", + "isEnabled": true, + "rate": "64698660000000" + }, + "out": { + "capacity": "1175000000000000000", + "isEnabled": true, + "rate": "54397800000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1145000000000000000", + "isEnabled": true, + "rate": "53008920000000" + }, + "out": { + "capacity": "860000000000000000", + "isEnabled": true, + "rate": "39814560000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1350000000000000000", + "isEnabled": true, + "rate": "62499600000000" + }, + "out": { + "capacity": "1137500000000000000", + "isEnabled": true, + "rate": "52661700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1527500000000000000", + "isEnabled": true, + "rate": "70717140000000" + }, + "out": { + "capacity": "775000000000000000", + "isEnabled": true, + "rate": "35879400000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1440000000000000000", + "isEnabled": true, + "rate": "66666240000000" + }, + "out": { + "capacity": "1505000000000000000", + "isEnabled": true, + "rate": "69675480000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1117500000000000000", + "isEnabled": true, + "rate": "51735780000000" + }, + "out": { + "capacity": "1362500000000000000", + "isEnabled": true, + "rate": "63078300000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1337500000000000000", + "isEnabled": true, + "rate": "61920900000000" + }, + "out": { + "capacity": "1127500000000000000", + "isEnabled": true, + "rate": "52198740000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-linea-1": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1607500000000000000", + "isEnabled": true, + "rate": "74420820000000" + }, + "out": { + "capacity": "1747500000000000000", + "isEnabled": true, + "rate": "80902260000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1685000000000000000", + "isEnabled": true, + "rate": "78008760000000" + }, + "out": { + "capacity": "885000000000000000", + "isEnabled": true, + "rate": "40971960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1625000000000000000", + "isEnabled": true, + "rate": "75231000000000" + }, + "out": { + "capacity": "765000000000000000", + "isEnabled": true, + "rate": "35416440000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "837500000000000000", + "isEnabled": true, + "rate": "38772900000000" + }, + "out": { + "capacity": "1442500000000000000", + "isEnabled": true, + "rate": "66781980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1335000000000000000", + "isEnabled": true, + "rate": "61805160000000" + }, + "out": { + "capacity": "767500000000000000", + "isEnabled": true, + "rate": "35532180000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1262500000000000000", + "isEnabled": true, + "rate": "58448700000000" + }, + "out": { + "capacity": "915000000000000000", + "isEnabled": true, + "rate": "42360840000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1127500000000000000", + "isEnabled": true, + "rate": "52198740000000" + }, + "out": { + "capacity": "1712500000000000000", + "isEnabled": true, + "rate": "79281900000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1747500000000000000", + "isEnabled": true, + "rate": "80902260000000" + }, + "out": { + "capacity": "1512500000000000000", + "isEnabled": true, + "rate": "70022700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-taiko-1": { + "minBlockConfirmation": 1, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1387500000000000000", + "isEnabled": true, + "rate": "64235700000000" + }, + "out": { + "capacity": "1557500000000000000", + "isEnabled": true, + "rate": "72106020000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "ethereum-mainnet-zksync-1": { + "minBlockConfirmation": 3, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1140000000000000000", + "isEnabled": true, + "rate": "52777440000000" + }, + "out": { + "capacity": "1472500000000000000", + "isEnabled": true, + "rate": "68170860000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "752500000000000000", + "isEnabled": true, + "rate": "34837740000000" + }, + "out": { + "capacity": "775000000000000000", + "isEnabled": true, + "rate": "35879400000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "63600000000000000000", + "isEnabled": true, + "rate": "736064000000000" + }, + "out": { + "capacity": "1580000000000000000", + "isEnabled": true, + "rate": "73147680000000" + } + }, + "standard": { + "in": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1736000000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1327500000000000000", + "isEnabled": true, + "rate": "61457940000000" + }, + "out": { + "capacity": "1260000000000000000", + "isEnabled": true, + "rate": "58332960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "hyperliquid-mainnet": { + "minBlockConfirmation": 4, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1080000000000000000", + "isEnabled": true, + "rate": "49999680000000" + }, + "out": { + "capacity": "1510000000000000000", + "isEnabled": true, + "rate": "69906960000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1032500000000000000", + "isEnabled": true, + "rate": "47800620000000" + }, + "out": { + "capacity": "865000000000000000", + "isEnabled": true, + "rate": "40046040000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "1690000000000000000", + "isEnabled": true, + "rate": "78240240000000" + }, + "out": { + "capacity": "1535000000000000000", + "isEnabled": true, + "rate": "71064360000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "berachain-mainnet": { + "custom": { + "in": { + "capacity": "1147500000000000000", + "isEnabled": true, + "rate": "53124660000000" + }, + "out": { + "capacity": "1137500000000000000", + "isEnabled": true, + "rate": "52661700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1620000000000000000", + "isEnabled": true, + "rate": "74999520000000" + }, + "out": { + "capacity": "1117500000000000000", + "isEnabled": true, + "rate": "51735780000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1107500000000000000", + "isEnabled": true, + "rate": "51272820000000" + }, + "out": { + "capacity": "1365000000000000000", + "isEnabled": true, + "rate": "63194040000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1390000000000000000", + "isEnabled": true, + "rate": "64351440000000" + }, + "out": { + "capacity": "1522500000000000000", + "isEnabled": true, + "rate": "70485660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1672500000000000000", + "isEnabled": true, + "rate": "77430060000000" + }, + "out": { + "capacity": "1412500000000000000", + "isEnabled": true, + "rate": "65393100000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": null, + "standard": null + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1617500000000000000", + "isEnabled": true, + "rate": "74883780000000" + }, + "out": { + "capacity": "812500000000000000", + "isEnabled": true, + "rate": "37615500000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-taiko-1": { + "custom": { + "in": { + "capacity": "1472500000000000000", + "isEnabled": true, + "rate": "68170860000000" + }, + "out": { + "capacity": "1290000000000000000", + "isEnabled": true, + "rate": "59721840000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1465000000000000000", + "isEnabled": true, + "rate": "67823640000000" + }, + "out": { + "capacity": "92700000000000000000", + "isEnabled": true, + "rate": "1072848000000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "150000000000000000000", + "isEnabled": true, + "rate": "1736000000000000" + } + } + }, + "hyperliquid-mainnet": { + "custom": { + "in": { + "capacity": "1050000000000000000", + "isEnabled": true, + "rate": "48610800000000" + }, + "out": { + "capacity": "1465000000000000000", + "isEnabled": true, + "rate": "67823640000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1332500000000000000", + "isEnabled": true, + "rate": "61689420000000" + }, + "out": { + "capacity": "1422500000000000000", + "isEnabled": true, + "rate": "65856060000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "monad-mainnet": { + "custom": null, + "standard": null + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1675000000000000000", + "isEnabled": true, + "rate": "77545800000000" + }, + "out": { + "capacity": "1730000000000000000", + "isEnabled": true, + "rate": "80092080000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "138750000", + "isEnabled": true, + "rate": "6423" + }, + "out": { + "capacity": "980000000000000000", + "isEnabled": true, + "rate": "45370080000000" + } + }, + "standard": { + "in": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "922500000000000000", + "isEnabled": true, + "rate": "42708060000000" + }, + "out": { + "capacity": "26220000000000000000", + "isEnabled": true, + "rate": "303470280000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "60000000000000000000", + "isEnabled": true, + "rate": "694440000000000" + } + } + }, + "sonic-mainnet": { + "custom": null, + "standard": null + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "957500000000000000", + "isEnabled": true, + "rate": "44328420000000" + }, + "out": { + "capacity": "1535000000000000000", + "isEnabled": true, + "rate": "71064360000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bitcoin-mainnet-bob-1": { + "custom": null, + "standard": null + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1417500000000000000", + "isEnabled": true, + "rate": "65624580000000" + }, + "out": { + "capacity": "862500000000000000", + "isEnabled": true, + "rate": "39930300000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1370000000000000000", + "isEnabled": true, + "rate": "63425520000000" + }, + "out": { + "capacity": "1042500000000000000", + "isEnabled": true, + "rate": "48263580000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "862500000000000000", + "isEnabled": true, + "rate": "39930300000000" + }, + "out": { + "capacity": "1192500000000000000", + "isEnabled": true, + "rate": "55207980000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1162500000000000000", + "isEnabled": true, + "rate": "53819100000000" + }, + "out": { + "capacity": "1170000000000000000", + "isEnabled": true, + "rate": "54166320000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-linea-1": { + "custom": { + "in": { + "capacity": "1560000000000000000", + "isEnabled": true, + "rate": "72221760000000" + }, + "out": { + "capacity": "1220000000000000000", + "isEnabled": true, + "rate": "56481120000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-zksync-1": { + "custom": { + "in": { + "capacity": "1295000000000000000", + "isEnabled": true, + "rate": "59953320000000" + }, + "out": { + "capacity": "1357500000000000000", + "isEnabled": true, + "rate": "62846820000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1120000000000000000", + "isEnabled": true, + "rate": "51851520000000" + }, + "out": { + "capacity": "1160000000000000000", + "isEnabled": true, + "rate": "53703360000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "sei-mainnet": { + "custom": { + "in": { + "capacity": "1127500000000000000", + "isEnabled": true, + "rate": "52198740000000" + }, + "out": { + "capacity": "772500000000000000", + "isEnabled": true, + "rate": "35763660000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "soneium-mainnet": { + "custom": { + "in": { + "capacity": "1217500000000000000", + "isEnabled": true, + "rate": "56365380000000" + }, + "out": { + "capacity": "807500000000000000", + "isEnabled": true, + "rate": "37384020000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "monad-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "10110000000000000000", + "isEnabled": true, + "rate": "117013140000000" + }, + "out": { + "capacity": "1610000000000000000", + "isEnabled": true, + "rate": "18634140000000" + } + }, + "standard": { + "in": { + "capacity": "30000000000000000000", + "isEnabled": true, + "rate": "347220000000000" + }, + "out": { + "capacity": "5000000000000000000", + "isEnabled": true, + "rate": "57870000000000" + } + } + } + } + }, + "sei-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "1555000000000000000", + "isEnabled": true, + "rate": "71990280000000" + }, + "out": { + "capacity": "1660000000000000000", + "isEnabled": true, + "rate": "76851360000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "1312500000000000000", + "isEnabled": true, + "rate": "60763500000000" + }, + "out": { + "capacity": "1197500000000000000", + "isEnabled": true, + "rate": "55439460000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "1567500000000000000", + "isEnabled": true, + "rate": "72568980000000" + }, + "out": { + "capacity": "1120000000000000000", + "isEnabled": true, + "rate": "51851520000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1722500000000000000", + "isEnabled": true, + "rate": "79744860000000" + }, + "out": { + "capacity": "985000000000000000", + "isEnabled": true, + "rate": "45601560000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1597500000000000000", + "isEnabled": true, + "rate": "73957860000000" + }, + "out": { + "capacity": "1420000000000000000", + "isEnabled": true, + "rate": "65740320000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "153250000", + "isEnabled": true, + "rate": "7094" + }, + "out": { + "capacity": "155750000", + "isEnabled": true, + "rate": "7210" + } + }, + "standard": { + "in": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "152500000", + "isEnabled": true, + "rate": "7060" + }, + "out": { + "capacity": "169000000", + "isEnabled": true, + "rate": "7824" + } + }, + "standard": { + "in": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "250000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "soneium-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "bitcoin-mainnet-bob-1": { + "custom": { + "in": { + "capacity": "890000000000000000", + "isEnabled": true, + "rate": "41203440000000" + }, + "out": { + "capacity": "1617500000000000000", + "isEnabled": true, + "rate": "74883780000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "942500000000000000", + "isEnabled": true, + "rate": "43633980000000" + }, + "out": { + "capacity": "1677500000000000000", + "isEnabled": true, + "rate": "77661540000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "22980000000000000000", + "isEnabled": true, + "rate": "265970520000000" + }, + "out": { + "capacity": "1057500000000000000", + "isEnabled": true, + "rate": "48958020000000" + } + }, + "standard": { + "in": { + "capacity": "60000000000000000000", + "isEnabled": true, + "rate": "694440000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1702500000000000000", + "isEnabled": true, + "rate": "78818940000000" + }, + "out": { + "capacity": "1387500000000000000", + "isEnabled": true, + "rate": "64235700000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1150000000000000000", + "isEnabled": true, + "rate": "53240400000000" + }, + "out": { + "capacity": "1580000000000000000", + "isEnabled": true, + "rate": "73147680000000" + } + }, + "standard": { + "in": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + }, + "out": { + "capacity": "2500000000000000000", + "isEnabled": true, + "rate": "115740000000000" + } + } + } + } + } + }, + "XSWAP": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "12120000000000000000000000", + "isEnabled": true, + "rate": "280578000000000000000" + }, + "out": { + "capacity": "8600000000000000000000000", + "isEnabled": true, + "rate": "199090000000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "463000000000000000000" + }, + "out": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "463000000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "13420000000000000000000000", + "isEnabled": true, + "rate": "310673000000000000000" + }, + "out": { + "capacity": "9240000000000000000000000", + "isEnabled": true, + "rate": "213906000000000000000" + } + }, + "standard": { + "in": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "463000000000000000000" + }, + "out": { + "capacity": "20000000000000000000000000", + "isEnabled": true, + "rate": "463000000000000000000" + } + } + } + } + } + }, + "XTFBRICK1": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "memento-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "memento-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "memento-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "XTFCLOBOND": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 5, + "remote": { + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "memento-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "matic-mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "memento-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "memento-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "matic-mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "YBTC.B": { + "avalanche-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bsc-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plume-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "bsc-mainnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-mainnet": { + "custom": null, + "standard": null + }, + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-mainnet-ink-1": { + "minBlockConfirmation": 5, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 9, + "remote": { + "avalanche-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-mainnet-ink-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plasma-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plume-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "bitcoin-mainnet-bitlayer-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "YGG": { + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ronin-mainnet": { + "custom": { + "in": { + "capacity": "1208000000000000000000000", + "isEnabled": true, + "rate": "13981452400000000000" + }, + "out": { + "capacity": "1116000000000000000000000", + "isEnabled": true, + "rate": "12916646000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148100000000000000" + }, + "out": { + "capacity": "1800000000000000000000000", + "isEnabled": true, + "rate": "20833300000000000000" + } + } + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 6, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1194000000000000000000000", + "isEnabled": true, + "rate": "13819415700000000000" + }, + "out": { + "capacity": "833400000000000000000000", + "isEnabled": true, + "rate": "9645817900000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23148100000000000000" + }, + "out": { + "capacity": "1800000000000000000000000", + "isEnabled": true, + "rate": "20833300000000000000" + } + } + } + } + } + }, + "YNE": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "solana-mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "zBTC": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "484000000", + "isEnabled": true, + "rate": "5601" + }, + "out": { + "capacity": "316000000", + "isEnabled": true, + "rate": "3657" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "480000000", + "isEnabled": true, + "rate": "5555" + }, + "out": { + "capacity": "353000000", + "isEnabled": true, + "rate": "4085" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "328000000", + "isEnabled": true, + "rate": "3796" + }, + "out": { + "capacity": "639000000", + "isEnabled": true, + "rate": "7395" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "479000000", + "isEnabled": true, + "rate": "5543" + }, + "out": { + "capacity": "691000000", + "isEnabled": true, + "rate": "7997" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "429000000", + "isEnabled": true, + "rate": "4965" + }, + "out": { + "capacity": "419000000", + "isEnabled": true, + "rate": "4849" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "676000000", + "isEnabled": true, + "rate": "7824" + }, + "out": { + "capacity": "495000000", + "isEnabled": true, + "rate": "5729" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "solana-mainnet": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "520000000", + "isEnabled": true, + "rate": "6018" + }, + "out": { + "capacity": "409000000", + "isEnabled": true, + "rate": "4733" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "495000000", + "isEnabled": true, + "rate": "5729" + }, + "out": { + "capacity": "616000000", + "isEnabled": true, + "rate": "7129" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "sonic-mainnet": { + "custom": { + "in": { + "capacity": "325000000", + "isEnabled": true, + "rate": "3761" + }, + "out": { + "capacity": "620000000", + "isEnabled": true, + "rate": "7175" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + }, + "sonic-mainnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "656000000", + "isEnabled": true, + "rate": "7592" + }, + "out": { + "capacity": "621000000", + "isEnabled": true, + "rate": "7187" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + }, + "solana-mainnet": { + "custom": { + "in": { + "capacity": "449000000", + "isEnabled": true, + "rate": "5196" + }, + "out": { + "capacity": "574000000", + "isEnabled": true, + "rate": "6643" + } + }, + "standard": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "11574" + } + } + } + } + } + }, + "ZENT": { + "mainnet": { + "minBlockConfirmation": null, + "remote": { + "ronin-mainnet": { + "custom": null, + "standard": null + } + } + }, + "ronin-mainnet": { + "minBlockConfirmation": 2, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "ZeUSD": { + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 10, + "remote": { + "mainnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "ZUN": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1138000000000000000000000", + "isEnabled": true, + "rate": "13166660000000000000" + }, + "out": { + "capacity": "1018000000000000000000000", + "isEnabled": true, + "rate": "11778260000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "686000000000000000000000", + "isEnabled": true, + "rate": "7937020000000000000" + }, + "out": { + "capacity": "792000000000000000000000", + "isEnabled": true, + "rate": "9163440000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "648000000000000000000000", + "isEnabled": true, + "rate": "7497360000000000000" + }, + "out": { + "capacity": "1292000000000000000000000", + "isEnabled": true, + "rate": "14948440000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "988000000000000000000000", + "isEnabled": true, + "rate": "11431160000000000000" + }, + "out": { + "capacity": "1100000000000000000000000", + "isEnabled": true, + "rate": "12727000000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": null, + "standard": null + }, + "mainnet": { + "custom": { + "in": { + "capacity": "1106000000000000000000000", + "isEnabled": true, + "rate": "12796420000000000000" + }, + "out": { + "capacity": "934000000000000000000000", + "isEnabled": true, + "rate": "10806380000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "1384000000000000000000000", + "isEnabled": true, + "rate": "16012880000000000000" + }, + "out": { + "capacity": "1010000000000000000000000", + "isEnabled": true, + "rate": "11685700000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1072000000000000000000000", + "isEnabled": true, + "rate": "12403040000000000000" + }, + "out": { + "capacity": "698000000000000000000000", + "isEnabled": true, + "rate": "8075860000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "996000000000000000000000", + "isEnabled": true, + "rate": "11523720000000000000" + }, + "out": { + "capacity": "626000000000000000000000", + "isEnabled": true, + "rate": "7242820000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "966000000000000000000000", + "isEnabled": true, + "rate": "11176620000000000000" + }, + "out": { + "capacity": "1170000000000000000000000", + "isEnabled": true, + "rate": "13536900000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "1078000000000000000000000", + "isEnabled": true, + "rate": "12472460000000000000" + }, + "out": { + "capacity": "970000000000000000000000", + "isEnabled": true, + "rate": "11222900000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "682000000000000000000000", + "isEnabled": true, + "rate": "7890740000000000000" + }, + "out": { + "capacity": "618000000000000000000000", + "isEnabled": true, + "rate": "7150260000000000000" + } + }, + "standard": { + "in": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + }, + "out": { + "capacity": "2000000000000000000000000", + "isEnabled": true, + "rate": "23140000000000000000" + } + } + } + } + } + }, + "zunETH": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "39096000000000000000", + "isEnabled": true, + "rate": "904638000000000" + }, + "out": { + "capacity": "25128000000000000000", + "isEnabled": true, + "rate": "581434000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "37080000000000000000", + "isEnabled": true, + "rate": "857990000000000" + }, + "out": { + "capacity": "22032000000000000000", + "isEnabled": true, + "rate": "509796000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "39456000000000000000", + "isEnabled": true, + "rate": "912968000000000" + }, + "out": { + "capacity": "48456000000000000000", + "isEnabled": true, + "rate": "1121218000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "49248000000000000000", + "isEnabled": true, + "rate": "1139544000000000" + }, + "out": { + "capacity": "45360000000000000000", + "isEnabled": true, + "rate": "1049580000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "25344000000000000000", + "isEnabled": true, + "rate": "586432000000000" + }, + "out": { + "capacity": "45504000000000000000", + "isEnabled": true, + "rate": "1052912000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "32256000000000000000", + "isEnabled": true, + "rate": "746368000000000" + }, + "out": { + "capacity": "36072000000000000000", + "isEnabled": true, + "rate": "834666000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "33696000000000000000", + "isEnabled": true, + "rate": "779688000000000" + }, + "out": { + "capacity": "41184000000000000000", + "isEnabled": true, + "rate": "952952000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "40752000000000000000", + "isEnabled": true, + "rate": "942956000000000" + }, + "out": { + "capacity": "39888000000000000000", + "isEnabled": true, + "rate": "922964000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "23472000000000000000", + "isEnabled": true, + "rate": "543116000000000" + }, + "out": { + "capacity": "38160000000000000000", + "isEnabled": true, + "rate": "882980000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "37008000000000000000", + "isEnabled": true, + "rate": "856324000000000" + }, + "out": { + "capacity": "36576000000000000000", + "isEnabled": true, + "rate": "846328000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "45072000000000000000", + "isEnabled": true, + "rate": "1042916000000000" + }, + "out": { + "capacity": "46152000000000000000", + "isEnabled": true, + "rate": "1067906000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "35712000000000000000", + "isEnabled": true, + "rate": "826336000000000" + }, + "out": { + "capacity": "33480000000000000000", + "isEnabled": true, + "rate": "774690000000000" + } + }, + "standard": { + "in": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + }, + "out": { + "capacity": "72000000000000000000", + "isEnabled": true, + "rate": "1666000000000000" + } + } + } + } + } + }, + "zunUSD": { + "ethereum-mainnet-arbitrum-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "125000000000000000000000", + "isEnabled": true, + "rate": "2893500000000000000" + }, + "out": { + "capacity": "129250000000000000000000", + "isEnabled": true, + "rate": "2991879000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "155750000000000000000000", + "isEnabled": true, + "rate": "3605301000000000000" + }, + "out": { + "capacity": "91250000000000000000000", + "isEnabled": true, + "rate": "2112255000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "113750000000000000000000", + "isEnabled": true, + "rate": "2633085000000000000" + }, + "out": { + "capacity": "147250000000000000000000", + "isEnabled": true, + "rate": "3408543000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + } + } + }, + "ethereum-mainnet-base-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "77500000000000000000000", + "isEnabled": true, + "rate": "1793970000000000000" + }, + "out": { + "capacity": "89000000000000000000000", + "isEnabled": true, + "rate": "2060172000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "171250000000000000000000", + "isEnabled": true, + "rate": "3964095000000000000" + }, + "out": { + "capacity": "117250000000000000000000", + "isEnabled": true, + "rate": "2714103000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "109250000000000000000000", + "isEnabled": true, + "rate": "2528919000000000000" + }, + "out": { + "capacity": "138000000000000000000000", + "isEnabled": true, + "rate": "3194424000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + } + } + }, + "ethereum-mainnet-optimism-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "123750000000000000000000", + "isEnabled": true, + "rate": "2864565000000000000" + }, + "out": { + "capacity": "116250000000000000000000", + "isEnabled": true, + "rate": "2690955000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "158000000000000000000000", + "isEnabled": true, + "rate": "3657384000000000000" + }, + "out": { + "capacity": "97250000000000000000000", + "isEnabled": true, + "rate": "2251143000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "mainnet": { + "custom": { + "in": { + "capacity": "86000000000000000000000", + "isEnabled": true, + "rate": "1990728000000000000" + }, + "out": { + "capacity": "126000000000000000000000", + "isEnabled": true, + "rate": "2916648000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + } + } + }, + "mainnet": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-mainnet-arbitrum-1": { + "custom": { + "in": { + "capacity": "92500000000000000000000", + "isEnabled": true, + "rate": "2141190000000000000" + }, + "out": { + "capacity": "131750000000000000000000", + "isEnabled": true, + "rate": "3049749000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "ethereum-mainnet-base-1": { + "custom": { + "in": { + "capacity": "172250000000000000000000", + "isEnabled": true, + "rate": "3987243000000000000" + }, + "out": { + "capacity": "86500000000000000000000", + "isEnabled": true, + "rate": "2002302000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + }, + "ethereum-mainnet-optimism-1": { + "custom": { + "in": { + "capacity": "101250000000000000000000", + "isEnabled": true, + "rate": "2343735000000000000" + }, + "out": { + "capacity": "124250000000000000000000", + "isEnabled": true, + "rate": "2876139000000000000" + } + }, + "standard": { + "in": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + }, + "out": { + "capacity": "250000000000000000000000", + "isEnabled": true, + "rate": "5787000000000000000" + } + } + } + } + } + } +} diff --git a/src/__mocks__/rate-limits-testnet.json b/src/__mocks__/rate-limits-testnet.json new file mode 100644 index 00000000000..0dfaf068b79 --- /dev/null +++ b/src/__mocks__/rate-limits-testnet.json @@ -0,0 +1,7465 @@ +{ + "CCIP-BnM": { + "abstract-testnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "45500000000000000000000", + "isEnabled": true, + "rate": "75985000000000000000" + }, + "out": { + "capacity": "60300000000000000000000", + "isEnabled": true, + "rate": "100701000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "apechain-testnet-curtis": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "53700000000000000000000", + "isEnabled": true, + "rate": "89679000000000000000" + }, + "out": { + "capacity": "45300000000000000000000", + "isEnabled": true, + "rate": "75651000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "aptos-testnet": { + "minBlockConfirmation": 6, + "remote": { + "bsc-testnet": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "sonic-testnet-blaze": { + "custom": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "100000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "avalanche-fuji-testnet": { + "minBlockConfirmation": 10, + "remote": { + "bsc-testnet": { + "custom": { + "in": { + "capacity": "44900000000000000000000", + "isEnabled": true, + "rate": "74983000000000000000" + }, + "out": { + "capacity": "48500000000000000000000", + "isEnabled": true, + "rate": "80995000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "45500000000000000000000", + "isEnabled": true, + "rate": "75985000000000000000" + }, + "out": { + "capacity": "47900000000000000000000", + "isEnabled": true, + "rate": "79993000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "33700000000000000000000", + "isEnabled": true, + "rate": "56279000000000000000" + }, + "out": { + "capacity": "56300000000000000000000", + "isEnabled": true, + "rate": "94021000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "66400000000000000000000", + "isEnabled": true, + "rate": "110888000000000000000" + }, + "out": { + "capacity": "42900000000000000000000", + "isEnabled": true, + "rate": "71643000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "60700000000000000000000", + "isEnabled": true, + "rate": "101369000000000000000" + }, + "out": { + "capacity": "44300000000000000000000", + "isEnabled": true, + "rate": "73981000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "41800000000000000000000", + "isEnabled": true, + "rate": "69806000000000000000" + }, + "out": { + "capacity": "44100000000000000000000", + "isEnabled": true, + "rate": "73647000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "shibarium-testnet-puppynet": { + "custom": { + "in": { + "capacity": "42300000000000000000000", + "isEnabled": true, + "rate": "70641000000000000000" + }, + "out": { + "capacity": "58500000000000000000000", + "isEnabled": true, + "rate": "97695000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "51800000000000000000000", + "isEnabled": true, + "rate": "86506000000000000000" + }, + "out": { + "capacity": "50400000000000000000000", + "isEnabled": true, + "rate": "84168000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "57900000000000000000000", + "isEnabled": true, + "rate": "96693000000000000000" + }, + "out": { + "capacity": "46000000000000000000000", + "isEnabled": true, + "rate": "76820000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "bitcoin-testnet-bsquared-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "68000000000000000000000", + "isEnabled": true, + "rate": "113560000000000000000" + }, + "out": { + "capacity": "58300000000000000000000", + "isEnabled": true, + "rate": "97361000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "bitcoin-testnet-rootstock": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "35000000000000000000000", + "isEnabled": true, + "rate": "58450000000000000000" + }, + "out": { + "capacity": "47800000000000000000000", + "isEnabled": true, + "rate": "79826000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "bitcoin-testnet-sepolia-bob-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "39000000000000000000000", + "isEnabled": true, + "rate": "65130000000000000000" + }, + "out": { + "capacity": "40400000000000000000000", + "isEnabled": true, + "rate": "67468000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "bsc-testnet": { + "minBlockConfirmation": 7, + "remote": { + "aptos-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "52400000000000000000000", + "isEnabled": true, + "rate": "87508000000000000000" + }, + "out": { + "capacity": "59100000000000000000000", + "isEnabled": true, + "rate": "98697000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "42400000000000000000000", + "isEnabled": true, + "rate": "70808000000000000000" + }, + "out": { + "capacity": "38400000000000000000000", + "isEnabled": true, + "rate": "64128000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "32900000000000000000000", + "isEnabled": true, + "rate": "54943000000000000000" + }, + "out": { + "capacity": "65800000000000000000000", + "isEnabled": true, + "rate": "109886000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "65900000000000000000000", + "isEnabled": true, + "rate": "110053000000000000000" + }, + "out": { + "capacity": "65600000000000000000000", + "isEnabled": true, + "rate": "109552000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "34100000000000000000000", + "isEnabled": true, + "rate": "56947000000000000000" + }, + "out": { + "capacity": "64300000000000000000000", + "isEnabled": true, + "rate": "107381000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "62600000000000000000000", + "isEnabled": true, + "rate": "104542000000000000000" + }, + "out": { + "capacity": "37500000000000000000000", + "isEnabled": true, + "rate": "62625000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "57400000000000000000000", + "isEnabled": true, + "rate": "95858000000000000000" + }, + "out": { + "capacity": "33900000000000000000000", + "isEnabled": true, + "rate": "56613000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "celo-testnet-alfajores": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "36700000000000000000000", + "isEnabled": true, + "rate": "61289000000000000000" + }, + "out": { + "capacity": "44400000000000000000000", + "isEnabled": true, + "rate": "74148000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "cronos-testnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "47900000000000000000000", + "isEnabled": true, + "rate": "79993000000000000000" + }, + "out": { + "capacity": "35600000000000000000000", + "isEnabled": true, + "rate": "59452000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-holesky": { + "minBlockConfirmation": 1, + "remote": { + "polygon-testnet-tatara": { + "custom": { + "in": { + "capacity": "58500000000000000000000", + "isEnabled": true, + "rate": "97695000000000000000" + }, + "out": { + "capacity": "68700000000000000000000", + "isEnabled": true, + "rate": "114729000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-holesky-fraxtal-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "49000000000000000000000", + "isEnabled": true, + "rate": "81830000000000000000" + }, + "out": { + "capacity": "53400000000000000000000", + "isEnabled": true, + "rate": "89178000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-holesky-taiko-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "51400000000000000000000", + "isEnabled": true, + "rate": "85838000000000000000" + }, + "out": { + "capacity": "42300000000000000000000", + "isEnabled": true, + "rate": "70641000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-hoodi-morph": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia": { + "minBlockConfirmation": 3, + "remote": { + "abstract-testnet": { + "custom": { + "in": { + "capacity": "66900000000000000000000", + "isEnabled": true, + "rate": "111723000000000000000" + }, + "out": { + "capacity": "35800000000000000000000", + "isEnabled": true, + "rate": "59786000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "apechain-testnet-curtis": { + "custom": { + "in": { + "capacity": "65500000000000000000000", + "isEnabled": true, + "rate": "109385000000000000000" + }, + "out": { + "capacity": "55500000000000000000000", + "isEnabled": true, + "rate": "92685000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "aptos-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avalanche-fuji-testnet": { + "custom": null, + "standard": null + }, + "bitcoin-testnet-bsquared-1": { + "custom": { + "in": { + "capacity": "68800000000000000000000", + "isEnabled": true, + "rate": "114896000000000000000" + }, + "out": { + "capacity": "65900000000000000000000", + "isEnabled": true, + "rate": "110053000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bitcoin-testnet-rootstock": { + "custom": { + "in": { + "capacity": "60300000000000000000000", + "isEnabled": true, + "rate": "100701000000000000000" + }, + "out": { + "capacity": "64300000000000000000000", + "isEnabled": true, + "rate": "107381000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bitcoin-testnet-sepolia-bob-1": { + "custom": { + "in": { + "capacity": "54200000000000000000000", + "isEnabled": true, + "rate": "90514000000000000000" + }, + "out": { + "capacity": "57200000000000000000000", + "isEnabled": true, + "rate": "95524000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "48300000000000000000000", + "isEnabled": true, + "rate": "80661000000000000000" + }, + "out": { + "capacity": "42500000000000000000000", + "isEnabled": true, + "rate": "70975000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "celo-testnet-alfajores": { + "custom": { + "in": { + "capacity": "58700000000000000000000", + "isEnabled": true, + "rate": "98029000000000000000" + }, + "out": { + "capacity": "62800000000000000000000", + "isEnabled": true, + "rate": "104876000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "cronos-testnet": { + "custom": { + "in": { + "capacity": "44500000000000000000000", + "isEnabled": true, + "rate": "74315000000000000000" + }, + "out": { + "capacity": "67400000000000000000000", + "isEnabled": true, + "rate": "112558000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-holesky-fraxtal-1": { + "custom": { + "in": { + "capacity": "33000000000000000000000", + "isEnabled": true, + "rate": "55110000000000000000" + }, + "out": { + "capacity": "41800000000000000000000", + "isEnabled": true, + "rate": "69806000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-holesky-taiko-1": { + "custom": { + "in": { + "capacity": "45200000000000000000000", + "isEnabled": true, + "rate": "75484000000000000000" + }, + "out": { + "capacity": "57800000000000000000000", + "isEnabled": true, + "rate": "96526000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-hoodi-morph": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-andromeda-1": { + "custom": { + "in": { + "capacity": "40100000000000000000000", + "isEnabled": true, + "rate": "66967000000000000000" + }, + "out": { + "capacity": "65600000000000000000000", + "isEnabled": true, + "rate": "109552000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": null, + "standard": null + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "54700000000000000000000", + "isEnabled": true, + "rate": "91349000000000000000" + }, + "out": { + "capacity": "33900000000000000000000", + "isEnabled": true, + "rate": "56613000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-blast-1": { + "custom": { + "in": { + "capacity": "65000000000000000000000", + "isEnabled": true, + "rate": "108550000000000000000" + }, + "out": { + "capacity": "65400000000000000000000", + "isEnabled": true, + "rate": "109218000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-hashkey-1": { + "custom": { + "in": { + "capacity": "57700000000000000000000", + "isEnabled": true, + "rate": "96359000000000000000" + }, + "out": { + "capacity": "52000000000000000000000", + "isEnabled": true, + "rate": "86840000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-lisk-1": { + "custom": null, + "standard": null + }, + "ethereum-testnet-sepolia-mantle-1": { + "custom": { + "in": { + "capacity": "65200000000000000000000", + "isEnabled": true, + "rate": "108884000000000000000" + }, + "out": { + "capacity": "58600000000000000000000", + "isEnabled": true, + "rate": "97862000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-mode-1": { + "custom": { + "in": { + "capacity": "44100000000000000000000", + "isEnabled": true, + "rate": "73647000000000000000" + }, + "out": { + "capacity": "62900000000000000000000", + "isEnabled": true, + "rate": "105043000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "38200000000000000000000", + "isEnabled": true, + "rate": "63794000000000000000" + }, + "out": { + "capacity": "57100000000000000000000", + "isEnabled": true, + "rate": "95357000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-unichain-1": { + "custom": { + "in": { + "capacity": "37700000000000000000000", + "isEnabled": true, + "rate": "62959000000000000000" + }, + "out": { + "capacity": "31400000000000000000000", + "isEnabled": true, + "rate": "52438000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-worldchain-1": { + "custom": { + "in": { + "capacity": "63400000000000000000000", + "isEnabled": true, + "rate": "105878000000000000000" + }, + "out": { + "capacity": "35300000000000000000000", + "isEnabled": true, + "rate": "58951000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-zksync-1": { + "custom": { + "in": { + "capacity": "57400000000000000000000", + "isEnabled": true, + "rate": "95858000000000000000" + }, + "out": { + "capacity": "69300000000000000000000", + "isEnabled": true, + "rate": "115731000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "hedera-testnet": { + "custom": { + "in": { + "capacity": "57700000000000000000000", + "isEnabled": true, + "rate": "96359000000000000000" + }, + "out": { + "capacity": "60700000000000000000000", + "isEnabled": true, + "rate": "101369000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ink-testnet-sepolia": { + "custom": null, + "standard": null + }, + "jovay-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "memento-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "metal-testnet": { + "custom": { + "in": { + "capacity": "69400000000000000000000", + "isEnabled": true, + "rate": "115898000000000000000" + }, + "out": { + "capacity": "30100000000000000000000", + "isEnabled": true, + "rate": "50267000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "mint-testnet": { + "custom": { + "in": { + "capacity": "36700000000000000000000", + "isEnabled": true, + "rate": "61289000000000000000" + }, + "out": { + "capacity": "40700000000000000000000", + "isEnabled": true, + "rate": "67969000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "plume-testnet-sepolia": { + "custom": { + "in": { + "capacity": "58900000000000000000000", + "isEnabled": true, + "rate": "98363000000000000000" + }, + "out": { + "capacity": "49300000000000000000000", + "isEnabled": true, + "rate": "82331000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polkadot-testnet-astar-shibuya": { + "custom": { + "in": { + "capacity": "61300000000000000000000", + "isEnabled": true, + "rate": "102371000000000000000" + }, + "out": { + "capacity": "35700000000000000000000", + "isEnabled": true, + "rate": "59619000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "54500000000000000000000", + "isEnabled": true, + "rate": "91015000000000000000" + }, + "out": { + "capacity": "37700000000000000000000", + "isEnabled": true, + "rate": "62959000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ronin-testnet-saigon": { + "custom": { + "in": { + "capacity": "33300000000000000000000", + "isEnabled": true, + "rate": "55611000000000000000" + }, + "out": { + "capacity": "47800000000000000000000", + "isEnabled": true, + "rate": "79826000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "sei-testnet-atlantic": { + "custom": { + "in": { + "capacity": "30600000000000000000000", + "isEnabled": true, + "rate": "51102000000000000000" + }, + "out": { + "capacity": "57500000000000000000000", + "isEnabled": true, + "rate": "96025000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "shibarium-testnet-puppynet": { + "custom": { + "in": { + "capacity": "42000000000000000000000", + "isEnabled": true, + "rate": "70140000000000000000" + }, + "out": { + "capacity": "49700000000000000000000", + "isEnabled": true, + "rate": "82999000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "65200000000000000000000", + "isEnabled": true, + "rate": "108884000000000000000" + }, + "out": { + "capacity": "56100000000000000000000", + "isEnabled": true, + "rate": "93687000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "sonic-testnet-blaze": { + "custom": { + "in": { + "capacity": "40700000000000000000000", + "isEnabled": true, + "rate": "67969000000000000000" + }, + "out": { + "capacity": "54700000000000000000000", + "isEnabled": true, + "rate": "91349000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "tac-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "69900000000000000000000", + "isEnabled": true, + "rate": "116733000000000000000" + }, + "out": { + "capacity": "47600000000000000000000", + "isEnabled": true, + "rate": "79492000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "35100000000000000000000", + "isEnabled": true, + "rate": "58617000000000000000" + }, + "out": { + "capacity": "48200000000000000000000", + "isEnabled": true, + "rate": "80494000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdc-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-andromeda-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "49000000000000000000000", + "isEnabled": true, + "rate": "81830000000000000000" + }, + "out": { + "capacity": "37600000000000000000000", + "isEnabled": true, + "rate": "62792000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "minBlockConfirmation": 3, + "remote": { + "aptos-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "37100000000000000000000", + "isEnabled": true, + "rate": "61957000000000000000" + }, + "out": { + "capacity": "30000000000000000000000", + "isEnabled": true, + "rate": "50100000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "45600000000000000000000", + "isEnabled": true, + "rate": "76152000000000000000" + }, + "out": { + "capacity": "34800000000000000000000", + "isEnabled": true, + "rate": "58116000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "59900000000000000000000", + "isEnabled": true, + "rate": "100033000000000000000" + }, + "out": { + "capacity": "38000000000000000000000", + "isEnabled": true, + "rate": "63460000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "34500000000000000000000", + "isEnabled": true, + "rate": "57615000000000000000" + }, + "out": { + "capacity": "51400000000000000000000", + "isEnabled": true, + "rate": "85838000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "shibarium-testnet-puppynet": { + "custom": { + "in": { + "capacity": "38900000000000000000000", + "isEnabled": true, + "rate": "64963000000000000000" + }, + "out": { + "capacity": "51300000000000000000000", + "isEnabled": true, + "rate": "85671000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "58100000000000000000000", + "isEnabled": true, + "rate": "97027000000000000000" + }, + "out": { + "capacity": "57500000000000000000000", + "isEnabled": true, + "rate": "96025000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "31100000000000000000000", + "isEnabled": true, + "rate": "51937000000000000000" + }, + "out": { + "capacity": "66900000000000000000000", + "isEnabled": true, + "rate": "111723000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "38500000000000000000000", + "isEnabled": true, + "rate": "64295000000000000000" + }, + "out": { + "capacity": "42500000000000000000000", + "isEnabled": true, + "rate": "70975000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "minBlockConfirmation": 5, + "remote": { + "aptos-testnet": { + "custom": null, + "standard": null + }, + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "31200000000000000000000", + "isEnabled": true, + "rate": "52104000000000000000" + }, + "out": { + "capacity": "62900000000000000000000", + "isEnabled": true, + "rate": "105043000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "68400000000000000000000", + "isEnabled": true, + "rate": "114228000000000000000" + }, + "out": { + "capacity": "43600000000000000000000", + "isEnabled": true, + "rate": "72812000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": null, + "standard": null + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "33700000000000000000000", + "isEnabled": true, + "rate": "56279000000000000000" + }, + "out": { + "capacity": "44300000000000000000000", + "isEnabled": true, + "rate": "73981000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-mode-1": { + "custom": { + "in": { + "capacity": "60000000000000000000000", + "isEnabled": true, + "rate": "100200000000000000000" + }, + "out": { + "capacity": "34500000000000000000000", + "isEnabled": true, + "rate": "57615000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "63600000000000000000000", + "isEnabled": true, + "rate": "106212000000000000000" + }, + "out": { + "capacity": "43000000000000000000000", + "isEnabled": true, + "rate": "71810000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "shibarium-testnet-puppynet": { + "custom": { + "in": { + "capacity": "54000000000000000000000", + "isEnabled": true, + "rate": "90180000000000000000" + }, + "out": { + "capacity": "46900000000000000000000", + "isEnabled": true, + "rate": "78323000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "48100000000000000000000", + "isEnabled": true, + "rate": "80327000000000000000" + }, + "out": { + "capacity": "34600000000000000000000", + "isEnabled": true, + "rate": "57782000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "51900000000000000000000", + "isEnabled": true, + "rate": "86673000000000000000" + }, + "out": { + "capacity": "42500000000000000000000", + "isEnabled": true, + "rate": "70975000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-blast-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "39000000000000000000000", + "isEnabled": true, + "rate": "65130000000000000000" + }, + "out": { + "capacity": "48200000000000000000000", + "isEnabled": true, + "rate": "80494000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-hashkey-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "43700000000000000000000", + "isEnabled": true, + "rate": "72979000000000000000" + }, + "out": { + "capacity": "33800000000000000000000", + "isEnabled": true, + "rate": "56446000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-lisk-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "35400000000000000000000", + "isEnabled": true, + "rate": "59118000000000000000" + }, + "out": { + "capacity": "46300000000000000000000", + "isEnabled": true, + "rate": "77321000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-mantle-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "34700000000000000000000", + "isEnabled": true, + "rate": "57949000000000000000" + }, + "out": { + "capacity": "51500000000000000000000", + "isEnabled": true, + "rate": "86005000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-mode-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "42500000000000000000000", + "isEnabled": true, + "rate": "70975000000000000000" + }, + "out": { + "capacity": "49200000000000000000000", + "isEnabled": true, + "rate": "82164000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "46900000000000000000000", + "isEnabled": true, + "rate": "78323000000000000000" + }, + "out": { + "capacity": "40200000000000000000000", + "isEnabled": true, + "rate": "67134000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "minBlockConfirmation": 1, + "remote": { + "aptos-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "61000000000000000000000", + "isEnabled": true, + "rate": "101870000000000000000" + }, + "out": { + "capacity": "48800000000000000000000", + "isEnabled": true, + "rate": "81496000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "47300000000000000000000", + "isEnabled": true, + "rate": "78991000000000000000" + }, + "out": { + "capacity": "38600000000000000000000", + "isEnabled": true, + "rate": "64462000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "54100000000000000000000", + "isEnabled": true, + "rate": "90347000000000000000" + }, + "out": { + "capacity": "54900000000000000000000", + "isEnabled": true, + "rate": "91683000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "53400000000000000000000", + "isEnabled": true, + "rate": "89178000000000000000" + }, + "out": { + "capacity": "52300000000000000000000", + "isEnabled": true, + "rate": "87341000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "51100000000000000000000", + "isEnabled": true, + "rate": "85337000000000000000" + }, + "out": { + "capacity": "40400000000000000000000", + "isEnabled": true, + "rate": "67468000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "shibarium-testnet-puppynet": { + "custom": { + "in": { + "capacity": "34700000000000000000000", + "isEnabled": true, + "rate": "57949000000000000000" + }, + "out": { + "capacity": "33500000000000000000000", + "isEnabled": true, + "rate": "55945000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "49600000000000000000000", + "isEnabled": true, + "rate": "82832000000000000000" + }, + "out": { + "capacity": "65900000000000000000000", + "isEnabled": true, + "rate": "110053000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "53500000000000000000000", + "isEnabled": true, + "rate": "89345000000000000000" + }, + "out": { + "capacity": "35800000000000000000000", + "isEnabled": true, + "rate": "59786000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "69700000000000000000000", + "isEnabled": true, + "rate": "116399000000000000000" + }, + "out": { + "capacity": "69400000000000000000000", + "isEnabled": true, + "rate": "115898000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-unichain-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "61100000000000000000000", + "isEnabled": true, + "rate": "102037000000000000000" + }, + "out": { + "capacity": "64200000000000000000000", + "isEnabled": true, + "rate": "107214000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-worldchain-1": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "32400000000000000000000", + "isEnabled": true, + "rate": "54108000000000000000" + }, + "out": { + "capacity": "47700000000000000000000", + "isEnabled": true, + "rate": "79659000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-zksync-1": { + "minBlockConfirmation": null, + "remote": { + "ethereum-testnet-sepolia": { + "custom": null, + "standard": null + } + } + }, + "hedera-testnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "68100000000000000000000", + "isEnabled": true, + "rate": "113727000000000000000" + }, + "out": { + "capacity": "64900000000000000000000", + "isEnabled": true, + "rate": "108383000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ink-testnet-sepolia": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "62400000000000000000000", + "isEnabled": true, + "rate": "104208000000000000000" + }, + "out": { + "capacity": "68900000000000000000000", + "isEnabled": true, + "rate": "115063000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "jovay-testnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "memento-testnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "metal-testnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "57500000000000000000000", + "isEnabled": true, + "rate": "96025000000000000000" + }, + "out": { + "capacity": "59900000000000000000000", + "isEnabled": true, + "rate": "100033000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "mint-testnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "44900000000000000000000", + "isEnabled": true, + "rate": "74983000000000000000" + }, + "out": { + "capacity": "57400000000000000000000", + "isEnabled": true, + "rate": "95858000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "plume-testnet-sepolia": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "45900000000000000000000", + "isEnabled": true, + "rate": "76653000000000000000" + }, + "out": { + "capacity": "32800000000000000000000", + "isEnabled": true, + "rate": "54776000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "polkadot-testnet-astar-shibuya": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "41800000000000000000000", + "isEnabled": true, + "rate": "69806000000000000000" + }, + "out": { + "capacity": "50300000000000000000000", + "isEnabled": true, + "rate": "84001000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "polygon-testnet-amoy": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "40000000000000000000000", + "isEnabled": true, + "rate": "66800000000000000000" + }, + "out": { + "capacity": "55200000000000000000000", + "isEnabled": true, + "rate": "92184000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "37800000000000000000000", + "isEnabled": true, + "rate": "63126000000000000000" + }, + "out": { + "capacity": "41600000000000000000000", + "isEnabled": true, + "rate": "69472000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": null, + "standard": null + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "62200000000000000000000", + "isEnabled": true, + "rate": "103874000000000000000" + }, + "out": { + "capacity": "65300000000000000000000", + "isEnabled": true, + "rate": "109051000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "59500000000000000000000", + "isEnabled": true, + "rate": "99365000000000000000" + }, + "out": { + "capacity": "64600000000000000000000", + "isEnabled": true, + "rate": "107882000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "53700000000000000000000", + "isEnabled": true, + "rate": "89679000000000000000" + }, + "out": { + "capacity": "61200000000000000000000", + "isEnabled": true, + "rate": "102204000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "polygon-testnet-tatara": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-holesky": { + "custom": { + "in": { + "capacity": "37500000000000000000000", + "isEnabled": true, + "rate": "62625000000000000000" + }, + "out": { + "capacity": "68700000000000000000000", + "isEnabled": true, + "rate": "114729000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ronin-testnet-saigon": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "53400000000000000000000", + "isEnabled": true, + "rate": "89178000000000000000" + }, + "out": { + "capacity": "39700000000000000000000", + "isEnabled": true, + "rate": "66299000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "sei-testnet-atlantic": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "62900000000000000000000", + "isEnabled": true, + "rate": "105043000000000000000" + }, + "out": { + "capacity": "34200000000000000000000", + "isEnabled": true, + "rate": "57114000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "shibarium-testnet-puppynet": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "46200000000000000000000", + "isEnabled": true, + "rate": "77154000000000000000" + }, + "out": { + "capacity": "65700000000000000000000", + "isEnabled": true, + "rate": "109719000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "48100000000000000000000", + "isEnabled": true, + "rate": "80327000000000000000" + }, + "out": { + "capacity": "58500000000000000000000", + "isEnabled": true, + "rate": "97695000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "34500000000000000000000", + "isEnabled": true, + "rate": "57615000000000000000" + }, + "out": { + "capacity": "69400000000000000000000", + "isEnabled": true, + "rate": "115898000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": null, + "standard": null + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "45100000000000000000000", + "isEnabled": true, + "rate": "75317000000000000000" + }, + "out": { + "capacity": "63200000000000000000000", + "isEnabled": true, + "rate": "105544000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "solana-devnet": { + "minBlockConfirmation": 9, + "remote": { + "bsc-testnet": { + "custom": { + "in": { + "capacity": "62200000000000", + "isEnabled": true, + "rate": "103874000000" + }, + "out": { + "capacity": "50400000000000", + "isEnabled": true, + "rate": "84168000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + }, + "out": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "54200000000000", + "isEnabled": true, + "rate": "90514000000" + }, + "out": { + "capacity": "55300000000000", + "isEnabled": true, + "rate": "92351000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + }, + "out": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "60900000000000", + "isEnabled": true, + "rate": "101703000000" + }, + "out": { + "capacity": "65000000000000", + "isEnabled": true, + "rate": "108550000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + }, + "out": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "40800000000000", + "isEnabled": true, + "rate": "68136000000" + }, + "out": { + "capacity": "68300000000000", + "isEnabled": true, + "rate": "114061000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + }, + "out": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "36800000000000", + "isEnabled": true, + "rate": "61456000000" + }, + "out": { + "capacity": "41500000000000", + "isEnabled": true, + "rate": "69305000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + }, + "out": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + } + } + }, + "sonic-testnet-blaze": { + "custom": { + "in": { + "capacity": "64300000000000", + "isEnabled": true, + "rate": "107381000000" + }, + "out": { + "capacity": "31800000000000", + "isEnabled": true, + "rate": "53106000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + }, + "out": { + "capacity": "100000000000000", + "isEnabled": true, + "rate": "167000000000" + } + } + } + } + }, + "sonic-testnet-blaze": { + "minBlockConfirmation": 9, + "remote": { + "aptos-testnet": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "68500000000000000000000", + "isEnabled": true, + "rate": "114395000000000000000" + }, + "out": { + "capacity": "49500000000000000000000", + "isEnabled": true, + "rate": "82665000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "33200000000000000000000", + "isEnabled": true, + "rate": "55444000000000000000" + }, + "out": { + "capacity": "43200000000000000000000", + "isEnabled": true, + "rate": "72144000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "tac-testnet": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "wemix-testnet": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "45600000000000000000000", + "isEnabled": true, + "rate": "76152000000000000000" + }, + "out": { + "capacity": "44700000000000000000000", + "isEnabled": true, + "rate": "74649000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "60500000000000000000000", + "isEnabled": true, + "rate": "101035000000000000000" + }, + "out": { + "capacity": "52500000000000000000000", + "isEnabled": true, + "rate": "87675000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "45100000000000000000000", + "isEnabled": true, + "rate": "75317000000000000000" + }, + "out": { + "capacity": "41800000000000000000000", + "isEnabled": true, + "rate": "69806000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "38300000000000000000000", + "isEnabled": true, + "rate": "63961000000000000000" + }, + "out": { + "capacity": "30700000000000000000000", + "isEnabled": true, + "rate": "51269000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "66000000000000000000000", + "isEnabled": true, + "rate": "110220000000000000000" + }, + "out": { + "capacity": "38700000000000000000000", + "isEnabled": true, + "rate": "64629000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "37700000000000000000000", + "isEnabled": true, + "rate": "62959000000000000000" + }, + "out": { + "capacity": "42700000000000000000000", + "isEnabled": true, + "rate": "71309000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "xdai-testnet-chiado": { + "minBlockConfirmation": 4, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "44700000000000000000000", + "isEnabled": true, + "rate": "74649000000000000000" + }, + "out": { + "capacity": "38100000000000000000000", + "isEnabled": true, + "rate": "63627000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "59100000000000000000000", + "isEnabled": true, + "rate": "98697000000000000000" + }, + "out": { + "capacity": "51300000000000000000000", + "isEnabled": true, + "rate": "85671000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "52500000000000000000000", + "isEnabled": true, + "rate": "87675000000000000000" + }, + "out": { + "capacity": "61300000000000000000000", + "isEnabled": true, + "rate": "102371000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "40300000000000000000000", + "isEnabled": true, + "rate": "67301000000000000000" + }, + "out": { + "capacity": "51500000000000000000000", + "isEnabled": true, + "rate": "86005000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "50000000000000000000000", + "isEnabled": true, + "rate": "83500000000000000000" + }, + "out": { + "capacity": "54500000000000000000000", + "isEnabled": true, + "rate": "91015000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "56900000000000000000000", + "isEnabled": true, + "rate": "95023000000000000000" + }, + "out": { + "capacity": "45900000000000000000000", + "isEnabled": true, + "rate": "76653000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "64700000000000000000000", + "isEnabled": true, + "rate": "108049000000000000000" + }, + "out": { + "capacity": "53500000000000000000000", + "isEnabled": true, + "rate": "89345000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "xdc-testnet": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + }, + "out": { + "capacity": "1000000000000000000000", + "isEnabled": true, + "rate": "1000000000000000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "CCIP-LnM": { + "avalanche-fuji-testnet": { + "minBlockConfirmation": 8, + "remote": { + "bsc-testnet": { + "custom": { + "in": { + "capacity": "31500000000000000000000", + "isEnabled": true, + "rate": "52605000000000000000" + }, + "out": { + "capacity": "49900000000000000000000", + "isEnabled": true, + "rate": "83333000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "58000000000000000000000", + "isEnabled": true, + "rate": "96860000000000000000" + }, + "out": { + "capacity": "47600000000000000000000", + "isEnabled": true, + "rate": "79492000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "43000000000000000000000", + "isEnabled": true, + "rate": "71810000000000000000" + }, + "out": { + "capacity": "57200000000000000000000", + "isEnabled": true, + "rate": "95524000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "32600000000000000000000", + "isEnabled": true, + "rate": "54442000000000000000" + }, + "out": { + "capacity": "49100000000000000000000", + "isEnabled": true, + "rate": "81997000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "37400000000000000000000", + "isEnabled": true, + "rate": "62458000000000000000" + }, + "out": { + "capacity": "37600000000000000000000", + "isEnabled": true, + "rate": "62792000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "56600000000000000000000", + "isEnabled": true, + "rate": "94522000000000000000" + }, + "out": { + "capacity": "64000000000000000000000", + "isEnabled": true, + "rate": "106880000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "38000000000000000000000", + "isEnabled": true, + "rate": "63460000000000000000" + }, + "out": { + "capacity": "34800000000000000000000", + "isEnabled": true, + "rate": "58116000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": null, + "standard": null + } + } + }, + "bsc-testnet": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "60000000000000000000000", + "isEnabled": true, + "rate": "100200000000000000000" + }, + "out": { + "capacity": "60200000000000000000000", + "isEnabled": true, + "rate": "100534000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "42400000000000000000000", + "isEnabled": true, + "rate": "70808000000000000000" + }, + "out": { + "capacity": "51700000000000000000000", + "isEnabled": true, + "rate": "86339000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "46000000000000000000000", + "isEnabled": true, + "rate": "76820000000000000000" + }, + "out": { + "capacity": "48100000000000000000000", + "isEnabled": true, + "rate": "80327000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "67200000000000000000000", + "isEnabled": true, + "rate": "112224000000000000000" + }, + "out": { + "capacity": "69300000000000000000000", + "isEnabled": true, + "rate": "115731000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "65300000000000000000000", + "isEnabled": true, + "rate": "109051000000000000000" + }, + "out": { + "capacity": "39300000000000000000000", + "isEnabled": true, + "rate": "65631000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "48700000000000000000000", + "isEnabled": true, + "rate": "81329000000000000000" + }, + "out": { + "capacity": "60000000000000000000000", + "isEnabled": true, + "rate": "100200000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "celo-testnet-alfajores": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "67700000000000000000000", + "isEnabled": true, + "rate": "113059000000000000000" + }, + "out": { + "capacity": "64100000000000000000000", + "isEnabled": true, + "rate": "107047000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "44500000000000000000000", + "isEnabled": true, + "rate": "74315000000000000000" + }, + "out": { + "capacity": "64400000000000000000000", + "isEnabled": true, + "rate": "107548000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "68800000000000000000000", + "isEnabled": true, + "rate": "114896000000000000000" + }, + "out": { + "capacity": "35200000000000000000000", + "isEnabled": true, + "rate": "58784000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "celo-testnet-alfajores": { + "custom": { + "in": { + "capacity": "41000000000000000000000", + "isEnabled": true, + "rate": "68470000000000000000" + }, + "out": { + "capacity": "60800000000000000000000", + "isEnabled": true, + "rate": "101536000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-andromeda-1": { + "custom": { + "in": { + "capacity": "68000000000000000000000", + "isEnabled": true, + "rate": "113560000000000000000" + }, + "out": { + "capacity": "45500000000000000000000", + "isEnabled": true, + "rate": "75985000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "52900000000000000000000", + "isEnabled": true, + "rate": "88343000000000000000" + }, + "out": { + "capacity": "36700000000000000000000", + "isEnabled": true, + "rate": "61289000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "35000000000000000000000", + "isEnabled": true, + "rate": "58450000000000000000" + }, + "out": { + "capacity": "47700000000000000000000", + "isEnabled": true, + "rate": "79659000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-blast-1": { + "custom": { + "in": { + "capacity": "50300000000000000000000", + "isEnabled": true, + "rate": "84001000000000000000" + }, + "out": { + "capacity": "47800000000000000000000", + "isEnabled": true, + "rate": "79826000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-linea-1": { + "custom": { + "in": { + "capacity": "51600000000000000000000", + "isEnabled": true, + "rate": "86172000000000000000" + }, + "out": { + "capacity": "43400000000000000000000", + "isEnabled": true, + "rate": "72478000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-mantle-1": { + "custom": { + "in": { + "capacity": "54400000000000000000000", + "isEnabled": true, + "rate": "90848000000000000000" + }, + "out": { + "capacity": "52000000000000000000000", + "isEnabled": true, + "rate": "86840000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-mode-1": { + "custom": { + "in": { + "capacity": "53800000000000000000000", + "isEnabled": true, + "rate": "89846000000000000000" + }, + "out": { + "capacity": "59400000000000000000000", + "isEnabled": true, + "rate": "99198000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "59300000000000000000000", + "isEnabled": true, + "rate": "99031000000000000000" + }, + "out": { + "capacity": "37700000000000000000000", + "isEnabled": true, + "rate": "62959000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-polygon-zkevm-1": { + "custom": { + "in": { + "capacity": "65400000000000000000000", + "isEnabled": true, + "rate": "109218000000000000000" + }, + "out": { + "capacity": "32400000000000000000000", + "isEnabled": true, + "rate": "54108000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-scroll-1": { + "custom": { + "in": { + "capacity": "67400000000000000000000", + "isEnabled": true, + "rate": "112558000000000000000" + }, + "out": { + "capacity": "53200000000000000000000", + "isEnabled": true, + "rate": "88844000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-xlayer-1": { + "custom": { + "in": { + "capacity": "68700000000000000000000", + "isEnabled": true, + "rate": "114729000000000000000" + }, + "out": { + "capacity": "55500000000000000000000", + "isEnabled": true, + "rate": "92685000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-zksync-1": { + "custom": { + "in": { + "capacity": "40800000000000000000000", + "isEnabled": true, + "rate": "68136000000000000000" + }, + "out": { + "capacity": "62400000000000000000000", + "isEnabled": true, + "rate": "104208000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polkadot-testnet-astar-shibuya": { + "custom": { + "in": { + "capacity": "114228000000000000000", + "isEnabled": true, + "rate": "68400000000000000000" + }, + "out": { + "capacity": "84001000000000000000", + "isEnabled": true, + "rate": "50300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" + }, + "out": { + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "36900000000000000000000", + "isEnabled": true, + "rate": "61623000000000000000" + }, + "out": { + "capacity": "44600000000000000000000", + "isEnabled": true, + "rate": "74482000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ronin-testnet-saigon": { + "custom": { + "in": { + "capacity": "59400000000000000000000", + "isEnabled": true, + "rate": "99198000000000000000" + }, + "out": { + "capacity": "38200000000000000000000", + "isEnabled": true, + "rate": "63794000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "69700000000000000000000", + "isEnabled": true, + "rate": "116399000000000000000" + }, + "out": { + "capacity": "101703000000000000000", + "isEnabled": true, + "rate": "60900000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "58500000000000000000000", + "isEnabled": true, + "rate": "97695000000000000000" + }, + "out": { + "capacity": "33200000000000000000000", + "isEnabled": true, + "rate": "55444000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-andromeda-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "61100000000000000000000", + "isEnabled": true, + "rate": "102037000000000000000" + }, + "out": { + "capacity": "48100000000000000000000", + "isEnabled": true, + "rate": "80327000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "minBlockConfirmation": 5, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "47300000000000000000000", + "isEnabled": true, + "rate": "78991000000000000000" + }, + "out": { + "capacity": "30900000000000000000000", + "isEnabled": true, + "rate": "51603000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "69900000000000000000000", + "isEnabled": true, + "rate": "116733000000000000000" + }, + "out": { + "capacity": "48500000000000000000000", + "isEnabled": true, + "rate": "80995000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "41300000000000000000000", + "isEnabled": true, + "rate": "68971000000000000000" + }, + "out": { + "capacity": "52700000000000000000000", + "isEnabled": true, + "rate": "88009000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "41900000000000000000000", + "isEnabled": true, + "rate": "69973000000000000000" + }, + "out": { + "capacity": "33200000000000000000000", + "isEnabled": true, + "rate": "55444000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "34500000000000000000000", + "isEnabled": true, + "rate": "57615000000000000000" + }, + "out": { + "capacity": "66400000000000000000000", + "isEnabled": true, + "rate": "110888000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "31400000000000000000000", + "isEnabled": true, + "rate": "52438000000000000000" + }, + "out": { + "capacity": "47300000000000000000000", + "isEnabled": true, + "rate": "78991000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "minBlockConfirmation": 1, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "44400000000000000000000", + "isEnabled": true, + "rate": "74148000000000000000" + }, + "out": { + "capacity": "61600000000000000000000", + "isEnabled": true, + "rate": "102872000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "46400000000000000000000", + "isEnabled": true, + "rate": "77488000000000000000" + }, + "out": { + "capacity": "55000000000000000000000", + "isEnabled": true, + "rate": "91850000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "50200000000000000000000", + "isEnabled": true, + "rate": "83834000000000000000" + }, + "out": { + "capacity": "32300000000000000000000", + "isEnabled": true, + "rate": "53941000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "61800000000000000000000", + "isEnabled": true, + "rate": "103206000000000000000" + }, + "out": { + "capacity": "39200000000000000000000", + "isEnabled": true, + "rate": "65464000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-mode-1": { + "custom": { + "in": { + "capacity": "47000000000000000000000", + "isEnabled": true, + "rate": "78490000000000000000" + }, + "out": { + "capacity": "57500000000000000000000", + "isEnabled": true, + "rate": "96025000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "32600000000000000000000", + "isEnabled": true, + "rate": "54442000000000000000" + }, + "out": { + "capacity": "37300000000000000000000", + "isEnabled": true, + "rate": "62291000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "35600000000000000000000", + "isEnabled": true, + "rate": "59452000000000000000" + }, + "out": { + "capacity": "44000000000000000000000", + "isEnabled": true, + "rate": "73480000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-blast-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "35900000000000000000000", + "isEnabled": true, + "rate": "59953000000000000000" + }, + "out": { + "capacity": "43900000000000000000000", + "isEnabled": true, + "rate": "73313000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-kroma-1": { + "minBlockConfirmation": 1, + "remote": { + "wemix-testnet": { + "custom": { + "in": { + "capacity": "48200000000000000000000", + "isEnabled": true, + "rate": "80494000000000000000" + }, + "out": { + "capacity": "53500000000000000000000", + "isEnabled": true, + "rate": "89345000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-linea-1": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "63800000000000000000000", + "isEnabled": true, + "rate": "106546000000000000000" + }, + "out": { + "capacity": "65400000000000000000000", + "isEnabled": true, + "rate": "109218000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-mantle-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "63200000000000000000000", + "isEnabled": true, + "rate": "105544000000000000000" + }, + "out": { + "capacity": "35500000000000000000000", + "isEnabled": true, + "rate": "59285000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-mode-1": { + "minBlockConfirmation": 4, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "50700000000000000000000", + "isEnabled": true, + "rate": "84669000000000000000" + }, + "out": { + "capacity": "49500000000000000000000", + "isEnabled": true, + "rate": "82665000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "40900000000000000000000", + "isEnabled": true, + "rate": "68303000000000000000" + }, + "out": { + "capacity": "45900000000000000000000", + "isEnabled": true, + "rate": "76653000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "68400000000000000000000", + "isEnabled": true, + "rate": "114228000000000000000" + }, + "out": { + "capacity": "41500000000000000000000", + "isEnabled": true, + "rate": "69305000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "52900000000000000000000", + "isEnabled": true, + "rate": "88343000000000000000" + }, + "out": { + "capacity": "59700000000000000000000", + "isEnabled": true, + "rate": "99699000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "50400000000000000000000", + "isEnabled": true, + "rate": "84168000000000000000" + }, + "out": { + "capacity": "54800000000000000000000", + "isEnabled": true, + "rate": "91516000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "61100000000000000000000", + "isEnabled": true, + "rate": "102037000000000000000" + }, + "out": { + "capacity": "57200000000000000000000", + "isEnabled": true, + "rate": "95524000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "54100000000000000000000", + "isEnabled": true, + "rate": "90347000000000000000" + }, + "out": { + "capacity": "48600000000000000000000", + "isEnabled": true, + "rate": "81162000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "33300000000000000000000", + "isEnabled": true, + "rate": "55611000000000000000" + }, + "out": { + "capacity": "38900000000000000000000", + "isEnabled": true, + "rate": "64963000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "52100000000000000000000", + "isEnabled": true, + "rate": "87007000000000000000" + }, + "out": { + "capacity": "61200000000000000000000", + "isEnabled": true, + "rate": "102204000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-polygon-zkevm-1": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "46000000000000000000000", + "isEnabled": true, + "rate": "76820000000000000000" + }, + "out": { + "capacity": "42000000000000000000000", + "isEnabled": true, + "rate": "70140000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-scroll-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "41500000000000000000000", + "isEnabled": true, + "rate": "69305000000000000000" + }, + "out": { + "capacity": "57000000000000000000000", + "isEnabled": true, + "rate": "95190000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-xlayer-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "55100000000000000000000", + "isEnabled": true, + "rate": "92017000000000000000" + }, + "out": { + "capacity": "52200000000000000000000", + "isEnabled": true, + "rate": "87174000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ethereum-testnet-sepolia-zksync-1": { + "minBlockConfirmation": 9, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "69000000000000000000000", + "isEnabled": true, + "rate": "115230000000000000000" + }, + "out": { + "capacity": "48400000000000000000000", + "isEnabled": true, + "rate": "80828000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "polkadot-testnet-astar-shibuya": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "78490000000000000000", + "isEnabled": true, + "rate": "47000000000000000000" + }, + "out": { + "capacity": "92351000000000000000", + "isEnabled": true, + "rate": "55300000000000000000" + } + }, + "standard": { + "in": { + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" + }, + "out": { + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" + } + } + } + } + }, + "polygon-testnet-amoy": { + "minBlockConfirmation": 6, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "63700000000000000000000", + "isEnabled": true, + "rate": "106379000000000000000" + }, + "out": { + "capacity": "41100000000000000000000", + "isEnabled": true, + "rate": "68637000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "64800000000000000000000", + "isEnabled": true, + "rate": "108216000000000000000" + }, + "out": { + "capacity": "58500000000000000000000", + "isEnabled": true, + "rate": "97695000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "58400000000000000000000", + "isEnabled": true, + "rate": "97528000000000000000" + }, + "out": { + "capacity": "37100000000000000000000", + "isEnabled": true, + "rate": "61957000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "36600000000000000000000", + "isEnabled": true, + "rate": "61122000000000000000" + }, + "out": { + "capacity": "56400000000000000000000", + "isEnabled": true, + "rate": "94188000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "wemix-testnet": { + "custom": { + "in": { + "capacity": "32300000000000000000000", + "isEnabled": true, + "rate": "53941000000000000000" + }, + "out": { + "capacity": "30900000000000000000000", + "isEnabled": true, + "rate": "51603000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "xdai-testnet-chiado": { + "custom": { + "in": { + "capacity": "34200000000000000000000", + "isEnabled": true, + "rate": "57114000000000000000" + }, + "out": { + "capacity": "68200000000000000000000", + "isEnabled": true, + "rate": "113894000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "ronin-testnet-saigon": { + "minBlockConfirmation": 7, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "56900000000000000000000", + "isEnabled": true, + "rate": "95023000000000000000" + }, + "out": { + "capacity": "53000000000000000000000", + "isEnabled": true, + "rate": "88510000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "wemix-testnet": { + "minBlockConfirmation": 2, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "54300000000000000000000", + "isEnabled": true, + "rate": "90681000000000000000" + }, + "out": { + "capacity": "46600000000000000000000", + "isEnabled": true, + "rate": "77822000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "68900000000000000000000", + "isEnabled": true, + "rate": "115063000000000000000" + }, + "out": { + "capacity": "66400000000000000000000", + "isEnabled": true, + "rate": "110888000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "43200000000000000000000", + "isEnabled": true, + "rate": "72144000000000000000" + }, + "out": { + "capacity": "43200000000000000000000", + "isEnabled": true, + "rate": "72144000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "33200000000000000000000", + "isEnabled": true, + "rate": "55444000000000000000" + }, + "out": { + "capacity": "64100000000000000000000", + "isEnabled": true, + "rate": "107047000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-kroma-1": { + "custom": { + "in": { + "capacity": "48600000000000000000000", + "isEnabled": true, + "rate": "81162000000000000000" + }, + "out": { + "capacity": "37500000000000000000000", + "isEnabled": true, + "rate": "62625000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "63600000000000000000000", + "isEnabled": true, + "rate": "106212000000000000000" + }, + "out": { + "capacity": "59500000000000000000000", + "isEnabled": true, + "rate": "99365000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "63200000000000000000000", + "isEnabled": true, + "rate": "105544000000000000000" + }, + "out": { + "capacity": "35200000000000000000000", + "isEnabled": true, + "rate": "58784000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, + "xdai-testnet-chiado": { + "minBlockConfirmation": 10, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "63600000000000000000000", + "isEnabled": true, + "rate": "106212000000000000000" + }, + "out": { + "capacity": "36900000000000000000000", + "isEnabled": true, + "rate": "61623000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "bsc-testnet": { + "custom": { + "in": { + "capacity": "68700000000000000000000", + "isEnabled": true, + "rate": "114729000000000000000" + }, + "out": { + "capacity": "67200000000000000000000", + "isEnabled": true, + "rate": "112224000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "64900000000000000000000", + "isEnabled": true, + "rate": "108383000000000000000" + }, + "out": { + "capacity": "37200000000000000000000", + "isEnabled": true, + "rate": "62124000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "59800000000000000000000", + "isEnabled": true, + "rate": "99866000000000000000" + }, + "out": { + "capacity": "60800000000000000000000", + "isEnabled": true, + "rate": "101536000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "60300000000000000000000", + "isEnabled": true, + "rate": "100701000000000000000" + }, + "out": { + "capacity": "60500000000000000000000", + "isEnabled": true, + "rate": "101035000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "30800000000000000000000", + "isEnabled": true, + "rate": "51436000000000000000" + }, + "out": { + "capacity": "32800000000000000000000", + "isEnabled": true, + "rate": "54776000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "33200000000000000000000", + "isEnabled": true, + "rate": "55444000000000000000" + }, + "out": { + "capacity": "46400000000000000000000", + "isEnabled": true, + "rate": "77488000000000000000" + } + }, + "standard": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + } + }, + "syrupUSDC": { + "ethereum-testnet-sepolia": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "solana-devnet": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "syrupUSDT": { + "ethereum-testnet-sepolia": { + "minBlockConfirmation": 1, + "remote": { + "ethereum-testnet-sepolia-mantle-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "plasma-testnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-mantle-1": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "plasma-testnet": { + "minBlockConfirmation": 5, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, + "USDC": { + "avalanche-fuji-testnet": { + "minBlockConfirmation": 10, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia": { + "minBlockConfirmation": 8, + "remote": { + "avalanche-fuji-testnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-arbitrum-1": { + "minBlockConfirmation": 8, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-base-1": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "minBlockConfirmation": 3, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "ethereum-testnet-sepolia-unichain-1": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-devnet": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, + "polygon-testnet-amoy": { + "minBlockConfirmation": 2, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "solana-devnet": { + "custom": null, + "standard": null + } + } + }, + "solana-devnet": { + "minBlockConfirmation": 6, + "remote": { + "ethereum-testnet-sepolia": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-optimism-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "ethereum-testnet-sepolia-unichain-1": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, + "polygon-testnet-amoy": { + "custom": { + "in": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + }, + "out": { + "capacity": "1000000000", + "isEnabled": true, + "rate": "1000000" + } + }, + "standard": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + } +} diff --git a/src/components/CCIP/Chain/ChainTokenGrid.tsx b/src/components/CCIP/Chain/ChainTokenGrid.tsx index ad2502efcff..fd267bcfd56 100644 --- a/src/components/CCIP/Chain/ChainTokenGrid.tsx +++ b/src/components/CCIP/Chain/ChainTokenGrid.tsx @@ -53,8 +53,9 @@ function ChainTokenGrid({ tokens, network, environment }: ChainTokenGridProps) { tokenSymbol: data[key].symbol, tokenDecimals: data[key].decimals, tokenAddress: data[key].tokenAddress, - tokenPoolType: data[key].poolType, - tokenPoolAddress: data[key].poolAddress || "", + tokenPoolType: data[key].pool.type, + tokenPoolAddress: data[key].pool.address || "", + tokenPoolVersion: data[key].pool.version || "", explorer: network.explorer, chainType, } diff --git a/src/components/CCIP/Drawer/LaneDrawer.tsx b/src/components/CCIP/Drawer/LaneDrawer.tsx index cfc602ea850..18f91339c21 100644 --- a/src/components/CCIP/Drawer/LaneDrawer.tsx +++ b/src/components/CCIP/Drawer/LaneDrawer.tsx @@ -2,12 +2,11 @@ import Address from "~/components/AddressReact.tsx" import "../Tables/Table.css" import { Environment, LaneConfig, LaneFilter, Version } from "~/config/data/ccip/types.ts" import { getNetwork, getTokenData } from "~/config/data/ccip/data.ts" -import { displayCapacity, determineTokenMechanism, isTokenPaused } from "~/config/data/ccip/utils.ts" +import { determineTokenMechanism } from "~/config/data/ccip/utils.ts" import { useState } from "react" import LaneDetailsHero from "../ChainHero/LaneDetailsHero.tsx" import { getExplorerAddressUrl, getTokenIconUrl, fallbackTokenIconUrl } from "~/features/utils/index.ts" import TableSearchInput from "../Tables/TableSearchInput.tsx" -import RateTooltip from "../Tooltip/RateTooltip.tsx" import { Tooltip } from "~/features/common/Tooltip/Tooltip.tsx" import { ChainType, ExplorerInfo } from "@config/types.ts" @@ -63,7 +62,7 @@ function LaneDrawer({ <div className="ccip-table__filters"> <div> <div className="ccip-table__filters-title"> - Tokens <span>({lane?.supportedTokens ? Object.keys(lane.supportedTokens).length : 0})</span> + Tokens <span>({lane?.supportedTokens ? lane.supportedTokens.length : 0})</span> </div> </div> <TableSearchInput search={search} setSearch={setSearch} /> @@ -124,8 +123,8 @@ function LaneDrawer({ </thead> <tbody> {lane.supportedTokens && - Object.keys(lane.supportedTokens) - ?.filter((token) => token.toLowerCase().includes(search.toLowerCase())) + lane.supportedTokens + .filter((token) => token.toLowerCase().includes(search.toLowerCase())) .map((token, index) => { const data = getTokenData({ environment, @@ -135,13 +134,10 @@ function LaneDrawer({ if (!Object.keys(data).length) return null const logo = getTokenIconUrl(token) - // Check if token is paused - const tokenPaused = isTokenPaused( - data[sourceNetwork.key].decimals, - lane.supportedTokens?.[token]?.rateLimiterConfig?.[ - inOutbound === LaneFilter.Inbound ? "in" : "out" - ] - ) + // TODO: Fetch rate limits from API for both inbound and outbound + // Token pause detection requires rate limiter data from API + // A token is paused when rate limit capacity is 0 + const tokenPaused = false return ( <tr key={index} className={tokenPaused ? "ccip-table__row--paused" : ""}> @@ -179,35 +175,25 @@ function LaneDrawer({ <td> {inOutbound === LaneFilter.Outbound ? determineTokenMechanism( - data[sourceNetwork.key].poolType, - data[destinationNetwork.key].poolType + data[sourceNetwork.key].pool.type, + data[destinationNetwork.key].pool.type ) : determineTokenMechanism( - data[destinationNetwork.key].poolType, - data[sourceNetwork.key].poolType + data[destinationNetwork.key].pool.type, + data[sourceNetwork.key].pool.type )} </td> <td> - {lane.supportedTokens && - displayCapacity( - data[sourceNetwork.key].decimals, - token, - lane.supportedTokens[token]?.rateLimiterConfig?.[ - inOutbound === LaneFilter.Inbound ? "in" : "out" - ] - )} + {/* TODO: Fetch rate limits from API for both inbound and outbound + GET /api/ccip/v1/lanes/by-internal-id/{source}/{destination}/supported-tokens?environment={environment} + Response will contain both standard and custom rate limits per token */} + Disabled </td> <td className="rate-tooltip-cell"> - {lane.supportedTokens && ( - <RateTooltip - destinationLane={lane.supportedTokens[token]} - inOutbound={inOutbound} - symbol={token} - decimals={data[sourceNetwork.key].decimals} - position="left" - /> - )} + {/* TODO: Fetch rate limits from API for both inbound and outbound + Display refill rate from standard.in/out or custom.in/out based on inOutbound filter */} + Disabled </td> </tr> ) @@ -217,8 +203,9 @@ function LaneDrawer({ </div> <div className="ccip-table__notFound"> {lane.supportedTokens && - Object.keys(lane.supportedTokens)?.filter((lane) => lane.toLowerCase().includes(search.toLowerCase())) - .length === 0 && <>No tokens found</>} + lane.supportedTokens.filter((token) => token.toLowerCase().includes(search.toLowerCase())).length === 0 && ( + <>No tokens found</> + )} </div> </div> </> diff --git a/src/components/CCIP/Drawer/TokenDrawer.tsx b/src/components/CCIP/Drawer/TokenDrawer.tsx index c883f61d77f..77bea831f25 100644 --- a/src/components/CCIP/Drawer/TokenDrawer.tsx +++ b/src/components/CCIP/Drawer/TokenDrawer.tsx @@ -8,20 +8,17 @@ import { SupportedTokenConfig, Version, LaneFilter, - displayCapacity, determineTokenMechanism, PoolType, getTokenData, LaneConfig, } from "~/config/data/ccip/index.ts" -import { isTokenPaused } from "~/config/data/ccip/utils.ts" import { useState } from "react" import { ChainType, ExplorerInfo, SupportedChain } from "~/config/index.ts" import LaneDrawer from "../Drawer/LaneDrawer.tsx" import TableSearchInput from "../Tables/TableSearchInput.tsx" import Tabs from "../Tables/Tabs.tsx" import { Tooltip } from "~/features/common/Tooltip/Tooltip.tsx" -import RateTooltip from "../Tooltip/RateTooltip.tsx" function TokenDrawer({ token, @@ -84,7 +81,7 @@ function TokenDrawer({ console.error(`No token data found for ${token.id} on ${network.key} -> ${destinationChain}`) return null } - const destinationPoolType = destinationTokenData.poolType + const destinationPoolType = destinationTokenData.pool.type if (!destinationPoolType) { console.error(`No pool type found for ${token.id} on ${network.key} -> ${destinationChain}`) return null @@ -100,11 +97,11 @@ function TokenDrawer({ console.error(`No lane data found for ${token.id} on ${network.key} -> ${destinationChain}`) return null } - if (!laneData.supportedTokens) { + if (!laneData.supportedTokens || !Array.isArray(laneData.supportedTokens)) { console.error(`No supported tokens found for ${token.id} on ${network.key} -> ${destinationChain}`) return null } - if (!(token.id in laneData.supportedTokens)) { + if (!laneData.supportedTokens.includes(token.id)) { console.error(`${token.id} not found in supported tokens for ${network.key} -> ${destinationChain}`) return null } @@ -216,13 +213,10 @@ function TokenDrawer({ .map(({ networkDetails, laneData, destinationChain, destinationPoolType }) => { if (!laneData || !networkDetails) return null - // Check if token is paused on this lane - const tokenPaused = isTokenPaused( - network.tokenDecimals, - destinationLanes[destinationChain].rateLimiterConfig?.[ - inOutbound === LaneFilter.Inbound ? "in" : "out" - ] - ) + // TODO: Fetch rate limits from API for both inbound and outbound + // Token pause detection requires rate limiter data from API + // A token is paused when rate limit capacity is 0 + const tokenPaused = false return ( <tr key={networkDetails.name} className={tokenPaused ? "ccip-table__row--paused" : ""}> @@ -262,21 +256,15 @@ function TokenDrawer({ </button> </td> <td> - {displayCapacity( - network.tokenDecimals, - network.tokenSymbol, - destinationLanes[destinationChain].rateLimiterConfig?.[ - inOutbound === LaneFilter.Inbound ? "in" : "out" - ] - )} + {/* TODO: Fetch rate limits from API for both inbound and outbound + GET /api/ccip/v1/lanes/by-internal-id/{source}/{destination}/supported-tokens?environment={environment} + Response will contain both standard and custom rate limits per token */} + Disabled </td> <td> - <RateTooltip - destinationLane={destinationLanes[destinationChain]} - inOutbound={inOutbound} - symbol={network.tokenSymbol} - decimals={network.tokenDecimals} - /> + {/* TODO: Fetch rate limits from API for both inbound and outbound + Display refill rate from standard.in/out or custom.in/out based on inOutbound filter */} + Disabled </td> <td> {inOutbound === LaneFilter.Outbound diff --git a/src/components/CCIP/Search/Search.tsx b/src/components/CCIP/Search/Search.tsx index f869bf20860..92b0c776971 100644 --- a/src/components/CCIP/Search/Search.tsx +++ b/src/components/CCIP/Search/Search.tsx @@ -273,10 +273,8 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) { {lane.sourceNetwork.name} {">"} {lane.destinationNetwork.name} {!small && ( <span> - {lane?.lane?.supportedTokens ? Object.keys(lane.lane.supportedTokens).length : 0}{" "} - {lane?.lane?.supportedTokens && Object.keys(lane.lane.supportedTokens).length > 1 - ? "tokens" - : "token"} + {lane?.lane?.supportedTokens ? lane.lane.supportedTokens.length : 0}{" "} + {lane?.lane?.supportedTokens && lane.lane.supportedTokens.length > 1 ? "tokens" : "token"} </span> )} </button> diff --git a/src/components/CCIP/Tables/TokenChainsTable.tsx b/src/components/CCIP/Tables/TokenChainsTable.tsx index ca40a294da8..9f3add6065c 100644 --- a/src/components/CCIP/Tables/TokenChainsTable.tsx +++ b/src/components/CCIP/Tables/TokenChainsTable.tsx @@ -23,6 +23,7 @@ interface TableProps { tokenAddress: string tokenPoolType: PoolType tokenPoolAddress: string + tokenPoolVersion: string explorer: ExplorerInfo }[] token: { @@ -60,6 +61,9 @@ function TokenChainsTable({ networks, token, lanes, environment }: TableProps) { <th>Token address</th> <th>Token pool type</th> <th>Token pool address</th> + <th>Pool version</th> + <th>Custom finality</th> + <th>Min Blocks required</th> </tr> </thead> <tbody> @@ -139,6 +143,18 @@ function TokenChainsTable({ networks, token, lanes, environment }: TableProps) { endLength={6} /> </td> + <td>{network.tokenPoolVersion}</td> + <td> + {/* TODO: Fetch from API - GET /api/ccip/v1/tokens/{tokenCanonicalSymbol}/finality?environment={environment} + Custom finality is derived from minBlockConfirmation > 0 + Display: "Yes" | "No" | "N/A" (with tooltip for unavailable) */} + - + </td> + <td> + {/* TODO: Fetch from API - GET /api/ccip/v1/tokens/{tokenCanonicalSymbol}/finality?environment={environment} + Display minBlockConfirmation value or "-" if custom finality is disabled/unavailable */} + - + </td> </tr> ) })} diff --git a/src/components/CCIP/Token/Token.astro b/src/components/CCIP/Token/Token.astro index 58071e03c39..9ba14b50e4f 100644 --- a/src/components/CCIP/Token/Token.astro +++ b/src/components/CCIP/Token/Token.astro @@ -150,8 +150,9 @@ const tokenStructuredData = generateTokenStructuredData(token, environment, chai tokenSymbol: data[key]?.symbol ?? "", tokenDecimals: data[key]?.decimals ?? 0, tokenAddress: data[key]?.tokenAddress ?? "", - tokenPoolType: data[key]?.poolType, - tokenPoolAddress: data[key]?.poolAddress ?? "", + tokenPoolType: data[key]?.pool.type, + tokenPoolAddress: data[key]?.pool.address ?? "", + tokenPoolVersion: data[key]?.pool.version ?? "", explorer: explorer, chainType: chainType, } diff --git a/src/config/data/ccip/data.ts b/src/config/data/ccip/data.ts index cfc55662854..9773dee205b 100644 --- a/src/config/data/ccip/data.ts +++ b/src/config/data/ccip/data.ts @@ -272,13 +272,14 @@ export const getAllSupportedTokens = (params: { environment: Environment; versio Object.entries(laneReferenceData).forEach(([destinationChainRdd, destinationLaneReferenceData]) => { const supportedTokens = destinationLaneReferenceData.supportedTokens - if (supportedTokens) { - Object.entries(supportedTokens).forEach(([token, tokenConfig]) => { + if (supportedTokens && Array.isArray(supportedTokens)) { + supportedTokens.forEach((token) => { const destinationChain = directoryToSupportedChain(destinationChainRdd) tokens[token] = tokens[token] || {} tokens[token][sourceChain] = tokens[token][sourceChain] || {} - tokens[token][sourceChain][destinationChain] = tokenConfig + // Rate limiter config is now in separate files, store empty config + tokens[token][sourceChain][destinationChain] = {} }) } }) @@ -316,8 +317,8 @@ export const getTokenMechanism = (params: { const tokenConfig = tokensReferenceData[params.token] const sourceChainPoolInfo = tokenConfig[sourceChainRdd] const destinationChainPoolInfo = tokenConfig[destinationChainRdd] - const sourceChainPoolType = sourceChainPoolInfo.poolType - const destinationChainPoolType = destinationChainPoolInfo.poolType + const sourceChainPoolType = sourceChainPoolInfo.pool.type + const destinationChainPoolType = destinationChainPoolInfo.pool.type const tokenMechanism = determineTokenMechanism(sourceChainPoolType, destinationChainPoolType) return tokenMechanism } @@ -474,7 +475,7 @@ export const getTokensOfChain = ({ chain, filter }: { chain: string; filter: Env return Object.keys(tokensData).filter((token) => { const tokenData = tokensData[token] // Check if tokenData for the given chain exists and isn't 'feeTokenOnly' - if (tokenData[chain] && tokenData[chain].poolType !== "feeTokenOnly") { + if (tokenData[chain] && tokenData[chain].pool.type !== "feeTokenOnly") { const lanes = getAllTokenLanes({ token, environment: filter }) // Ensure there is at least one lane and that the lane exists for the given chain return Object.keys(lanes).length > 0 && lanes[chain] && Object.keys(lanes[chain]).length > 0 @@ -593,7 +594,7 @@ export const getChainsOfToken = ({ token, filter }: { token: string; filter: Env // Get all valid chains for the given token return Object.entries(tokensData[token]) - .filter(([, tokenData]) => tokenData.poolType !== "feeTokenOnly") + .filter(([, tokenData]) => tokenData.pool.type !== "feeTokenOnly") .filter(([chain]) => { const lanes = getAllTokenLanes({ token, environment: filter }) return Object.keys(lanes).length > 0 && lanes[chain] && Object.keys(lanes[chain]).length > 0 @@ -677,11 +678,13 @@ export function getAllTokenLanes({ for (const destinationChain in sourceData) { const destinationData = sourceData[destinationChain] - // Check if the token is supported - if (destinationData?.supportedTokens?.[token]) { + // Check if the token is supported (supportedTokens is now an array) + const supportedTokens = destinationData?.supportedTokens + if (Array.isArray(supportedTokens) && supportedTokens.includes(token)) { allDestinationLanes[sourceChain] = { ...allDestinationLanes[sourceChain], - [destinationChain]: destinationData.supportedTokens[token], + // Rate limiter config is now in separate files, store empty config + [destinationChain]: {}, } } } diff --git a/src/config/data/ccip/types.ts b/src/config/data/ccip/types.ts index 2c208a4220d..ac6f97c6547 100644 --- a/src/config/data/ccip/types.ts +++ b/src/config/data/ccip/types.ts @@ -17,7 +17,7 @@ export type SupportedTokensConfig = { } export type LaneConfig = { - supportedTokens?: SupportedTokensConfig + supportedTokens?: string[] rateLimiterConfig?: RateLimiterConfig onRamp: { address: string @@ -36,11 +36,19 @@ export type DestinationsLaneConfig = { export type PoolType = "lockRelease" | "burnMint" | "usdc" | "feeTokenOnly" +export type PoolRawType = "LockRelease" | "BurnMint" | "usdc" + +type Pool = { + address?: string + rawType: PoolRawType + type: PoolType + version: string +} + type PoolInfo = { tokenAddress: string allowListEnabled: boolean - poolAddress?: string - poolType: PoolType + pool: Pool name?: string symbol: string decimals: number diff --git a/src/config/data/ccip/v1_2_0/mainnet/lanes.json b/src/config/data/ccip/v1_2_0/mainnet/lanes.json index 7693213e7e8..238879c00b1 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/mainnet/lanes.json @@ -21,22 +21,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "W0G": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["W0G"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -48,22 +33,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "W0G": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["W0G"] }, "hyperliquid-mainnet": { "offRamp": { @@ -86,78 +56,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "W0G": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "114000000000000000000", - "isEnabled": true, - "rate": "32000000000000000" - }, - "out": { - "capacity": "114000000000000000000", - "isEnabled": true, - "rate": "32000000000000000" - } - } - } - } + "supportedTokens": ["LINK", "USDC", "USDT", "W0G", "wstETH"] }, "monad-mainnet": { "offRamp": { @@ -193,36 +92,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LINK", "USD1"] } }, "abstract-mainnet": { @@ -317,50 +187,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USD1", "brBTC", "uniBTC"] }, "ethereum-mainnet-arbitrum-1": { "offRamp": { @@ -383,22 +210,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388000000" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388000000" - } - } - } - } + "supportedTokens": ["LINK"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -454,64 +266,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388000000" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388000000" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LINK", "USD1", "brBTC", "uniBTC"] }, "plasma-mainnet": { "offRamp": { @@ -534,22 +289,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388000000" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388000000" - } - } - } - } + "supportedTokens": ["LINK"] }, "xdai-mainnet": { "offRamp": { @@ -585,22 +325,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["YBTC.B"] }, "bitcoin-mainnet-bob-1": { "offRamp": { @@ -612,36 +337,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "bsc-mainnet": { "offRamp": { @@ -653,134 +349,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "NXPC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "LBTC", "LEND", "NXPC", "SHIB", "SolvBTC", "YBTC.B", "savBTC", "xSolvBTC"] }, "core-mainnet": { "offRamp": { @@ -803,218 +372,23 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "30000000000000000000000000", - "isEnabled": true, - "rate": "50000000000000000000000" - }, - "out": { - "capacity": "30000000000000000000000000", - "isEnabled": true, - "rate": "50000000000000000000000" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "GRT": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SDY": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "BOLD", + "GHO", + "GRT", + "LEND", + "SDY", + "SHIB", + "SILO", + "SolvBTC", + "USDC", + "USDM", + "VRTX", + "wstLINK", + "xSILO", + "xSolvBTC" + ] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -1026,246 +400,25 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BYTES": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "GRT": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "11574000000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "11574000000000000" - } - } - }, - "MYST": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "ORNG": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "BOLD", + "BYTES", + "GHO", + "GRT", + "LBTC", + "LEND", + "MYST", + "Memento", + "ORNG", + "SHIB", + "SolvBTC", + "USDC", + "USDM", + "VRTX", + "wstLINK", + "xSolvBTC" + ] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -1277,50 +430,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["GHO", "SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-linea-1": { "offRamp": { @@ -1332,148 +442,18 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "avBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avETHx": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "SolvBTC", + "avBTC", + "avETH", + "avETHx", + "avUSD", + "avUSDx", + "savBTC", + "savETH", + "savUSD", + "xSolvBTC" + ] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -1485,64 +465,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - } - } + "supportedTokens": ["BETS", "BOLD", "USDC", "USDM"] }, "ethereum-mainnet-unichain-1": { "offRamp": { @@ -1554,36 +477,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "USDC"] }, "ethereum-mainnet-xlayer-1": { "offRamp": { @@ -1606,22 +500,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - } - } + "supportedTokens": ["USDM"] }, "everclear-mainnet": { "offRamp": { @@ -1644,470 +523,41 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "avBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avETHx": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "30000000000000000000000000", - "isEnabled": true, - "rate": "50000000000000000000000" - }, - "out": { - "capacity": "30000000000000000000000000", - "isEnabled": true, - "rate": "50000000000000000000000" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BYTES": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "EmCH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "1100000000000000000000", - "isEnabled": true, - "rate": "12731481000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "11574000000000000" - } - } - }, - "MYST": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "oXAUT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "savBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SDY": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "tETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TREE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstPOL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": [ + "BETS", + "BOLD", + "BONE", + "BYTES", + "EmCH", + "GHO", + "LBTC", + "LEASH", + "LEND", + "MYST", + "Memento", + "SDY", + "SHIB", + "SILO", + "SolvBTC", + "TREE", + "USDC", + "USDM", + "YBTC.B", + "avBTC", + "avETH", + "avETHx", + "avUSD", + "avUSDx", + "oXAUT", + "savBTC", + "savETH", + "savUSD", + "tETH", + "wstLINK", + "wstPOL", + "xSILO", + "xSolvBTC" + ] }, "matic-mainnet": { "offRamp": { @@ -2119,134 +569,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "30000000000000000000000000", - "isEnabled": true, - "rate": "50000000000000000000000" - }, - "out": { - "capacity": "30000000000000000000000000", - "isEnabled": true, - "rate": "50000000000000000000000" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "1100000000000000000000", - "isEnabled": true, - "rate": "12731481000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "11574000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstPOL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["BETS", "LEND", "Memento", "SolvBTC", "USDC", "USDM", "wstLINK", "wstPOL", "xSolvBTC"] }, "monad-mainnet": { "offRamp": { @@ -2258,22 +581,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "nexon-mainnet-henesys": { "offRamp": { @@ -2296,36 +604,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["GHO", "savUSD"] }, "polygon-mainnet-katana": { "offRamp": { @@ -2337,36 +616,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LBTC", "savUSD"] }, "sei-mainnet": { "offRamp": { @@ -2378,36 +628,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["SolvBTC", "VRTX"] }, "shibarium-mainnet": { "offRamp": { @@ -2430,22 +651,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDC"] }, "sonic-mainnet": { "offRamp": { @@ -2457,78 +663,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "SILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BOLD", "LBTC", "SILO", "VRTX", "xSILO"] }, "stable-mainnet": { "offRamp": { @@ -2540,22 +675,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "wemix-mainnet": { "offRamp": { @@ -2567,22 +687,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "una.WEMIX": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - } - } + "supportedTokens": ["una.WEMIX"] }, "xdai-mainnet": { "offRamp": { @@ -2594,22 +699,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["GHO"] } }, "berachain-mainnet": { @@ -2634,50 +724,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.BERA": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "SolvBTC.BERA", "xSolvBTC"] }, "bsc-mainnet": { "offRamp": { @@ -2689,78 +736,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "beraBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.BERA": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["BR", "SolvBTC", "SolvBTC.BERA", "beraBTC", "xSolvBTC"] }, "ethereum-mainnet-arbitrum-1": { "offRamp": { @@ -2772,50 +748,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DOLO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BOLD", "DOLO", "sDOLA"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -2827,50 +760,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "1000000000000000000", - "isEnabled": true, - "rate": "100000000000000000" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BOLD", "BR", "sDOLA"] }, "ethereum-mainnet-worldchain-1": { "offRamp": { @@ -2904,162 +794,19 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "1000000000000000000", - "isEnabled": true, - "rate": "100000000000000000" - } - } - }, - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "DOLO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "pufETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.BERA": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "BOLD", + "BR", + "DOLO", + "LBTC", + "SolvBTC", + "SolvBTC.BERA", + "brBTC", + "pufETH", + "sDOLA", + "uniBTC", + "xSolvBTC" + ] }, "matic-mainnet": { "offRamp": { @@ -3106,22 +853,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "THE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["THE"] }, "mainnet": { "offRamp": { @@ -3146,22 +878,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["YBTC.B"] }, "bsc-mainnet": { "offRamp": { @@ -3173,36 +890,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BTR", "YBTC.B"] }, "mainnet": { "offRamp": { @@ -3214,106 +902,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "50000000000", - "isEnabled": true, - "rate": "10000000" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "50000000000", - "isEnabled": true, - "rate": "10000000" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "18000000000000000000", - "isEnabled": true, - "rate": "5000000000000000" - } - } - }, - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "18000000000000000000", - "isEnabled": true, - "rate": "5000000000000000" - } - } - }, - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BTR", "USDC", "USDT", "WETH", "YBTC.B", "uniBTC", "wstETH"] }, "plasma-mainnet": { "offRamp": { @@ -3325,22 +914,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["YBTC.B"] }, "plume-mainnet": { "offRamp": { @@ -3352,22 +926,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["YBTC.B"] }, "solana-mainnet": { "offRamp": { @@ -3379,22 +938,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["YBTC.B"] } }, "bitcoin-mainnet-bob-1": { @@ -3408,36 +952,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "berachain-mainnet": { "offRamp": { @@ -3449,50 +964,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.BERA": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "SolvBTC.BERA", "xSolvBTC"] }, "bsc-mainnet": { "offRamp": { @@ -3504,78 +976,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.BERA": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.JUP": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["BOB", "SolvBTC", "SolvBTC.BERA", "SolvBTC.JUP", "xSolvBTC"] }, "corn-mainnet": { "offRamp": { @@ -3598,36 +999,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -3639,50 +1011,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "USDT", "xSolvBTC"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -3694,36 +1023,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-linea-1": { "offRamp": { @@ -3735,36 +1035,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-zksync-1": { "offRamp": { @@ -3776,36 +1047,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "mainnet": { "offRamp": { @@ -3817,106 +1059,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.BERA": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["BOB", "SolvBTC", "SolvBTC.BERA", "USDC", "USDT", "uniBTC", "xSolvBTC"] }, "matic-mainnet": { "offRamp": { @@ -3928,36 +1071,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "sei-mainnet": { "offRamp": { @@ -3969,36 +1083,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "soneium-mainnet": { "offRamp": { @@ -4010,50 +1095,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.JUP": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "SolvBTC.JUP", "xSolvBTC"] }, "sonic-mainnet": { "offRamp": { @@ -4065,22 +1107,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["USDT"] } }, "bitcoin-mainnet-botanix": { @@ -4094,22 +1121,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["USDT"] } }, "bitcoin-mainnet-bsquared-1": { @@ -4123,22 +1135,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "stBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["stBTC"] }, "mainnet": { "offRamp": { @@ -4150,22 +1147,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "11574" - } - } - } - } + "supportedTokens": ["uniBTC"] }, "soneium-mainnet": { "offRamp": { @@ -4249,50 +1231,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USD1", "brBTC", "uniBTC"] }, "avalanche-mainnet": { "offRamp": { @@ -4304,134 +1243,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "NXPC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "LBTC", "LEND", "NXPC", "SHIB", "SolvBTC", "YBTC.B", "savBTC", "xSolvBTC"] }, "berachain-mainnet": { "offRamp": { @@ -4443,78 +1255,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "beraBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.BERA": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["BR", "SolvBTC", "SolvBTC.BERA", "beraBTC", "xSolvBTC"] }, "binance-smart-chain-mainnet-opbnb-1": { "offRamp": { @@ -4526,22 +1267,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "THE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["THE"] }, "bitcoin-mainnet-bitlayer-1": { "offRamp": { @@ -4553,36 +1279,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BTR", "YBTC.B"] }, "bitcoin-mainnet-bob-1": { "offRamp": { @@ -4594,78 +1291,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.BERA": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.JUP": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["BOB", "SolvBTC", "SolvBTC.BERA", "SolvBTC.JUP", "xSolvBTC"] }, "bitcoin-mainnet-bsquared-1": { "offRamp": { @@ -4677,22 +1303,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "stBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["stBTC"] }, "bittensor-mainnet": { "offRamp": { @@ -4715,274 +1326,27 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CKP": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "28000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "28000000000000000000" - } - } - }, - "DOBO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LAND": { - "rateLimiterConfig": { - "in": { - "capacity": "20000000000000000000000", - "isEnabled": true, - "rate": "5550000000000000000" - }, - "out": { - "capacity": "20000000000000000000000", - "isEnabled": true, - "rate": "5550000000000000000" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - }, - "RDP": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "580000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "580000000000000000" - } - } - }, - "SDT": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "138880000000000000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "138880000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STABLE": { - "rateLimiterConfig": { - "in": { - "capacity": "7000000000000000000000", - "isEnabled": true, - "rate": "81000000000000000" - }, - "out": { - "capacity": "7000000000000000000000", - "isEnabled": true, - "rate": "81000000000000000" - } - } - }, - "STBU": { - "rateLimiterConfig": { - "in": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDFI": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "570000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "570000000000000000" - } - } - }, - "VSN": { - "rateLimiterConfig": { - "in": { - "capacity": "82500000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - }, - "out": { - "capacity": "75000000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - } - } - }, - "WECO": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - }, - "out": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "WSDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "CKP", + "DOBO", + "IXT", + "LAND", + "LEND", + "RDP", + "SDT", + "STABLE", + "STBU", + "SolvBTC", + "USDFI", + "VSN", + "WECO", + "WMTX", + "WSDM", + "mBTC", + "wUSDx", + "xSolvBTC" + ] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -4994,330 +1358,31 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "$PAAL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "AISTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BKN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "CHEX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DOBO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "RIZE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SAS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SKYA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SNOW": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "TRADE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "UNIO": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000000", - "isEnabled": true, - "rate": "13888880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000000", - "isEnabled": true, - "rate": "13888880000000000000000" - } - } - }, - "USDO": { - "rateLimiterConfig": { - "in": { - "capacity": "10500000000000000000000000", - "isEnabled": true, - "rate": "1160000000000000000000" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "1160000000000000000000" - } - } - }, - "WHY": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "$PAAL", + "AISTR", + "BETS", + "BKN", + "BR", + "CHEX", + "DOBO", + "IXT", + "LBTC", + "LEND", + "RIZE", + "SAS", + "SKYA", + "SNOW", + "SolvBTC", + "TRADE", + "UNIO", + "USDO", + "WHY", + "WMTX", + "wUSDx", + "xGold", + "xSolvBTC" + ] }, "ethereum-mainnet-blast-1": { "offRamp": { @@ -5340,22 +1405,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "enzoBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["enzoBTC"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -5367,36 +1417,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-linea-1": { "offRamp": { @@ -5408,92 +1429,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "AISTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "TURTLE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["AISTR", "SolvBTC", "TURTLE", "savBTC", "savUSD", "xSolvBTC"] }, "ethereum-mainnet-mantle-1": { "offRamp": { @@ -5516,22 +1452,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["wUSDx"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -5543,36 +1464,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["BETS", "wUSDx"] }, "ethereum-mainnet-unichain-1": { "offRamp": { @@ -5584,22 +1476,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS"] }, "ethereum-mainnet-xlayer-1": { "offRamp": { @@ -5633,50 +1510,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xGold", "xSolvBTC"] }, "kaia-mainnet": { "offRamp": { @@ -5699,806 +1533,65 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "$PAAL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "1XMM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "AISTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BANK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BARD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BKN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "BTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CHEX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DOBO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "EDEN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FF": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FHE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "JCT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - }, - "mwBETH": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000", - "isEnabled": true, - "rate": "46000000000000000" - }, - "out": { - "capacity": "500000000000000000000", - "isEnabled": true, - "rate": "46000000000000000" - } - } - }, - "RIZE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SAS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SDT": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "138880000000000000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "138880000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SKYA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.BERA": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STABLE": { - "rateLimiterConfig": { - "in": { - "capacity": "7000000000000000000000", - "isEnabled": true, - "rate": "81000000000000000" - }, - "out": { - "capacity": "7000000000000000000000", - "isEnabled": true, - "rate": "81000000000000000" - } - } - }, - "sUSD1+": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TRADE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TREE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TURBO": { - "rateLimiterConfig": { - "in": { - "capacity": "7000000000000000000000000", - "isEnabled": true, - "rate": "1944444400000000000000" - }, - "out": { - "capacity": "7000000000000000000000000", - "isEnabled": true, - "rate": "1944444400000000000000" - } - } - }, - "TURTLE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "UNIO": { - "rateLimiterConfig": { - "in": { - "capacity": "15000000000000000000000000", - "isEnabled": true, - "rate": "520000000000000000000" - }, - "out": { - "capacity": "15000000000000000000000000", - "isEnabled": true, - "rate": "520000000000000000000" - } - } - }, - "USD0": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDf": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDFI": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "570000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "570000000000000000" - } - } - }, - "USDO": { - "rateLimiterConfig": { - "in": { - "capacity": "10500000000000000000000000", - "isEnabled": true, - "rate": "1160000000000000000000" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "1160000000000000000000" - } - } - }, - "USUAL": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - } - } - }, - "VOOI": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "VSN": { - "rateLimiterConfig": { - "in": { - "capacity": "82500000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - }, - "out": { - "capacity": "75000000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - } - } - }, - "WECO": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - }, - "out": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - } - } - }, - "WHY": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WLFI": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "231500000" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "231500000" - } - } - }, - "WSDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "$PAAL", + "1XMM", + "AISTR", + "BANK", + "BARD", + "BETS", + "BKN", + "BOB", + "BONE", + "BR", + "BTR", + "CHEX", + "DOBO", + "EDEN", + "FF", + "FHE", + "IXT", + "JCT", + "LBTC", + "LEASH", + "LEND", + "RIZE", + "SAS", + "SDT", + "SHIB", + "SKYA", + "STABLE", + "SolvBTC", + "SolvBTC.BERA", + "TRADE", + "TREE", + "TURBO", + "TURTLE", + "UNIO", + "USD0", + "USD1", + "USDFI", + "USDO", + "USDf", + "USUAL", + "VOOI", + "VSN", + "WECO", + "WHY", + "WLFI", + "WMTX", + "WSDM", + "brBTC", + "mBTC", + "mwBETH", + "sUSD1+", + "savBTC", + "savUSD", + "uniBTC", + "wUSDx", + "xGold", + "xSolvBTC" + ] }, "matic-mainnet": { "offRamp": { @@ -6510,204 +1603,22 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "1XMM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LAND": { - "rateLimiterConfig": { - "in": { - "capacity": "20000000000000000000000", - "isEnabled": true, - "rate": "5550000000000000000" - }, - "out": { - "capacity": "20000000000000000000000", - "isEnabled": true, - "rate": "5550000000000000000" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "METO": { - "rateLimiterConfig": { - "in": { - "capacity": "76923077000000000000000000", - "isEnabled": true, - "rate": "21367520000000000000000" - }, - "out": { - "capacity": "76923077000000000000000000", - "isEnabled": true, - "rate": "21367520000000000000000" - } - } - }, - "RIZE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "THE": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "417000000000000000000" - }, - "out": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "417000000000000000000" - } - } - }, - "TRADE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WECO": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - }, - "out": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - } - } - }, - "WSDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "1XMM", + "BETS", + "IXT", + "LAND", + "LEND", + "METO", + "RIZE", + "SolvBTC", + "THE", + "TRADE", + "WECO", + "WSDM", + "xGold", + "xSolvBTC" + ] }, "mind-mainnet": { "offRamp": { @@ -6719,22 +1630,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "FHE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["FHE"] }, "monad-mainnet": { "offRamp": { @@ -6746,22 +1642,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "plume-mainnet": { "offRamp": { @@ -6784,36 +1665,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LBTC", "savUSD"] }, "sei-mainnet": { "offRamp": { @@ -6825,36 +1677,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "solana-mainnet": { "offRamp": { @@ -6866,190 +1689,21 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "5800000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "elizaOS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FHE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "ILMT": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000", - "isEnabled": true, - "rate": "277777777778" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "2777777777780000000000" - } - } - }, - "KNET": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "MEW": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000", - "isEnabled": true, - "rate": "34722" - }, - "out": { - "capacity": "7500000000000000000", - "isEnabled": true, - "rate": "347220000000000" - } - } - }, - "SolvBTC.JUP": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "57870" - }, - "out": { - "capacity": "50000000000000000000", - "isEnabled": true, - "rate": "578700000000000" - } - } - }, - "USELESS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WLFI": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "XLAB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "BR", + "FHE", + "ILMT", + "KNET", + "MEW", + "SolvBTC", + "SolvBTC.JUP", + "USELESS", + "WLFI", + "WMTX", + "XLAB", + "elizaOS", + "xSolvBTC" + ] }, "soneium-mainnet": { "offRamp": { @@ -7061,36 +1715,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SKYA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC.JUP": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "1157400000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "1157400000000000" - } - } - } - } + "supportedTokens": ["SKYA", "SolvBTC.JUP"] }, "sonic-mainnet": { "offRamp": { @@ -7102,50 +1727,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["LBTC", "mBTC", "wUSDx"] }, "stable-mainnet": { "offRamp": { @@ -7157,22 +1739,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "tac-mainnet": { "offRamp": { @@ -7195,22 +1762,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "una.WEMIX": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - } - } + "supportedTokens": ["una.WEMIX"] }, "xdai-mainnet": { "offRamp": { @@ -7246,22 +1798,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["USDT"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -7295,22 +1832,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["USDT"] }, "ethereum-mainnet-unichain-1": { "offRamp": { @@ -7366,78 +1888,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SHIB", "USDT"] }, "matic-mainnet": { "offRamp": { @@ -7552,36 +2003,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - } - } + "supportedTokens": ["LBTC", "uniBTC"] }, "matic-mainnet": { "offRamp": { @@ -7632,22 +2054,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SDL": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - }, - "out": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - } - } - } - } + "supportedTokens": ["SDL"] }, "mainnet": { "offRamp": { @@ -7659,78 +2066,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "SDL": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - }, - "out": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SDL", "SHIB"] } }, "ethereum-mainnet-arbitrum-1": { @@ -7744,22 +2080,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "W0G": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["W0G"] }, "apechain-mainnet": { "offRamp": { @@ -7793,218 +2114,23 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "GRT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SDY": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "1000000000000000000000000" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "1000000000000000000000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "BOLD", + "GHO", + "GRT", + "LEND", + "SDY", + "SHIB", + "SILO", + "SolvBTC", + "USDC", + "USDM", + "VRTX", + "wstLINK", + "xSILO", + "xSolvBTC" + ] }, "berachain-mainnet": { "offRamp": { @@ -8016,50 +2142,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DOLO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BOLD", "DOLO", "sDOLA"] }, "bitcoin-mainnet-bob-1": { "offRamp": { @@ -8071,36 +2154,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "bsc-mainnet": { "offRamp": { @@ -8112,274 +2166,27 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CKP": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "28000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "28000000000000000000" - } - } - }, - "DOBO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LAND": { - "rateLimiterConfig": { - "in": { - "capacity": "20000000000000000000000", - "isEnabled": true, - "rate": "5550000000000000000" - }, - "out": { - "capacity": "20000000000000000000000", - "isEnabled": true, - "rate": "5550000000000000000" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - }, - "RDP": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "580000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "580000000000000000" - } - } - }, - "SDT": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "138880000000000000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "138880000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STABLE": { - "rateLimiterConfig": { - "in": { - "capacity": "7000000000000000000000", - "isEnabled": true, - "rate": "81000000000000000" - }, - "out": { - "capacity": "7000000000000000000000", - "isEnabled": true, - "rate": "81000000000000000" - } - } - }, - "STBU": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - } - } - }, - "USDFI": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "570000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "570000000000000000" - } - } - }, - "VSN": { - "rateLimiterConfig": { - "in": { - "capacity": "82500000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - }, - "out": { - "capacity": "75000000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - } - } - }, - "WECO": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - }, - "out": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "WSDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "CKP", + "DOBO", + "IXT", + "LAND", + "LEND", + "RDP", + "SDT", + "STABLE", + "STBU", + "SolvBTC", + "USDFI", + "VSN", + "WECO", + "WMTX", + "WSDM", + "mBTC", + "wUSDx", + "xSolvBTC" + ] }, "celo-mainnet": { "offRamp": { @@ -8413,22 +2220,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SDL": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - }, - "out": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - } - } - } - } + "supportedTokens": ["SDL"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -8440,596 +2232,50 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "APU": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27777777700000000000000" - }, - "out": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27777777700000000000000" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "clBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DOBO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DPI": { - "rateLimiterConfig": { - "in": { - "capacity": "741000000000000000000", - "isEnabled": true, - "rate": "50000000000000000" - }, - "out": { - "capacity": "741000000000000000000", - "isEnabled": true, - "rate": "50000000000000000" - } - } - }, - "dsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "13000000000000000000", - "isEnabled": true, - "rate": "900000000000000" - }, - "out": { - "capacity": "13000000000000000000", - "isEnabled": true, - "rate": "900000000000000" - } - } - }, - "EARNM": { - "rateLimiterConfig": { - "in": { - "capacity": "625000000000000000000000", - "isEnabled": true, - "rate": "173600000000000000000" - }, - "out": { - "capacity": "625000000000000000000000", - "isEnabled": true, - "rate": "173600000000000000000" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148148148148148148" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148148148148148148" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "GRT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "hyETH": { - "rateLimiterConfig": { - "in": { - "capacity": "28000000000000000000", - "isEnabled": true, - "rate": "2000000000000000" - }, - "out": { - "capacity": "28000000000000000000", - "isEnabled": true, - "rate": "2000000000000000" - } - } - }, - "IBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LDY": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "MVI": { - "rateLimiterConfig": { - "in": { - "capacity": "1111000000000000000000", - "isEnabled": true, - "rate": "80000000000000000" - }, - "out": { - "capacity": "1111000000000000000000", - "isEnabled": true, - "rate": "80000000000000000" - } - } - }, - "NUON": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - }, - "OVER": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sINV": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - }, - "out": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "stTAO": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - }, - "out": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - } - } - }, - "suBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "8000000000000000000", - "isEnabled": true, - "rate": "92600000000000" - }, - "out": { - "capacity": "8000000000000000000", - "isEnabled": true, - "rate": "92600000000000" - } - } - }, - "suETH": { - "rateLimiterConfig": { - "in": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - }, - "out": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - } - } - }, - "suUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "2314000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "2314000000000000000" - } - } - }, - "USD+": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000", - "isEnabled": true, - "rate": "55000000" - }, - "out": { - "capacity": "200000000000", - "isEnabled": true, - "rate": "55000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - } - } - }, - "W0G": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208330000000000" - }, - "out": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208330000000000" - } - } - }, - "WHSK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "wOETH": { - "rateLimiterConfig": { - "in": { - "capacity": "114000000000000000000", - "isEnabled": true, - "rate": "32000000000000000" - }, - "out": { - "capacity": "114000000000000000000", - "isEnabled": true, - "rate": "32000000000000000" - } - } - }, - "WOLF": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "ZUN": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - } - } - }, - "zunETH": { - "rateLimiterConfig": { - "in": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - }, - "out": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - } - } - }, - "zunUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - } - } + "supportedTokens": [ + "APU", + "BETS", + "BOLD", + "DOBO", + "DPI", + "EARNM", + "FLUID", + "GHO", + "GRT", + "IBTC", + "IXT", + "LDY", + "LEND", + "MVI", + "NUON", + "OVER", + "SolvBTC", + "USD+", + "USDC", + "USDM", + "VRTX", + "W0G", + "WETH", + "WHSK", + "WMTX", + "WOLF", + "ZUN", + "clBTC", + "dsETH", + "hyETH", + "sDOLA", + "sINV", + "stTAO", + "suBTC", + "suETH", + "suUSD", + "wOETH", + "wUSDx", + "wstLINK", + "xSolvBTC", + "zunETH", + "zunUSD" + ] }, "ethereum-mainnet-blast-1": { "offRamp": { @@ -9041,22 +2287,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - } - } - } - } + "supportedTokens": ["VRTX"] }, "ethereum-mainnet-hashkey-1": { "offRamp": { @@ -9068,22 +2299,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "WHSK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["WHSK"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -9095,50 +2311,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["GHO", "SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-linea-1": { "offRamp": { @@ -9150,64 +2323,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xrETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xRPL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xRPL", "xSolvBTC", "xrETH"] }, "ethereum-mainnet-mantle-1": { "offRamp": { @@ -9219,22 +2335,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - } - } - } - } + "supportedTokens": ["VRTX"] }, "ethereum-mainnet-mode-1": { "offRamp": { @@ -9246,22 +2347,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["wUSDx"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -9273,232 +2359,24 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "clBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "IBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, - "MILO": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "115740000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "115740000000000000000" - } - } - }, - "OVER": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SD": { - "rateLimiterConfig": { - "in": { - "capacity": "384000000000000000000000", - "isEnabled": true, - "rate": "4444000000000000000" - }, - "out": { - "capacity": "384000000000000000000000", - "isEnabled": true, - "rate": "4444000000000000000" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "stTAO": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - }, - "out": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208330000000000" - }, - "out": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208330000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "ZUN": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - } - } - }, - "zunETH": { - "rateLimiterConfig": { - "in": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - }, - "out": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - } - } - }, - "zunUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "BOLD", + "IBTC", + "MILO", + "OVER", + "SD", + "USDC", + "USDM", + "WETH", + "ZUN", + "clBTC", + "sDOLA", + "stTAO", + "wUSDx", + "zunETH", + "zunUSD" + ] }, "ethereum-mainnet-unichain-1": { "offRamp": { @@ -9510,36 +2388,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "USDC"] }, "ethereum-mainnet-xlayer-1": { "offRamp": { @@ -9562,22 +2411,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - } - } + "supportedTokens": ["mBTC"] }, "ethereum-mainnet-zksync-1": { "offRamp": { @@ -9589,22 +2423,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - } - } + "supportedTokens": ["USDM"] }, "everclear-mainnet": { "offRamp": { @@ -9638,1016 +2457,80 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "APU": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27777777700000000000000" - }, - "out": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27777777700000000000000" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "clBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DFX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57000000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57000000000000000000" - } - } - }, - "DOBO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DOLO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DPI": { - "rateLimiterConfig": { - "in": { - "capacity": "2593000000000000000000", - "isEnabled": true, - "rate": "180000000000000000" - }, - "out": { - "capacity": "2593000000000000000000", - "isEnabled": true, - "rate": "180000000000000000" - } - } - }, - "dsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "25000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - }, - "out": { - "capacity": "25000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - } - } - }, - "EARNM": { - "rateLimiterConfig": { - "in": { - "capacity": "625000000000000000000000", - "isEnabled": true, - "rate": "173600000000000000000" - }, - "out": { - "capacity": "625000000000000000000000", - "isEnabled": true, - "rate": "173600000000000000000" - } - } - }, - "egETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - } - } - }, - "ETHx": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "56000000000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "56000000000000000" - } - } - }, - "FHE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148148148148148148" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148148148148148148" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "hyETH": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000", - "isEnabled": true, - "rate": "34700000000000000" - }, - "out": { - "capacity": "500000000000000000000", - "isEnabled": true, - "rate": "34700000000000000" - } - } - }, - "IBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LDY": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - }, - "mDLP": { - "rateLimiterConfig": { - "in": { - "capacity": "416000000000000000000000", - "isEnabled": true, - "rate": "4810000000000000000" - }, - "out": { - "capacity": "416000000000000000000000", - "isEnabled": true, - "rate": "4810000000000000000" - } - } - }, - "mmETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - } - } - }, - "mstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - } - } - }, - "mswETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - } - } - }, - "MVI": { - "rateLimiterConfig": { - "in": { - "capacity": "3333000000000000000000", - "isEnabled": true, - "rate": "230000000000000000" - }, - "out": { - "capacity": "3333000000000000000000", - "isEnabled": true, - "rate": "230000000000000000" - } - } - }, - "NPC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "NUON": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - }, - "OVER": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "pufETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SD": { - "rateLimiterConfig": { - "in": { - "capacity": "384000000000000000000000", - "isEnabled": true, - "rate": "4444000000000000000" - }, - "out": { - "capacity": "384000000000000000000000", - "isEnabled": true, - "rate": "4444000000000000000" - } - } - }, - "SDL": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - }, - "out": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SDT": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "138880000000000000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "138880000000000000000" - } - } - }, - "SDY": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sINV": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - }, - "out": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STABLE": { - "rateLimiterConfig": { - "in": { - "capacity": "7000000000000000000000", - "isEnabled": true, - "rate": "81000000000000000" - }, - "out": { - "capacity": "7000000000000000000000", - "isEnabled": true, - "rate": "81000000000000000" - } - } - }, - "STBU": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - } - } - }, - "stTAO": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - }, - "out": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - } - } - }, - "suBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "8000000000000000000", - "isEnabled": true, - "rate": "92600000000000" - }, - "out": { - "capacity": "8000000000000000000", - "isEnabled": true, - "rate": "92600000000000" - } - } - }, - "suETH": { - "rateLimiterConfig": { - "in": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - }, - "out": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - } - } - }, - "suUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "2314000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "2314000000000000000" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "tETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "USD+": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000", - "isEnabled": true, - "rate": "55000000" - }, - "out": { - "capacity": "200000000000", - "isEnabled": true, - "rate": "55000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDFI": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "570000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "570000000000000000" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "VSN": { - "rateLimiterConfig": { - "in": { - "capacity": "82500000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - }, - "out": { - "capacity": "75000000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - } - } - }, - "W0G": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WECO": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - }, - "out": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100830000000000000000", - "isEnabled": true, - "rate": "28008333333333333" - }, - "out": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208333333333333" - } - } - }, - "WFRAGSOL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "231500000" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "231500000" - } - } - }, - "wOETH": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000", - "isEnabled": true, - "rate": "417000000000000000" - }, - "out": { - "capacity": "1500000000000000000000", - "isEnabled": true, - "rate": "417000000000000000" - } - } - }, - "WOLF": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WSDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "15000000000000000000000", - "isEnabled": true, - "rate": "4000000000000000000" - }, - "out": { - "capacity": "15000000000000000000000", - "isEnabled": true, - "rate": "4000000000000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xrETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xRPL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "ZUN": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - } - } - }, - "zunETH": { - "rateLimiterConfig": { - "in": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - }, - "out": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - } - } - }, - "zunUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - } - } + "supportedTokens": [ + "APU", + "BETS", + "BOLD", + "BONE", + "DFX", + "DOBO", + "DOLO", + "DPI", + "EARNM", + "ETHx", + "FHE", + "FLUID", + "GHO", + "IBTC", + "IXT", + "LDY", + "LEASH", + "LEND", + "MVI", + "NPC", + "NUON", + "OVER", + "SD", + "SDL", + "SDT", + "SDY", + "SHIB", + "SILO", + "STABLE", + "STBU", + "SolvBTC", + "USD+", + "USDC", + "USDFI", + "USDM", + "VSN", + "W0G", + "WECO", + "WETH", + "WFRAGSOL", + "WMTX", + "WOLF", + "WSDM", + "ZUN", + "clBTC", + "dsETH", + "egETH", + "hyETH", + "mBTC", + "mDLP", + "mmETH", + "mstETH", + "mswETH", + "pufETH", + "sDOLA", + "sINV", + "stTAO", + "suBTC", + "suETH", + "suUSD", + "syrupUSDC", + "tETH", + "uniBTC", + "wOETH", + "wUSDx", + "wstLINK", + "xRPL", + "xSILO", + "xSolvBTC", + "xrETH", + "zunETH", + "zunUSD" + ] }, "matic-mainnet": { "offRamp": { @@ -10659,218 +2542,23 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DFX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57000000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57000000000000000000" - } - } - }, - "EARNM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27778000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27778000000000000000000" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LAND": { - "rateLimiterConfig": { - "in": { - "capacity": "20000000000000000000000", - "isEnabled": true, - "rate": "5550000000000000000" - }, - "out": { - "capacity": "20000000000000000000000", - "isEnabled": true, - "rate": "5550000000000000000" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SDM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STBU": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "WECO": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - }, - "out": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - } - } - }, - "WSDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "DFX", + "EARNM", + "IXT", + "LAND", + "LEND", + "SDM", + "STBU", + "SolvBTC", + "USDC", + "USDM", + "WECO", + "WSDM", + "wstLINK", + "xSolvBTC" + ] }, "mind-mainnet": { "offRamp": { @@ -10904,50 +2592,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["BOLD", "FLUID", "GHO"] }, "sei-mainnet": { "offRamp": { @@ -10959,22 +2604,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["VRTX"] }, "shibarium-mainnet": { "offRamp": { @@ -10997,64 +2627,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787037037037037037" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787037037037037037" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WFRAGSOL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - } - } + "supportedTokens": ["FLUID", "USDC", "WFRAGSOL", "WMTX"] }, "soneium-mainnet": { "offRamp": { @@ -11077,92 +2650,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - }, - "SILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "1000000000000000000000000" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "1000000000000000000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xSILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BOLD", "SILO", "VRTX", "mBTC", "wUSDx", "xSILO"] }, "stable-mainnet": { "offRamp": { @@ -11185,22 +2673,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "una.WEMIX": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - } - } + "supportedTokens": ["una.WEMIX"] }, "xdai-mainnet": { "offRamp": { @@ -11212,22 +2685,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["GHO"] } }, "ethereum-mainnet-base-1": { @@ -11241,22 +2699,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "W0G": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["W0G"] }, "apechain-mainnet": { "offRamp": { @@ -11279,22 +2722,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - } - } + "supportedTokens": ["LINK"] }, "avalanche-mainnet": { "offRamp": { @@ -11306,246 +2734,25 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BYTES": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "GRT": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "1100000000000000000000", - "isEnabled": true, - "rate": "12731481000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "11574000000000000" - } - } - }, - "MYST": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "ORNG": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "BOLD", + "BYTES", + "GHO", + "GRT", + "LBTC", + "LEND", + "MYST", + "Memento", + "ORNG", + "SHIB", + "SolvBTC", + "USDC", + "USDM", + "VRTX", + "wstLINK", + "xSolvBTC" + ] }, "berachain-mainnet": { "offRamp": { @@ -11557,50 +2764,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "1000000000000000000", - "isEnabled": true, - "rate": "100000000000000000" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BOLD", "BR", "sDOLA"] }, "bitcoin-mainnet-bob-1": { "offRamp": { @@ -11612,50 +2776,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "USDT", "xSolvBTC"] }, "bittensor-mainnet": { "offRamp": { @@ -11678,330 +2799,31 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "$PAAL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "AISTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BKN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "CHEX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DOBO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "RIZE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SAS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SKYA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SNOW": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "TRADE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "UNIO": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000000", - "isEnabled": true, - "rate": "13888880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000000", - "isEnabled": true, - "rate": "13888880000000000000000" - } - } - }, - "USDO": { - "rateLimiterConfig": { - "in": { - "capacity": "10500000000000000000000000", - "isEnabled": true, - "rate": "1160000000000000000000" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "1160000000000000000000" - } - } - }, - "WHY": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "$PAAL", + "AISTR", + "BETS", + "BKN", + "BR", + "CHEX", + "DOBO", + "IXT", + "LBTC", + "LEND", + "RIZE", + "SAS", + "SKYA", + "SNOW", + "SolvBTC", + "TRADE", + "UNIO", + "USDO", + "WHY", + "WMTX", + "wUSDx", + "xGold", + "xSolvBTC" + ] }, "celo-mainnet": { "offRamp": { @@ -12013,22 +2835,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["USDT"] }, "core-mainnet": { "offRamp": { @@ -12051,596 +2858,50 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "APU": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27777777700000000000000" - }, - "out": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27777777700000000000000" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "clBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DOBO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DPI": { - "rateLimiterConfig": { - "in": { - "capacity": "741000000000000000000", - "isEnabled": true, - "rate": "50000000000000000" - }, - "out": { - "capacity": "741000000000000000000", - "isEnabled": true, - "rate": "50000000000000000" - } - } - }, - "dsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "13000000000000000000", - "isEnabled": true, - "rate": "900000000000000" - }, - "out": { - "capacity": "13000000000000000000", - "isEnabled": true, - "rate": "900000000000000" - } - } - }, - "EARNM": { - "rateLimiterConfig": { - "in": { - "capacity": "625000000000000000000000", - "isEnabled": true, - "rate": "173600000000000000000" - }, - "out": { - "capacity": "625000000000000000000000", - "isEnabled": true, - "rate": "173600000000000000000" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148148148148148148" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148148148148148148" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "GRT": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - } - } - }, - "hyETH": { - "rateLimiterConfig": { - "in": { - "capacity": "28000000000000000000", - "isEnabled": true, - "rate": "2000000000000000" - }, - "out": { - "capacity": "28000000000000000000", - "isEnabled": true, - "rate": "2000000000000000" - } - } - }, - "IBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LDY": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "MVI": { - "rateLimiterConfig": { - "in": { - "capacity": "1111000000000000000000", - "isEnabled": true, - "rate": "80000000000000000" - }, - "out": { - "capacity": "1111000000000000000000", - "isEnabled": true, - "rate": "80000000000000000" - } - } - }, - "NUON": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - }, - "OVER": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sINV": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - }, - "out": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "stTAO": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - }, - "out": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - } - } - }, - "suBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "8000000000000000000", - "isEnabled": true, - "rate": "92600000000000" - }, - "out": { - "capacity": "8000000000000000000", - "isEnabled": true, - "rate": "92600000000000" - } - } - }, - "suETH": { - "rateLimiterConfig": { - "in": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - }, - "out": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - } - } - }, - "suUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "2314000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "2314000000000000000" - } - } - }, - "USD+": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000", - "isEnabled": true, - "rate": "55000000" - }, - "out": { - "capacity": "200000000000", - "isEnabled": true, - "rate": "55000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - } - } - }, - "W0G": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208330000000000" - }, - "out": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208330000000000" - } - } - }, - "WHSK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "wOETH": { - "rateLimiterConfig": { - "in": { - "capacity": "114000000000000000000", - "isEnabled": true, - "rate": "32000000000000000" - }, - "out": { - "capacity": "114000000000000000000", - "isEnabled": true, - "rate": "32000000000000000" - } - } - }, - "WOLF": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "ZUN": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - } - } - }, - "zunETH": { - "rateLimiterConfig": { - "in": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - }, - "out": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - } - } - }, - "zunUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - } - } + "supportedTokens": [ + "APU", + "BETS", + "BOLD", + "DOBO", + "DPI", + "EARNM", + "FLUID", + "GHO", + "GRT", + "IBTC", + "IXT", + "LDY", + "LEND", + "MVI", + "NUON", + "OVER", + "SolvBTC", + "USD+", + "USDC", + "USDM", + "VRTX", + "W0G", + "WETH", + "WHSK", + "WMTX", + "WOLF", + "ZUN", + "clBTC", + "dsETH", + "hyETH", + "sDOLA", + "sINV", + "stTAO", + "suBTC", + "suETH", + "suUSD", + "wOETH", + "wUSDx", + "wstLINK", + "xSolvBTC", + "zunETH", + "zunUSD" + ] }, "ethereum-mainnet-blast-1": { "offRamp": { @@ -12652,36 +2913,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - } - } - } - } + "supportedTokens": ["LINK", "VRTX"] }, "ethereum-mainnet-hashkey-1": { "offRamp": { @@ -12693,36 +2925,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "WHSK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDT", "WHSK"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -12734,50 +2937,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["GHO", "SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-linea-1": { "offRamp": { @@ -12789,64 +2949,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "AISTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["AISTR", "LsETH", "SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-mode-1": { "offRamp": { @@ -12858,50 +2961,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BMX": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "27770000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "27770000000000000000" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["BMX", "LINK", "wUSDx"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -12913,246 +2973,25 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "clBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CRTV": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "IBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, - "OVER": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sINV": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - }, - "out": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - } - } - }, - "stTAO": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - }, - "out": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208330000000000" - }, - "out": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208330000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "ZUN": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - } - } - }, - "zunETH": { - "rateLimiterConfig": { - "in": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - }, - "out": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - } - } - }, - "zunUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "BOLD", + "CRTV", + "IBTC", + "OVER", + "USDC", + "USDM", + "USDT", + "WETH", + "ZUN", + "clBTC", + "sDOLA", + "sINV", + "stTAO", + "wUSDx", + "zunETH", + "zunUSD" + ] }, "ethereum-mainnet-scroll-1": { "offRamp": { @@ -13175,36 +3014,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "USDC"] }, "ethereum-mainnet-xlayer-1": { "offRamp": { @@ -13227,22 +3037,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - } - } + "supportedTokens": ["USDM"] }, "everclear-mainnet": { "offRamp": { @@ -13287,1100 +3082,86 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "$PAAL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "AISTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "APU": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27777777700000000000000" - }, - "out": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27777777700000000000000" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BKN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "1000000000000000000", - "isEnabled": true, - "rate": "100000000000000000" - } - } - }, - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "BYTES": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CHEX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "clBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DIP": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "2778000000000000000000" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "2778000000000000000000" - } - } - }, - "DOBO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DPI": { - "rateLimiterConfig": { - "in": { - "capacity": "741000000000000000000", - "isEnabled": true, - "rate": "50000000000000000" - }, - "out": { - "capacity": "741000000000000000000", - "isEnabled": true, - "rate": "50000000000000000" - } - } - }, - "dsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "13000000000000000000", - "isEnabled": true, - "rate": "900000000000000" - }, - "out": { - "capacity": "13000000000000000000", - "isEnabled": true, - "rate": "900000000000000" - } - } - }, - "EARNM": { - "rateLimiterConfig": { - "in": { - "capacity": "625000000000000000000000", - "isEnabled": true, - "rate": "173600000000000000000" - }, - "out": { - "capacity": "625000000000000000000000", - "isEnabled": true, - "rate": "173600000000000000000" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148148148148148148" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148148148148148148" - } - } - }, - "GEN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "hyETH": { - "rateLimiterConfig": { - "in": { - "capacity": "28000000000000000000", - "isEnabled": true, - "rate": "2000000000000000" - }, - "out": { - "capacity": "28000000000000000000", - "isEnabled": true, - "rate": "2000000000000000" - } - } - }, - "IBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "JASMY": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "1388888800000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "1388888800000000000000" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LDY": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "LsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "MEEM": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "2780000000000000000" - }, - "out": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "2780000000000000000" - } - } - }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "55000000000000000000000", - "isEnabled": true, - "rate": "636574074000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "578703704000000000" - } - } - }, - "MVI": { - "rateLimiterConfig": { - "in": { - "capacity": "1111000000000000000000", - "isEnabled": true, - "rate": "80000000000000000" - }, - "out": { - "capacity": "1111000000000000000000", - "isEnabled": true, - "rate": "80000000000000000" - } - } - }, - "MYST": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "NEIRO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "NUON": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - }, - "OVER": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "oXAUT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "RIZE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SAS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sINV": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - }, - "out": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - } - } - }, - "SKYA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STABUL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "stTAO": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - }, - "out": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - } - } - }, - "suBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "8000000000000000000", - "isEnabled": true, - "rate": "92600000000000" - }, - "out": { - "capacity": "8000000000000000000", - "isEnabled": true, - "rate": "92600000000000" - } - } - }, - "suETH": { - "rateLimiterConfig": { - "in": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - }, - "out": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - } - } - }, - "suUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "2314000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "2314000000000000000" - } - } - }, - "SXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "tETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TRADE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "UNIO": { - "rateLimiterConfig": { - "in": { - "capacity": "15000000000000000000000000", - "isEnabled": true, - "rate": "520000000000000000000" - }, - "out": { - "capacity": "15000000000000000000000000", - "isEnabled": true, - "rate": "520000000000000000000" - } - } - }, - "USD+": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000", - "isEnabled": true, - "rate": "55000000" - }, - "out": { - "capacity": "200000000000", - "isEnabled": true, - "rate": "55000000" - } - } - }, - "USD0": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "USDO": { - "rateLimiterConfig": { - "in": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870400000000000000" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "USUAL": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - } - } - }, - "W0G": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100830000000000000000", - "isEnabled": true, - "rate": "28008333333333333" - }, - "out": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208333333333333" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "wOETH": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "277800000000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "277800000000000000" - } - } - }, - "WOLF": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "XSWAP": { - "rateLimiterConfig": { - "in": { - "capacity": "20000000000000000000000000", - "isEnabled": true, - "rate": "463000000000000000000" - }, - "out": { - "capacity": "20000000000000000000000000", - "isEnabled": true, - "rate": "463000000000000000000" - } - } - }, - "zBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - } - } - }, - "ZeUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "ZUN": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - } - } - }, - "zunETH": { - "rateLimiterConfig": { - "in": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - }, - "out": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - } - } - }, - "zunUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - } - } + "supportedTokens": [ + "$PAAL", + "AISTR", + "APU", + "BETS", + "BKN", + "BOLD", + "BONE", + "BR", + "BYTES", + "CHEX", + "DIP", + "DOBO", + "DPI", + "EARNM", + "FLUID", + "GEN", + "GHO", + "IBTC", + "IXT", + "JASMY", + "LBTC", + "LDY", + "LEASH", + "LEND", + "LINK", + "LsETH", + "MEEM", + "MVI", + "MYST", + "Memento", + "NEIRO", + "NUON", + "OVER", + "RIZE", + "SAS", + "SHIB", + "SKYA", + "STABUL", + "SXT", + "SolvBTC", + "TRADE", + "UNIO", + "USD+", + "USD0", + "USDC", + "USDM", + "USDO", + "USDT", + "USUAL", + "W0G", + "WETH", + "WMTX", + "WOLF", + "XSWAP", + "ZUN", + "ZeUSD", + "brBTC", + "clBTC", + "dsETH", + "hyETH", + "oXAUT", + "sDOLA", + "sINV", + "stTAO", + "suBTC", + "suETH", + "suUSD", + "syrupUSDC", + "tETH", + "uniBTC", + "wOETH", + "wUSDx", + "wstLINK", + "xGold", + "xSolvBTC", + "zBTC", + "zunETH", + "zunUSD" + ] }, "matic-mainnet": { "offRamp": { @@ -14392,274 +3173,27 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BYTES": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CRTV": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "EARNM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27778000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27778000000000000000000" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LYP": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "83333333333300000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "83333333333300000000" - } - } - }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "1100000000000000000000", - "isEnabled": true, - "rate": "12731481000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "11574000000000000" - } - } - }, - "RIZE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STABUL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TRADE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "XTFBRICK1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "XTFCLOBOND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": [ + "BETS", + "BYTES", + "CRTV", + "EARNM", + "IXT", + "LEND", + "LYP", + "Memento", + "RIZE", + "STABUL", + "SolvBTC", + "TRADE", + "USDC", + "USDM", + "XTFBRICK1", + "XTFCLOBOND", + "wstLINK", + "xGold", + "xSolvBTC" + ] }, "memento-mainnet": { "offRamp": { @@ -14671,36 +3205,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "XTFBRICK1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "XTFCLOBOND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["XTFBRICK1", "XTFCLOBOND"] }, "monad-mainnet": { "offRamp": { @@ -14712,22 +3217,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "plasma-mainnet": { "offRamp": { @@ -14739,50 +3229,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["BOLD", "FLUID", "GHO"] }, "polygon-mainnet-katana": { "offRamp": { @@ -14794,22 +3241,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "ronin-mainnet": { "offRamp": { @@ -14821,22 +3253,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - } - } + "supportedTokens": ["LINK"] }, "sei-mainnet": { "offRamp": { @@ -14848,22 +3265,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["VRTX"] }, "shibarium-mainnet": { "offRamp": { @@ -14875,162 +3277,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CANNED": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CHIKA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DAMN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FEED": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LUISA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "NEKO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SAS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIPA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SNOW": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USAGI": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WOW": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CANNED", "CHIKA", "DAMN", "FEED", "LUISA", "NEKO", "SAS", "SHIPA", "SNOW", "USAGI", "WOW"] }, "solana-mainnet": { "offRamp": { @@ -15042,148 +3289,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "elizaOS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787037037037037037" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787037037037037037" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000", - "isEnabled": true, - "rate": "13880000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "MEW": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - } - } - }, - "MICHI": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "78722220" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "78722220" - } - } - }, - "pippin": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "YNE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "zBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - } - } - } - } + "supportedTokens": ["FLUID", "LINK", "MEW", "MICHI", "USDC", "WMTX", "YNE", "elizaOS", "pippin", "zBTC"] }, "soneium-mainnet": { "offRamp": { @@ -15195,22 +3301,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SKYA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["SKYA"] }, "sonic-mainnet": { "offRamp": { @@ -15222,106 +3313,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BMX": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "27770000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "27770000000000000000" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "zBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - } - } - } - } + "supportedTokens": ["BMX", "BOLD", "LBTC", "USDT", "VRTX", "wUSDx", "zBTC"] }, "stable-mainnet": { "offRamp": { @@ -15333,22 +3325,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "wemix-mainnet": { "offRamp": { @@ -15371,22 +3348,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["GHO"] }, "xdc-mainnet": { "offRamp": { @@ -15422,22 +3384,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - } - } - } - } + "supportedTokens": ["VRTX"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -15449,36 +3396,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57870000000000000000" - } - } - } - } + "supportedTokens": ["LINK", "VRTX"] }, "mainnet": { "offRamp": { @@ -15490,64 +3408,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SHIB"] } }, "ethereum-mainnet-hashkey-1": { @@ -15561,22 +3422,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "enzoBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["enzoBTC"] }, "ethereum-mainnet-arbitrum-1": { "offRamp": { @@ -15588,22 +3434,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "WHSK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["WHSK"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -15615,36 +3446,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "WHSK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDT", "WHSK"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -15656,22 +3458,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["USDT"] }, "mainnet": { "offRamp": { @@ -15683,22 +3470,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["USDT"] } }, "ethereum-mainnet-ink-1": { @@ -15723,50 +3495,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["GHO", "SolvBTC", "xSolvBTC"] }, "bitcoin-mainnet-bob-1": { "offRamp": { @@ -15778,36 +3507,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "bsc-mainnet": { "offRamp": { @@ -15819,36 +3519,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "celo-mainnet": { "offRamp": { @@ -15871,50 +3542,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["GHO", "SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -15926,50 +3554,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["GHO", "SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-linea-1": { "offRamp": { @@ -15981,36 +3566,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-xlayer-1": { "offRamp": { @@ -16033,36 +3589,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "mainnet": { "offRamp": { @@ -16074,106 +3601,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - }, - "out": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["GHO", "SolvBTC", "YBTC.B", "brBTC", "uniBTC", "wstETH", "xSolvBTC"] }, "matic-mainnet": { "offRamp": { @@ -16185,36 +3613,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "monad-mainnet": { "offRamp": { @@ -16226,22 +3625,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - }, - "out": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - } - } - } - } + "supportedTokens": ["wstETH"] }, "plasma-mainnet": { "offRamp": { @@ -16253,22 +3637,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - }, - "out": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - } - } - } - } + "supportedTokens": ["wstETH"] }, "sei-mainnet": { "offRamp": { @@ -16280,36 +3649,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "soneium-mainnet": { "offRamp": { @@ -16321,36 +3661,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "sonic-mainnet": { "offRamp": { @@ -16373,22 +3684,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["GHO"] } }, "ethereum-mainnet-linea-1": { @@ -16413,148 +3709,18 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "avBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avETHx": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "SolvBTC", + "avBTC", + "avETH", + "avETHx", + "avUSD", + "avUSDx", + "savBTC", + "savETH", + "savUSD", + "xSolvBTC" + ] }, "bitcoin-mainnet-bob-1": { "offRamp": { @@ -16566,36 +3732,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "bsc-mainnet": { "offRamp": { @@ -16607,92 +3744,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "AISTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "TURTLE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["AISTR", "SolvBTC", "TURTLE", "savBTC", "savUSD", "xSolvBTC"] }, "ethereum-mainnet-arbitrum-1": { "offRamp": { @@ -16704,64 +3756,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xrETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xRPL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xRPL", "xSolvBTC", "xrETH"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -16773,64 +3768,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "AISTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["AISTR", "LsETH", "SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -16842,36 +3780,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -16883,22 +3792,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "rsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["rsETH"] }, "ethereum-mainnet-scroll-1": { "offRamp": { @@ -16932,22 +3826,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "rsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["rsETH"] }, "mainnet": { "offRamp": { @@ -16959,288 +3838,28 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "AISTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avETHx": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "rsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "TURTLE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "33300000000000000000", - "isEnabled": true, - "rate": "9250000000000000" - }, - "out": { - "capacity": "30000000000000000000", - "isEnabled": true, - "rate": "8333333333333333" - } - } - }, - "xrETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xRPL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "AISTR", + "BONE", + "LEASH", + "LsETH", + "SHIB", + "SolvBTC", + "TURTLE", + "WETH", + "avBTC", + "avETH", + "avETHx", + "avUSD", + "avUSDx", + "rsETH", + "savBTC", + "savETH", + "savUSD", + "xRPL", + "xSolvBTC", + "xrETH" + ] }, "matic-mainnet": { "offRamp": { @@ -17252,36 +3871,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "plasma-mainnet": { "offRamp": { @@ -17339,22 +3929,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["VRTX"] }, "mainnet": { "offRamp": { @@ -17366,92 +3941,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "syrupUSDT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "11574" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "SHIB", "USD1", "syrupUSDT", "uniBTC"] } }, "ethereum-mainnet-mode-1": { @@ -17465,22 +3955,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["wUSDx"] }, "celo-mainnet": { "offRamp": { @@ -17503,22 +3978,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["wUSDx"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -17530,50 +3990,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BMX": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "27770000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "27770000000000000000" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["BMX", "LINK", "wUSDx"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -17585,22 +4002,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["wUSDx"] }, "mainnet": { "offRamp": { @@ -17612,92 +4014,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "sDAI": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "69400000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "69400000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SHIB", "sDAI", "wUSDx"] }, "sonic-mainnet": { "offRamp": { @@ -17709,36 +4026,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BMX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["BMX", "wUSDx"] } }, "ethereum-mainnet-optimism-1": { @@ -17763,64 +4051,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - } - } + "supportedTokens": ["BETS", "BOLD", "USDC", "USDM"] }, "bsc-mainnet": { "offRamp": { @@ -17832,36 +4063,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["BETS", "wUSDx"] }, "celo-mainnet": { "offRamp": { @@ -17873,22 +4075,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["USDT"] }, "core-mainnet": { "offRamp": { @@ -17911,232 +4098,24 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "clBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "IBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, - "MILO": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "115740000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "115740000000000000000" - } - } - }, - "OVER": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SD": { - "rateLimiterConfig": { - "in": { - "capacity": "384000000000000000000000", - "isEnabled": true, - "rate": "4444000000000000000" - }, - "out": { - "capacity": "384000000000000000000000", - "isEnabled": true, - "rate": "4444000000000000000" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "stTAO": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - }, - "out": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208330000000000" - }, - "out": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208330000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "ZUN": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - } - } - }, - "zunETH": { - "rateLimiterConfig": { - "in": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - }, - "out": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - } - } - }, - "zunUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "BOLD", + "IBTC", + "MILO", + "OVER", + "SD", + "USDC", + "USDM", + "WETH", + "ZUN", + "clBTC", + "sDOLA", + "stTAO", + "wUSDx", + "zunETH", + "zunUSD" + ] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -18148,246 +4127,25 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "clBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CRTV": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "IBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, - "OVER": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sINV": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - }, - "out": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - } - } - }, - "stTAO": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - }, - "out": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208330000000000" - }, - "out": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208330000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "ZUN": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - } - } - }, - "zunETH": { - "rateLimiterConfig": { - "in": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - }, - "out": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - } - } - }, - "zunUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "BOLD", + "CRTV", + "IBTC", + "OVER", + "USDC", + "USDM", + "USDT", + "WETH", + "ZUN", + "clBTC", + "sDOLA", + "sINV", + "stTAO", + "wUSDx", + "zunETH", + "zunUSD" + ] }, "ethereum-mainnet-hashkey-1": { "offRamp": { @@ -18399,22 +4157,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["USDT"] }, "ethereum-mainnet-linea-1": { "offRamp": { @@ -18426,22 +4169,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "rsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["rsETH"] }, "ethereum-mainnet-mode-1": { "offRamp": { @@ -18453,22 +4181,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["wUSDx"] }, "ethereum-mainnet-unichain-1": { "offRamp": { @@ -18480,36 +4193,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "USDC"] }, "ethereum-mainnet-zircuit-1": { "offRamp": { @@ -18521,22 +4205,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "rsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["rsETH"] }, "ethereum-mainnet-zksync-1": { "offRamp": { @@ -18548,22 +4217,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - } - } + "supportedTokens": ["USDM"] }, "mainnet": { "offRamp": { @@ -18575,330 +4229,31 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "clBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "ETHx": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "56000000000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "56000000000000000" - } - } - }, - "IBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "OVER": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "rsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SD": { - "rateLimiterConfig": { - "in": { - "capacity": "384000000000000000000000", - "isEnabled": true, - "rate": "4444000000000000000" - }, - "out": { - "capacity": "384000000000000000000000", - "isEnabled": true, - "rate": "4444000000000000000" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sINV": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - }, - "out": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - } - } - }, - "stTAO": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - }, - "out": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "11574" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100830000000000000000", - "isEnabled": true, - "rate": "28008333333333333" - }, - "out": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208333333333333" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "ZUN": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - } - } - }, - "zunETH": { - "rateLimiterConfig": { - "in": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - }, - "out": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - } - } - }, - "zunUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "BOLD", + "BONE", + "ETHx", + "IBTC", + "LEASH", + "OVER", + "SD", + "SHIB", + "USDC", + "USDM", + "USDT", + "WETH", + "ZUN", + "clBTC", + "rsETH", + "sDOLA", + "sINV", + "stTAO", + "uniBTC", + "wUSDx", + "zunETH", + "zunUSD" + ] }, "matic-mainnet": { "offRamp": { @@ -18910,64 +4265,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CRTV": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - } - } + "supportedTokens": ["BETS", "CRTV", "USDC", "USDM"] }, "monad-mainnet": { "offRamp": { @@ -19012,22 +4310,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDC"] }, "sonic-mainnet": { "offRamp": { @@ -19039,50 +4322,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["BOLD", "USDT", "wUSDx"] }, "wemix-mainnet": { "offRamp": { @@ -19094,22 +4334,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "una.WEMIX": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - } - } + "supportedTokens": ["una.WEMIX"] }, "xdai-mainnet": { "offRamp": { @@ -19169,78 +4394,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BOLD", "BONE", "LEASH", "LINK", "SHIB"] } }, "ethereum-mainnet-taiko-1": { @@ -19254,36 +4408,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] } }, "ethereum-mainnet-unichain-1": { @@ -19297,36 +4422,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "USDC"] }, "bsc-mainnet": { "offRamp": { @@ -19338,22 +4434,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS"] }, "celo-mainnet": { "offRamp": { @@ -19376,36 +4457,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "USDC"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -19417,36 +4469,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "USDC"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -19458,36 +4481,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "USDC"] }, "mainnet": { "offRamp": { @@ -19499,50 +4493,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "USDC", "uniBTC"] }, "matic-mainnet": { "offRamp": { @@ -19554,36 +4505,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "USDC"] }, "solana-mainnet": { "offRamp": { @@ -19595,22 +4517,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDC"] }, "sonic-mainnet": { "offRamp": { @@ -19668,36 +4575,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "oXAUT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "WLD": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "27777700000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "27777700000000000000" - } - } - } - } + "supportedTokens": ["WLD", "oXAUT"] }, "solana-mainnet": { "offRamp": { @@ -19799,36 +4677,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - } - } + "supportedTokens": ["brBTC", "uniBTC"] }, "plasma-mainnet": { "offRamp": { @@ -19864,22 +4713,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - } - } + "supportedTokens": ["mBTC"] }, "ethereum-mainnet-linea-1": { "offRamp": { @@ -19891,22 +4725,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "rsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["rsETH"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -19918,22 +4737,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "rsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["rsETH"] }, "mainnet": { "offRamp": { @@ -19945,78 +4749,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "rsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "SHIB", "mBTC", "rsETH"] } }, "ethereum-mainnet-zksync-1": { @@ -20030,22 +4763,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - } - } + "supportedTokens": ["USDM"] }, "bitcoin-mainnet-bob-1": { "offRamp": { @@ -20057,36 +4775,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "bsc-mainnet": { "offRamp": { @@ -20120,22 +4809,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - } - } + "supportedTokens": ["USDM"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -20147,22 +4821,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - } - } + "supportedTokens": ["USDM"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -20174,36 +4833,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -20215,22 +4845,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - } - } + "supportedTokens": ["USDM"] }, "ethereum-mainnet-worldchain-1": { "offRamp": { @@ -20253,106 +4868,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1736100000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1736000000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SHIB", "SolvBTC", "USDM", "xSolvBTC"] }, "matic-mainnet": { "offRamp": { @@ -20364,50 +4880,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "USDM", "xSolvBTC"] } }, "etherlink-mainnet": { @@ -20421,22 +4894,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] } }, "everclear-mainnet": { @@ -20531,22 +4989,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["xGold"] } }, "hemi-mainnet": { @@ -20595,50 +5038,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xGold", "xSolvBTC"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -20661,134 +5061,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "kHYPE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "VSN": { - "rateLimiterConfig": { - "in": { - "capacity": "82500000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - }, - "out": { - "capacity": "75000000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["BOLD", "SolvBTC", "VSN", "brBTC", "kHYPE", "syrupUSDC", "uniBTC", "xGold", "xSolvBTC"] }, "solana-mainnet": { "offRamp": { @@ -20800,22 +5073,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "WHLP": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["WHLP"] } }, "jovay-mainnet": { @@ -20829,22 +5087,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LINK"] }, "matic-mainnet": { "offRamp": { @@ -20913,22 +5156,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDO": { - "rateLimiterConfig": { - "in": { - "capacity": "21000000000000000000000000", - "isEnabled": true, - "rate": "232000000000000000000" - }, - "out": { - "capacity": "20000000000000000000000000", - "isEnabled": true, - "rate": "232000000000000000000" - } - } - } - } + "supportedTokens": ["USDO"] } }, "lens-mainnet": { @@ -20968,78 +5196,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "W0G": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "114000000000000000000", - "isEnabled": true, - "rate": "32000000000000000" - }, - "out": { - "capacity": "114000000000000000000", - "isEnabled": true, - "rate": "32000000000000000" - } - } - } - } + "supportedTokens": ["LINK", "USDC", "USDT", "W0G", "wstETH"] }, "ab-mainnet": { "offRamp": { @@ -21051,36 +5208,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LINK", "USD1"] }, "abstract-mainnet": { "offRamp": { @@ -21114,64 +5242,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LINK", "USD1", "brBTC", "uniBTC"] }, "avalanche-mainnet": { "offRamp": { @@ -21183,470 +5254,41 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "avBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avETHx": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BYTES": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "EmCH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "1100000000000000000000", - "isEnabled": true, - "rate": "12731481000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "11574000000000000" - } - } - }, - "MYST": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "oXAUT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "savBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SDY": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "tETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TREE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstPOL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": [ + "BETS", + "BOLD", + "BONE", + "BYTES", + "EmCH", + "GHO", + "LBTC", + "LEASH", + "LEND", + "MYST", + "Memento", + "SDY", + "SHIB", + "SILO", + "SolvBTC", + "TREE", + "USDC", + "USDM", + "YBTC.B", + "avBTC", + "avETH", + "avETHx", + "avUSD", + "avUSDx", + "oXAUT", + "savBTC", + "savETH", + "savUSD", + "tETH", + "wstLINK", + "wstPOL", + "xSILO", + "xSolvBTC" + ] }, "berachain-mainnet": { "offRamp": { @@ -21658,162 +5300,19 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "1000000000000000000", - "isEnabled": true, - "rate": "100000000000000000" - } - } - }, - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "DOLO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "pufETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.BERA": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "BOLD", + "BR", + "DOLO", + "LBTC", + "SolvBTC", + "SolvBTC.BERA", + "brBTC", + "pufETH", + "sDOLA", + "uniBTC", + "xSolvBTC" + ] }, "binance-smart-chain-mainnet-opbnb-1": { "offRamp": { @@ -21836,106 +5335,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - }, - "out": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "114000000000000000000", - "isEnabled": true, - "rate": "32000000000000000" - }, - "out": { - "capacity": "114000000000000000000", - "isEnabled": true, - "rate": "32000000000000000" - } - } - }, - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "114000000000000000000", - "isEnabled": true, - "rate": "32000000000000000" - }, - "out": { - "capacity": "114000000000000000000", - "isEnabled": true, - "rate": "32000000000000000" - } - } - }, - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BTR", "USDC", "USDT", "WETH", "YBTC.B", "uniBTC", "wstETH"] }, "bitcoin-mainnet-bob-1": { "offRamp": { @@ -21947,106 +5347,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.BERA": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["BOB", "SolvBTC", "SolvBTC.BERA", "USDC", "USDT", "uniBTC", "xSolvBTC"] }, "bitcoin-mainnet-botanix": { "offRamp": { @@ -22058,22 +5359,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["USDT"] }, "bitcoin-mainnet-bsquared-1": { "offRamp": { @@ -22085,22 +5371,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - } - } + "supportedTokens": ["uniBTC"] }, "bitcoin-merlin-mainnet": { "offRamp": { @@ -22134,806 +5405,65 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "$PAAL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "1XMM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "AISTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BANK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BARD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BKN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "BTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CHEX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DOBO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "EDEN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FF": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FHE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "JCT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - }, - "mwBETH": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000", - "isEnabled": true, - "rate": "46000000000000000" - }, - "out": { - "capacity": "500000000000000000000", - "isEnabled": true, - "rate": "46000000000000000" - } - } - }, - "RIZE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SAS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SDT": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "138880000000000000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "138880000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SKYA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.BERA": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STABLE": { - "rateLimiterConfig": { - "in": { - "capacity": "7000000000000000000000", - "isEnabled": true, - "rate": "81000000000000000" - }, - "out": { - "capacity": "7000000000000000000000", - "isEnabled": true, - "rate": "81000000000000000" - } - } - }, - "sUSD1+": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TRADE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TREE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TURBO": { - "rateLimiterConfig": { - "in": { - "capacity": "7000000000000000000000000", - "isEnabled": true, - "rate": "1944444400000000000000" - }, - "out": { - "capacity": "7000000000000000000000000", - "isEnabled": true, - "rate": "1944444400000000000000" - } - } - }, - "TURTLE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "UNIO": { - "rateLimiterConfig": { - "in": { - "capacity": "15000000000000000000000000", - "isEnabled": true, - "rate": "520000000000000000000" - }, - "out": { - "capacity": "15000000000000000000000000", - "isEnabled": true, - "rate": "520000000000000000000" - } - } - }, - "USD0": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDf": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDFI": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "570000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "570000000000000000" - } - } - }, - "USDO": { - "rateLimiterConfig": { - "in": { - "capacity": "10500000000000000000000000", - "isEnabled": true, - "rate": "1160000000000000000000" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "1160000000000000000000" - } - } - }, - "USUAL": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - } - } - }, - "VOOI": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "VSN": { - "rateLimiterConfig": { - "in": { - "capacity": "82500000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - }, - "out": { - "capacity": "75000000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - } - } - }, - "WECO": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - }, - "out": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - } - } - }, - "WHY": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WLFI": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "231500000" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "231500000" - } - } - }, - "WSDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "$PAAL", + "1XMM", + "AISTR", + "BANK", + "BARD", + "BETS", + "BKN", + "BOB", + "BONE", + "BR", + "BTR", + "CHEX", + "DOBO", + "EDEN", + "FF", + "FHE", + "IXT", + "JCT", + "LBTC", + "LEASH", + "LEND", + "RIZE", + "SAS", + "SDT", + "SHIB", + "SKYA", + "STABLE", + "SolvBTC", + "SolvBTC.BERA", + "TRADE", + "TREE", + "TURBO", + "TURTLE", + "UNIO", + "USD0", + "USD1", + "USDFI", + "USDO", + "USDf", + "USUAL", + "VOOI", + "VSN", + "WECO", + "WHY", + "WLFI", + "WMTX", + "WSDM", + "brBTC", + "mBTC", + "mwBETH", + "sUSD1+", + "savBTC", + "savUSD", + "uniBTC", + "wUSDx", + "xGold", + "xSolvBTC" + ] }, "celo-mainnet": { "offRamp": { @@ -22945,78 +5475,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SHIB", "USDT"] }, "core-mainnet": { "offRamp": { @@ -23039,36 +5498,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - }, - "out": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - } - } - } - } + "supportedTokens": ["LBTC", "uniBTC"] }, "cronos-mainnet": { "offRamp": { @@ -23102,78 +5532,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "SDL": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - }, - "out": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SDL", "SHIB"] }, "ethereum-mainnet-arbitrum-1": { "offRamp": { @@ -23185,1016 +5544,80 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "APU": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27777777700000000000000" - }, - "out": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27777777700000000000000" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "clBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DFX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57000000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57000000000000000000" - } - } - }, - "DOBO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DOLO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DPI": { - "rateLimiterConfig": { - "in": { - "capacity": "2593000000000000000000", - "isEnabled": true, - "rate": "180000000000000000" - }, - "out": { - "capacity": "2593000000000000000000", - "isEnabled": true, - "rate": "180000000000000000" - } - } - }, - "dsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "25000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - }, - "out": { - "capacity": "25000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - } - } - }, - "EARNM": { - "rateLimiterConfig": { - "in": { - "capacity": "625000000000000000000000", - "isEnabled": true, - "rate": "173600000000000000000" - }, - "out": { - "capacity": "625000000000000000000000", - "isEnabled": true, - "rate": "173600000000000000000" - } - } - }, - "egETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - } - } - }, - "ETHx": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "56000000000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "56000000000000000" - } - } - }, - "FHE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148148148148148148" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148148148148148148" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "hyETH": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000", - "isEnabled": true, - "rate": "34700000000000000" - }, - "out": { - "capacity": "500000000000000000000", - "isEnabled": true, - "rate": "34700000000000000" - } - } - }, - "IBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LDY": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - }, - "mDLP": { - "rateLimiterConfig": { - "in": { - "capacity": "416000000000000000000000", - "isEnabled": true, - "rate": "4810000000000000000" - }, - "out": { - "capacity": "416000000000000000000000", - "isEnabled": true, - "rate": "4810000000000000000" - } - } - }, - "mmETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - } - } - }, - "mstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - } - } - }, - "mswETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - } - } - }, - "MVI": { - "rateLimiterConfig": { - "in": { - "capacity": "3333000000000000000000", - "isEnabled": true, - "rate": "230000000000000000" - }, - "out": { - "capacity": "3333000000000000000000", - "isEnabled": true, - "rate": "230000000000000000" - } - } - }, - "NPC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "NUON": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - }, - "OVER": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "pufETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SD": { - "rateLimiterConfig": { - "in": { - "capacity": "384000000000000000000000", - "isEnabled": true, - "rate": "4444000000000000000" - }, - "out": { - "capacity": "384000000000000000000000", - "isEnabled": true, - "rate": "4444000000000000000" - } - } - }, - "SDL": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - }, - "out": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SDT": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "138880000000000000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "138880000000000000000" - } - } - }, - "SDY": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "58000000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sINV": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - }, - "out": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STABLE": { - "rateLimiterConfig": { - "in": { - "capacity": "7000000000000000000000", - "isEnabled": true, - "rate": "81000000000000000" - }, - "out": { - "capacity": "7000000000000000000000", - "isEnabled": true, - "rate": "81000000000000000" - } - } - }, - "STBU": { - "rateLimiterConfig": { - "in": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "stTAO": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - }, - "out": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - } - } - }, - "suBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "8000000000000000000", - "isEnabled": true, - "rate": "92600000000000" - }, - "out": { - "capacity": "8000000000000000000", - "isEnabled": true, - "rate": "92600000000000" - } - } - }, - "suETH": { - "rateLimiterConfig": { - "in": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - }, - "out": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - } - } - }, - "suUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "2314000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "2314000000000000000" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "tETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "231428" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "231428" - } - } - }, - "USD+": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000", - "isEnabled": true, - "rate": "55000000" - }, - "out": { - "capacity": "200000000000", - "isEnabled": true, - "rate": "55000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDFI": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "570000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "570000000000000000" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "VSN": { - "rateLimiterConfig": { - "in": { - "capacity": "82500000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - }, - "out": { - "capacity": "75000000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - } - } - }, - "W0G": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WECO": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - }, - "out": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100830000000000000000", - "isEnabled": true, - "rate": "28008333333333333" - }, - "out": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208333333333333" - } - } - }, - "WFRAGSOL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "231500000" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "231500000" - } - } - }, - "wOETH": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000", - "isEnabled": true, - "rate": "417000000000000000" - }, - "out": { - "capacity": "1500000000000000000000", - "isEnabled": true, - "rate": "417000000000000000" - } - } - }, - "WOLF": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WSDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "15000000000000000000000", - "isEnabled": true, - "rate": "4000000000000000000" - }, - "out": { - "capacity": "15000000000000000000000", - "isEnabled": true, - "rate": "4000000000000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xrETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xRPL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "ZUN": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - } - } - }, - "zunETH": { - "rateLimiterConfig": { - "in": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - }, - "out": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - } - } - }, - "zunUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - } - } + "supportedTokens": [ + "APU", + "BETS", + "BOLD", + "BONE", + "DFX", + "DOBO", + "DOLO", + "DPI", + "EARNM", + "ETHx", + "FHE", + "FLUID", + "GHO", + "IBTC", + "IXT", + "LDY", + "LEASH", + "LEND", + "MVI", + "NPC", + "NUON", + "OVER", + "SD", + "SDL", + "SDT", + "SDY", + "SHIB", + "SILO", + "STABLE", + "STBU", + "SolvBTC", + "USD+", + "USDC", + "USDFI", + "USDM", + "VSN", + "W0G", + "WECO", + "WETH", + "WFRAGSOL", + "WMTX", + "WOLF", + "WSDM", + "ZUN", + "clBTC", + "dsETH", + "egETH", + "hyETH", + "mBTC", + "mDLP", + "mmETH", + "mstETH", + "mswETH", + "pufETH", + "sDOLA", + "sINV", + "stTAO", + "suBTC", + "suETH", + "suUSD", + "syrupUSDC", + "tETH", + "uniBTC", + "wOETH", + "wUSDx", + "wstLINK", + "xRPL", + "xSILO", + "xSolvBTC", + "xrETH", + "zunETH", + "zunUSD" + ] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -24206,1100 +5629,86 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "$PAAL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "AISTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "APU": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27777777700000000000000" - }, - "out": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27777777700000000000000" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BKN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "1000000000000000000", - "isEnabled": true, - "rate": "100000000000000000" - } - } - }, - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "BYTES": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CHEX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "clBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DIP": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "2778000000000000000000" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "2778000000000000000000" - } - } - }, - "DOBO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DPI": { - "rateLimiterConfig": { - "in": { - "capacity": "741000000000000000000", - "isEnabled": true, - "rate": "50000000000000000" - }, - "out": { - "capacity": "741000000000000000000", - "isEnabled": true, - "rate": "50000000000000000" - } - } - }, - "dsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "13000000000000000000", - "isEnabled": true, - "rate": "900000000000000" - }, - "out": { - "capacity": "13000000000000000000", - "isEnabled": true, - "rate": "900000000000000" - } - } - }, - "EARNM": { - "rateLimiterConfig": { - "in": { - "capacity": "625000000000000000000000", - "isEnabled": true, - "rate": "173600000000000000000" - }, - "out": { - "capacity": "625000000000000000000000", - "isEnabled": true, - "rate": "173600000000000000000" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148148148148148148" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148148148148148148" - } - } - }, - "GEN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "hyETH": { - "rateLimiterConfig": { - "in": { - "capacity": "28000000000000000000", - "isEnabled": true, - "rate": "2000000000000000" - }, - "out": { - "capacity": "28000000000000000000", - "isEnabled": true, - "rate": "2000000000000000" - } - } - }, - "IBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "JASMY": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "1388888800000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "1388888800000000000000" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LDY": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "LsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "MEEM": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "2780000000000000000" - }, - "out": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "2780000000000000000" - } - } - }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "55000000000000000000000", - "isEnabled": true, - "rate": "636574074000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "578703704000000000" - } - } - }, - "MVI": { - "rateLimiterConfig": { - "in": { - "capacity": "1111000000000000000000", - "isEnabled": true, - "rate": "80000000000000000" - }, - "out": { - "capacity": "1111000000000000000000", - "isEnabled": true, - "rate": "80000000000000000" - } - } - }, - "MYST": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "NEIRO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "NUON": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - }, - "OVER": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "oXAUT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "RIZE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SAS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sINV": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - }, - "out": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - } - } - }, - "SKYA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STABUL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "stTAO": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - }, - "out": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - } - } - }, - "suBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "8000000000000000000", - "isEnabled": true, - "rate": "92600000000000" - }, - "out": { - "capacity": "8000000000000000000", - "isEnabled": true, - "rate": "92600000000000" - } - } - }, - "suETH": { - "rateLimiterConfig": { - "in": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - }, - "out": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1700000000000000" - } - } - }, - "suUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "2314000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "2314000000000000000" - } - } - }, - "SXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "tETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TRADE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "UNIO": { - "rateLimiterConfig": { - "in": { - "capacity": "15000000000000000000000000", - "isEnabled": true, - "rate": "520000000000000000000" - }, - "out": { - "capacity": "15000000000000000000000000", - "isEnabled": true, - "rate": "520000000000000000000" - } - } - }, - "USD+": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000", - "isEnabled": true, - "rate": "55000000" - }, - "out": { - "capacity": "200000000000", - "isEnabled": true, - "rate": "55000000" - } - } - }, - "USD0": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "USDO": { - "rateLimiterConfig": { - "in": { - "capacity": "5500000000000000000000000", - "isEnabled": true, - "rate": "63657440000000000000" - }, - "out": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "USUAL": { - "rateLimiterConfig": { - "in": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - }, - "out": { - "capacity": "3000000000000000000000000", - "isEnabled": true, - "rate": "35000000000000000000" - } - } - }, - "W0G": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100830000000000000000", - "isEnabled": true, - "rate": "28008333333333333" - }, - "out": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208333333333333" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "wOETH": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "277800000000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "277800000000000000" - } - } - }, - "WOLF": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "XSWAP": { - "rateLimiterConfig": { - "in": { - "capacity": "20000000000000000000000000", - "isEnabled": true, - "rate": "463000000000000000000" - }, - "out": { - "capacity": "20000000000000000000000000", - "isEnabled": true, - "rate": "463000000000000000000" - } - } - }, - "zBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - } - } - }, - "ZeUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "ZUN": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - } - } - }, - "zunETH": { - "rateLimiterConfig": { - "in": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - }, - "out": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - } - } - }, - "zunUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - } - } + "supportedTokens": [ + "$PAAL", + "AISTR", + "APU", + "BETS", + "BKN", + "BOLD", + "BONE", + "BR", + "BYTES", + "CHEX", + "DIP", + "DOBO", + "DPI", + "EARNM", + "FLUID", + "GEN", + "GHO", + "IBTC", + "IXT", + "JASMY", + "LBTC", + "LDY", + "LEASH", + "LEND", + "LINK", + "LsETH", + "MEEM", + "MVI", + "MYST", + "Memento", + "NEIRO", + "NUON", + "OVER", + "RIZE", + "SAS", + "SHIB", + "SKYA", + "STABUL", + "SXT", + "SolvBTC", + "TRADE", + "UNIO", + "USD+", + "USD0", + "USDC", + "USDM", + "USDO", + "USDT", + "USUAL", + "W0G", + "WETH", + "WMTX", + "WOLF", + "XSWAP", + "ZUN", + "ZeUSD", + "brBTC", + "clBTC", + "dsETH", + "hyETH", + "oXAUT", + "sDOLA", + "sINV", + "stTAO", + "suBTC", + "suETH", + "suUSD", + "syrupUSDC", + "tETH", + "uniBTC", + "wOETH", + "wUSDx", + "wstLINK", + "xGold", + "xSolvBTC", + "zBTC", + "zunETH", + "zunUSD" + ] }, "ethereum-mainnet-blast-1": { "offRamp": { @@ -25311,64 +5720,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SHIB"] }, "ethereum-mainnet-hashkey-1": { "offRamp": { @@ -25380,22 +5732,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["USDT"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -25407,106 +5744,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - }, - "out": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["GHO", "SolvBTC", "YBTC.B", "brBTC", "uniBTC", "wstETH", "xSolvBTC"] }, "ethereum-mainnet-linea-1": { "offRamp": { @@ -25518,288 +5756,28 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "AISTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avETHx": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "avUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "rsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "TURTLE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "33300000000000000000", - "isEnabled": true, - "rate": "9250000000000000" - }, - "out": { - "capacity": "30000000000000000000", - "isEnabled": true, - "rate": "8333333333333333" - } - } - }, - "xrETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xRPL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "AISTR", + "BONE", + "LEASH", + "LsETH", + "SHIB", + "SolvBTC", + "TURTLE", + "WETH", + "avBTC", + "avETH", + "avETHx", + "avUSD", + "avUSDx", + "rsETH", + "savBTC", + "savETH", + "savUSD", + "xRPL", + "xSolvBTC", + "xrETH" + ] }, "ethereum-mainnet-mantle-1": { "offRamp": { @@ -25811,92 +5789,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "syrupUSDT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "11574" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "SHIB", "USD1", "syrupUSDT", "uniBTC"] }, "ethereum-mainnet-mode-1": { "offRamp": { @@ -25908,92 +5801,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "sDAI": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "69400000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "69400000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SHIB", "sDAI", "wUSDx"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -26005,330 +5813,31 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "clBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "ETHx": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "56000000000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "56000000000000000" - } - } - }, - "IBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "OVER": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "rsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SD": { - "rateLimiterConfig": { - "in": { - "capacity": "384000000000000000000000", - "isEnabled": true, - "rate": "4444000000000000000" - }, - "out": { - "capacity": "384000000000000000000000", - "isEnabled": true, - "rate": "4444000000000000000" - } - } - }, - "sDOLA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "sINV": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - }, - "out": { - "capacity": "10000000000000000000000", - "isEnabled": true, - "rate": "110000000000000000" - } - } - }, - "stTAO": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - }, - "out": { - "capacity": "400000000000", - "isEnabled": true, - "rate": "41600000" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "11574" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100830000000000000000", - "isEnabled": true, - "rate": "28008333333333333" - }, - "out": { - "capacity": "90750000000000000000", - "isEnabled": true, - "rate": "25208333333333333" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "ZUN": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - }, - "out": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23140000000000000000" - } - } - }, - "zunETH": { - "rateLimiterConfig": { - "in": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - }, - "out": { - "capacity": "72000000000000000000", - "isEnabled": true, - "rate": "1666000000000000" - } - } - }, - "zunUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "250000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "BOLD", + "BONE", + "ETHx", + "IBTC", + "LEASH", + "OVER", + "SD", + "SHIB", + "USDC", + "USDM", + "USDT", + "WETH", + "ZUN", + "clBTC", + "rsETH", + "sDOLA", + "sINV", + "stTAO", + "uniBTC", + "wUSDx", + "zunETH", + "zunUSD" + ] }, "ethereum-mainnet-polygon-zkevm-1": { "offRamp": { @@ -26351,78 +5860,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BOLD", "BONE", "LEASH", "LINK", "SHIB"] }, "ethereum-mainnet-taiko-1": { "offRamp": { @@ -26434,36 +5872,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-unichain-1": { "offRamp": { @@ -26475,50 +5884,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "USDC", "uniBTC"] }, "ethereum-mainnet-worldchain-1": { "offRamp": { @@ -26530,36 +5896,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "oXAUT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "WLD": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "27777700000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "27777700000000000000" - } - } - } - } + "supportedTokens": ["WLD", "oXAUT"] }, "ethereum-mainnet-xlayer-1": { "offRamp": { @@ -26571,36 +5908,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - } - } + "supportedTokens": ["brBTC", "uniBTC"] }, "ethereum-mainnet-zircuit-1": { "offRamp": { @@ -26612,78 +5920,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "rsETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "SHIB", "mBTC", "rsETH"] }, "ethereum-mainnet-zksync-1": { "offRamp": { @@ -26695,106 +5932,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1736000000000000" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "150000000000000000000", - "isEnabled": true, - "rate": "1736000000000000" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SHIB", "SolvBTC", "USDM", "xSolvBTC"] }, "etherlink-mainnet": { "offRamp": { @@ -26806,22 +5944,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "everclear-mainnet": { "offRamp": { @@ -26855,22 +5978,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["xGold"] }, "hemi-mainnet": { "offRamp": { @@ -26893,134 +6001,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "kHYPE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - }, - "out": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - } - } - }, - "VSN": { - "rateLimiterConfig": { - "in": { - "capacity": "82500000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - }, - "out": { - "capacity": "75000000000000000000000000", - "isEnabled": true, - "rate": "69000000000000000000" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["BOLD", "SolvBTC", "VSN", "brBTC", "kHYPE", "syrupUSDC", "uniBTC", "xGold", "xSolvBTC"] }, "jovay-mainnet": { "offRamp": { @@ -27032,22 +6013,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LINK"] }, "kaia-mainnet": { "offRamp": { @@ -27059,22 +6025,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDO": { - "rateLimiterConfig": { - "in": { - "capacity": "21000000000000000000000000", - "isEnabled": true, - "rate": "232000000000000000000" - }, - "out": { - "capacity": "20000000000000000000000000", - "isEnabled": true, - "rate": "232000000000000000000" - } - } - } - } + "supportedTokens": ["USDO"] }, "lens-mainnet": { "offRamp": { @@ -27108,358 +6059,33 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "1XMM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DFX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57000000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57000000000000000000" - } - } - }, - "EARNM": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000000", - "isEnabled": true, - "rate": "13889000000000000000000" - }, - "out": { - "capacity": "50000000000000000000000000", - "isEnabled": true, - "rate": "13889000000000000000000" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "1100000000000000000000", - "isEnabled": true, - "rate": "12731481000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "11574000000000000" - } - } - }, - "OSIS": { - "rateLimiterConfig": { - "in": { - "capacity": "16667000000000000000000", - "isEnabled": true, - "rate": "4600000000000000000" - }, - "out": { - "capacity": "16667000000000000000000", - "isEnabled": true, - "rate": "4600000000000000000" - } - } - }, - "REG": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "14000000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "14000000000000000000" - } - } - }, - "RIZE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SOIL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STABUL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TRADE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "WECO": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - }, - "out": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - } - } - }, - "WSDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstPOL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "1XMM", + "BETS", + "BONE", + "DFX", + "EARNM", + "IXT", + "LEASH", + "LEND", + "Memento", + "OSIS", + "REG", + "RIZE", + "SHIB", + "SOIL", + "STABUL", + "SolvBTC", + "TRADE", + "USDC", + "USDM", + "WECO", + "WSDM", + "wstLINK", + "wstPOL", + "xGold", + "xSolvBTC" + ] }, "memento-mainnet": { "offRamp": { @@ -27493,22 +6119,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "FHE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["FHE"] }, "mint-mainnet": { "offRamp": { @@ -27531,78 +6142,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000", - "isEnabled": true, - "rate": "57870000000000" - }, - "out": { - "capacity": "30000000000000000000", - "isEnabled": true, - "rate": "347220000000000" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - }, - "out": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000", - "isEnabled": true, - "rate": "57870000000000" - }, - "out": { - "capacity": "30000000000000000000", - "isEnabled": true, - "rate": "347220000000000" - } - } - } - } + "supportedTokens": ["LBTC", "SolvBTC", "USD1", "wstETH", "xSolvBTC"] }, "morph-mainnet": { "offRamp": { @@ -27614,36 +6154,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LINK", "USD1"] }, "nexon-mainnet-henesys": { "offRamp": { @@ -27666,134 +6177,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "RETH": { - "rateLimiterConfig": { - "in": { - "capacity": "1800000000000000000000", - "isEnabled": true, - "rate": "5787000000000000" - }, - "out": { - "capacity": "1800000000000000000000", - "isEnabled": true, - "rate": "5787000000000000" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "syrupUSDT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - }, - "out": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - } - } - }, - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BOLD", "FLUID", "GHO", "LINK", "RETH", "YBTC.B", "savUSD", "syrupUSDT", "wstETH"] }, "plume-mainnet": { "offRamp": { @@ -27805,22 +6189,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USD1"] }, "polkadot-mainnet-astar": { "offRamp": { @@ -27832,78 +6201,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WASTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "2778000000000000000000" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SHIB", "WASTR"] }, "polygon-mainnet-katana": { "offRamp": { @@ -27915,36 +6213,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LBTC", "savUSD"] }, "ronin-mainnet": { "offRamp": { @@ -27956,232 +6225,24 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "ANIMA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "APRS": { - "rateLimiterConfig": { - "in": { - "capacity": "30000000000000000000000000", - "isEnabled": true, - "rate": "347222200000000000000" - }, - "out": { - "capacity": "27000000000000000000000000", - "isEnabled": true, - "rate": "312500000000000000000" - } - } - }, - "AXS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BANANA": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "17361110000000000000" - }, - "out": { - "capacity": "1350000000000000000000000", - "isEnabled": true, - "rate": "15625000000000000000" - } - } - }, - "CGX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - }, - "LUA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LUAUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "PFVS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "PIXEL": { - "rateLimiterConfig": { - "in": { - "capacity": "300000000000000000000000000", - "isEnabled": true, - "rate": "3472222200000000000000" - }, - "out": { - "capacity": "270000000000000000000000000", - "isEnabled": true, - "rate": "3125000000000000000000" - } - } - }, - "RETH": { - "rateLimiterConfig": { - "in": { - "capacity": "1800000000000000000000", - "isEnabled": true, - "rate": "5787000000000000" - }, - "out": { - "capacity": "1800000000000000000000", - "isEnabled": true, - "rate": "5787000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "4200000000", - "isEnabled": true, - "rate": "48610" - }, - "out": { - "capacity": "3780000000", - "isEnabled": true, - "rate": "43750" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "YGG": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148100000000000000" - }, - "out": { - "capacity": "1800000000000000000000000", - "isEnabled": true, - "rate": "20833300000000000000" - } - } - }, - "ZENT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": [ + "ANIMA", + "APRS", + "AXS", + "BANANA", + "CGX", + "LINK", + "LUA", + "LUAUSD", + "PFVS", + "PIXEL", + "RETH", + "USDC", + "WBTC", + "WETH", + "YGG", + "ZENT" + ] }, "rootstock-mainnet": { "offRamp": { @@ -28204,36 +6265,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "shibarium-mainnet": { "offRamp": { @@ -28245,36 +6277,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SAS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIRO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["SAS", "SHIRO"] }, "solana-mainnet": { "offRamp": { @@ -28286,274 +6289,27 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "elizaOS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FHE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787037037037037037" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787037037037037037" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000", - "isEnabled": true, - "rate": "13880000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "MEW": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - } - } - }, - "OHM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "PEPE": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000", - "isEnabled": true, - "rate": "13888888888888890" - }, - "out": { - "capacity": "50000000000000000000000000000", - "isEnabled": true, - "rate": "13888888888888890000000000" - } - } - }, - "PTsUSDE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WFRAGSOL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WLFI": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "zBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - } - } - } - } + "supportedTokens": [ + "FHE", + "FLUID", + "LINK", + "MEW", + "OHM", + "PEPE", + "PTsUSDE", + "SolvBTC", + "USD1", + "USDC", + "WFRAGSOL", + "WLFI", + "WMTX", + "brBTC", + "elizaOS", + "syrupUSDC", + "uniBTC", + "xSolvBTC", + "zBTC" + ] }, "soneium-mainnet": { "offRamp": { @@ -28565,106 +6321,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "DEGEN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - }, - "pufETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SKYA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "60000000000000000000", - "isEnabled": true, - "rate": "694440000000000" - } - } - }, - "WASTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "2778000000000000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "60000000000000000000", - "isEnabled": true, - "rate": "694440000000000" - } - } - } - } + "supportedTokens": ["DEGEN", "LINK", "SKYA", "SolvBTC", "WASTR", "pufETH", "xSolvBTC"] }, "sonic-mainnet": { "offRamp": { @@ -28676,204 +6333,22 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "egETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - }, - "mstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - } - } - }, - "SILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - }, - "out": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xSILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "zBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - } - } - } - } + "supportedTokens": [ + "BOLD", + "LBTC", + "LINK", + "SILO", + "SolvBTC", + "USDT", + "egETH", + "mBTC", + "mstETH", + "uniBTC", + "wUSDx", + "xSILO", + "xSolvBTC", + "zBTC" + ] }, "stable-mainnet": { "offRamp": { @@ -28885,36 +6360,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LBTC", "LINK"] }, "superseed-mainnet": { "offRamp": { @@ -28937,78 +6383,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "RETH": { - "rateLimiterConfig": { - "in": { - "capacity": "1800000000000000000000", - "isEnabled": true, - "rate": "5787000000000000" - }, - "out": { - "capacity": "1800000000000000000000", - "isEnabled": true, - "rate": "5787000000000000" - } - } - }, - "tETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - } - } + "supportedTokens": ["LBTC", "LINK", "RETH", "tETH", "uniBTC"] }, "wemix-mainnet": { "offRamp": { @@ -29020,106 +6395,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "una.USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "300000000000", - "isEnabled": true, - "rate": "83330000" - }, - "out": { - "capacity": "300000000000", - "isEnabled": true, - "rate": "83330000" - } - } - }, - "una.WEMIX": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SHIB", "USDC", "una.USDC", "una.WEMIX"] }, "xdai-mainnet": { "offRamp": { @@ -29131,78 +6407,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "REG": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "14000000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "14000000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BONE", "GHO", "LEASH", "REG", "SHIB"] }, "xdc-mainnet": { "offRamp": { @@ -29214,36 +6419,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDf": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LINK", "USDf"] }, "zora-mainnet": { "offRamp": { @@ -29279,134 +6455,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "1100000000000000000000", - "isEnabled": true, - "rate": "12731481000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "11574000000000000" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstPOL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["BETS", "LEND", "Memento", "SolvBTC", "USDC", "USDM", "wstLINK", "wstPOL", "xSolvBTC"] }, "berachain-mainnet": { "offRamp": { @@ -29429,36 +6478,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "bsc-mainnet": { "offRamp": { @@ -29470,204 +6490,22 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "1XMM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LAND": { - "rateLimiterConfig": { - "in": { - "capacity": "20000000000000000000000", - "isEnabled": true, - "rate": "5550000000000000000" - }, - "out": { - "capacity": "20000000000000000000000", - "isEnabled": true, - "rate": "5550000000000000000" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "METO": { - "rateLimiterConfig": { - "in": { - "capacity": "76923077000000000000000000", - "isEnabled": true, - "rate": "21367520000000000000000" - }, - "out": { - "capacity": "76923077000000000000000000", - "isEnabled": true, - "rate": "21367520000000000000000" - } - } - }, - "RIZE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "THE": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "417000000000000000000" - }, - "out": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "417000000000000000000" - } - } - }, - "TRADE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WECO": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - }, - "out": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - } - } - }, - "WSDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "1XMM", + "BETS", + "IXT", + "LAND", + "LEND", + "METO", + "RIZE", + "SolvBTC", + "THE", + "TRADE", + "WECO", + "WSDM", + "xGold", + "xSolvBTC" + ] }, "celo-mainnet": { "offRamp": { @@ -29701,218 +6539,23 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DFX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57000000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57000000000000000000" - } - } - }, - "EARNM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27778000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27778000000000000000000" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LAND": { - "rateLimiterConfig": { - "in": { - "capacity": "20000000000000000000000", - "isEnabled": true, - "rate": "5550000000000000000" - }, - "out": { - "capacity": "20000000000000000000000", - "isEnabled": true, - "rate": "5550000000000000000" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SDM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STBU": { - "rateLimiterConfig": { - "in": { - "capacity": "2", - "isEnabled": true, - "rate": "1" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "WECO": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - }, - "out": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - } - } - }, - "WSDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "BETS", + "DFX", + "EARNM", + "IXT", + "LAND", + "LEND", + "SDM", + "STBU", + "SolvBTC", + "USDC", + "USDM", + "WECO", + "WSDM", + "wstLINK", + "xSolvBTC" + ] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -29924,274 +6567,27 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BYTES": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CRTV": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "EARNM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27778000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000000", - "isEnabled": true, - "rate": "27778000000000000000000" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LYP": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "83333333333300000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "83333333333300000000" - } - } - }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "1100000000000000000000", - "isEnabled": true, - "rate": "12731481000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "11574000000000000" - } - } - }, - "RIZE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STABUL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TRADE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "XTFBRICK1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "XTFCLOBOND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": [ + "BETS", + "BYTES", + "CRTV", + "EARNM", + "IXT", + "LEND", + "LYP", + "Memento", + "RIZE", + "STABUL", + "SolvBTC", + "TRADE", + "USDC", + "USDM", + "XTFBRICK1", + "XTFCLOBOND", + "wstLINK", + "xGold", + "xSolvBTC" + ] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -30203,36 +6599,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-linea-1": { "offRamp": { @@ -30244,36 +6611,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -30285,64 +6623,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CRTV": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - } - } + "supportedTokens": ["BETS", "CRTV", "USDC", "USDM"] }, "ethereum-mainnet-unichain-1": { "offRamp": { @@ -30354,36 +6635,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BETS", "USDC"] }, "ethereum-mainnet-zksync-1": { "offRamp": { @@ -30395,50 +6647,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "USDM", "xSolvBTC"] }, "jovay-mainnet": { "offRamp": { @@ -30461,358 +6670,33 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "1XMM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BETS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DFX": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57000000000000000000" - }, - "out": { - "capacity": "5000000000000000000000000", - "isEnabled": true, - "rate": "57000000000000000000" - } - } - }, - "EARNM": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000000", - "isEnabled": true, - "rate": "13889000000000000000000" - }, - "out": { - "capacity": "50000000000000000000000000", - "isEnabled": true, - "rate": "13889000000000000000000" - } - } - }, - "IXT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "Memento": { - "rateLimiterConfig": { - "in": { - "capacity": "1100000000000000000000", - "isEnabled": true, - "rate": "12731481000000000" - }, - "out": { - "capacity": "1000000000000000000000", - "isEnabled": true, - "rate": "11574000000000000" - } - } - }, - "OSIS": { - "rateLimiterConfig": { - "in": { - "capacity": "16667000000000000000000", - "isEnabled": true, - "rate": "4600000000000000000" - }, - "out": { - "capacity": "16667000000000000000000", - "isEnabled": true, - "rate": "4600000000000000000" - } - } - }, - "REG": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "14000000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "14000000000000000000" - } - } - }, - "RIZE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SOIL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "STABUL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "TRADE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11600000000000000000" - } - } - }, - "WECO": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - }, - "out": { - "capacity": "500000000000000000000000000", - "isEnabled": true, - "rate": "34720000000000000000000" - } - } - }, - "WSDM": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "12000000" - } - } - }, - "wstLINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstPOL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xGold": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": [ + "1XMM", + "BETS", + "BONE", + "DFX", + "EARNM", + "IXT", + "LEASH", + "LEND", + "Memento", + "OSIS", + "REG", + "RIZE", + "SHIB", + "SOIL", + "STABUL", + "SolvBTC", + "TRADE", + "USDC", + "USDM", + "WECO", + "WSDM", + "wstLINK", + "wstPOL", + "xGold", + "xSolvBTC" + ] }, "memento-mainnet": { "offRamp": { @@ -30824,36 +6708,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "XTFBRICK1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "XTFCLOBOND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["XTFBRICK1", "XTFCLOBOND"] }, "plume-mainnet": { "offRamp": { @@ -30876,36 +6731,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "solana-mainnet": { "offRamp": { @@ -30917,22 +6743,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDC"] }, "soneium-mainnet": { "offRamp": { @@ -30944,36 +6755,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "sonic-mainnet": { "offRamp": { @@ -30996,22 +6778,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "una.WEMIX": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - } - } + "supportedTokens": ["una.WEMIX"] }, "xdai-mainnet": { "offRamp": { @@ -31023,22 +6790,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "REG": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "14000000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "14000000000000000000" - } - } - } - } + "supportedTokens": ["REG"] } }, "memento-mainnet": { @@ -31052,36 +6804,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "XTFBRICK1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "XTFCLOBOND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["XTFBRICK1", "XTFCLOBOND"] }, "mainnet": { "offRamp": { @@ -31104,36 +6827,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "XTFBRICK1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "XTFCLOBOND": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["XTFBRICK1", "XTFCLOBOND"] }, "solana-mainnet": { "offRamp": { @@ -31171,22 +6865,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "FHE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["FHE"] }, "ethereum-mainnet-arbitrum-1": { "offRamp": { @@ -31209,22 +6888,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "FHE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["FHE"] } }, "mint-mainnet": { @@ -31262,22 +6926,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "bsc-mainnet": { "offRamp": { @@ -31289,22 +6938,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "ethereum-mainnet-arbitrum-1": { "offRamp": { @@ -31327,22 +6961,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -31354,22 +6973,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - }, - "out": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - } - } - } - } + "supportedTokens": ["wstETH"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -31392,78 +6996,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "30000000000000000000", - "isEnabled": true, - "rate": "347220000000000" - }, - "out": { - "capacity": "5000000000000000000", - "isEnabled": true, - "rate": "57870000000000" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - }, - "out": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "30000000000000000000", - "isEnabled": true, - "rate": "347220000000000" - }, - "out": { - "capacity": "5000000000000000000", - "isEnabled": true, - "rate": "57870000000000" - } - } - } - } + "supportedTokens": ["LBTC", "SolvBTC", "USD1", "wstETH", "xSolvBTC"] }, "plasma-mainnet": { "offRamp": { @@ -31475,22 +7008,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - }, - "out": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - } - } - } - } + "supportedTokens": ["wstETH"] }, "polygon-mainnet-katana": { "offRamp": { @@ -31502,22 +7020,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "solana-mainnet": { "offRamp": { @@ -31540,22 +7043,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] } }, "morph-mainnet": { @@ -31569,36 +7057,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LINK", "USD1"] } }, "nexon-mainnet-henesys": { @@ -31647,36 +7106,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["GHO", "savUSD"] }, "bitcoin-mainnet-bitlayer-1": { "offRamp": { @@ -31688,22 +7118,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["YBTC.B"] }, "ethereum-mainnet-arbitrum-1": { "offRamp": { @@ -31715,50 +7130,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["BOLD", "FLUID", "GHO"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -31770,50 +7142,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["BOLD", "FLUID", "GHO"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -31825,22 +7154,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - }, - "out": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - } - } - } - } + "supportedTokens": ["wstETH"] }, "ethereum-mainnet-linea-1": { "offRamp": { @@ -31874,134 +7188,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "RETH": { - "rateLimiterConfig": { - "in": { - "capacity": "1800000000000000000000", - "isEnabled": true, - "rate": "5787000000000000" - }, - "out": { - "capacity": "1800000000000000000000", - "isEnabled": true, - "rate": "5787000000000000" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "syrupUSDT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - }, - "out": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - } - } - }, - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BOLD", "FLUID", "GHO", "LINK", "RETH", "YBTC.B", "savUSD", "syrupUSDT", "wstETH"] }, "monad-mainnet": { "offRamp": { @@ -32013,22 +7200,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "wstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - }, - "out": { - "capacity": "2000000000000000000000", - "isEnabled": true, - "rate": "23148148140000000" - } - } - } - } + "supportedTokens": ["wstETH"] }, "solana-mainnet": { "offRamp": { @@ -32040,50 +7212,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "eUSX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "5787000000" - }, - "out": { - "capacity": "500000000000000000000000", - "isEnabled": true, - "rate": "5787000000000000000" - } - } - }, - "USX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["FLUID", "USX", "eUSX"] }, "xdai-mainnet": { "offRamp": { @@ -32095,22 +7224,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["GHO"] } }, "plume-mainnet": { @@ -32124,22 +7238,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["YBTC.B"] }, "bsc-mainnet": { "offRamp": { @@ -32162,22 +7261,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USD1"] }, "matic-mainnet": { "offRamp": { @@ -32202,78 +7286,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WASTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "2778000000000000000000" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SHIB", "WASTR"] }, "soneium-mainnet": { "offRamp": { @@ -32285,36 +7298,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - }, - "WASTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "20000000000000000000000000", - "isEnabled": true, - "rate": "5556000000000000000000" - } - } - } - } + "supportedTokens": ["LINK", "WASTR"] } }, "polygon-mainnet-katana": { @@ -32328,36 +7312,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LBTC", "savUSD"] }, "bsc-mainnet": { "offRamp": { @@ -32369,36 +7324,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LBTC", "savUSD"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -32410,22 +7336,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "mainnet": { "offRamp": { @@ -32437,36 +7348,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "savUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LBTC", "savUSD"] }, "monad-mainnet": { "offRamp": { @@ -32478,22 +7360,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "solana-mainnet": { "offRamp": { @@ -32516,22 +7383,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "stable-mainnet": { "offRamp": { @@ -32543,22 +7395,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] } }, "ronin-mainnet": { @@ -32572,22 +7409,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - } - } + "supportedTokens": ["LINK"] }, "mainnet": { "offRamp": { @@ -32599,232 +7421,24 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "ANIMA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "APRS": { - "rateLimiterConfig": { - "in": { - "capacity": "30000000000000000000000000", - "isEnabled": true, - "rate": "347222200000000000000" - }, - "out": { - "capacity": "27000000000000000000000000", - "isEnabled": true, - "rate": "312500000000000000000" - } - } - }, - "AXS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BANANA": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "17361110000000000000" - }, - "out": { - "capacity": "1350000000000000000000000", - "isEnabled": true, - "rate": "15625000000000000000" - } - } - }, - "CGX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - }, - "LUA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LUAUSD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "PFVS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "PIXEL": { - "rateLimiterConfig": { - "in": { - "capacity": "300000000000000000000000000", - "isEnabled": true, - "rate": "3472222200000000000000" - }, - "out": { - "capacity": "270000000000000000000000000", - "isEnabled": true, - "rate": "3125000000000000000000" - } - } - }, - "RETH": { - "rateLimiterConfig": { - "in": { - "capacity": "1800000000000000000000", - "isEnabled": true, - "rate": "5787000000000000" - }, - "out": { - "capacity": "1800000000000000000000", - "isEnabled": true, - "rate": "5787000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "4200000000", - "isEnabled": true, - "rate": "48610" - }, - "out": { - "capacity": "3780000000", - "isEnabled": true, - "rate": "43750" - } - } - }, - "WETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "YGG": { - "rateLimiterConfig": { - "in": { - "capacity": "2000000000000000000000000", - "isEnabled": true, - "rate": "23148100000000000000" - }, - "out": { - "capacity": "1800000000000000000000000", - "isEnabled": true, - "rate": "20833300000000000000" - } - } - }, - "ZENT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": [ + "ANIMA", + "APRS", + "AXS", + "BANANA", + "CGX", + "LINK", + "LUA", + "LUAUSD", + "PFVS", + "PIXEL", + "RETH", + "USDC", + "WBTC", + "WETH", + "YGG", + "ZENT" + ] } }, "rootstock-mainnet": { @@ -32851,36 +7465,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["SolvBTC", "VRTX"] }, "berachain-mainnet": { "offRamp": { @@ -32903,36 +7488,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "bsc-mainnet": { "offRamp": { @@ -32944,36 +7500,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-arbitrum-1": { "offRamp": { @@ -32985,22 +7512,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["VRTX"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -33012,22 +7524,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["VRTX"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -33039,36 +7536,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -33091,36 +7559,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "matic-mainnet": { "offRamp": { @@ -33132,36 +7571,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "solana-mainnet": { "offRamp": { @@ -33208,162 +7618,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CANNED": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "CHIKA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "DAMN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FEED": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LUISA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "NEKO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SAS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIPA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SNOW": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USAGI": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WOW": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CANNED", "CHIKA", "DAMN", "FEED", "LUISA", "NEKO", "SAS", "SHIPA", "SNOW", "USAGI", "WOW"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -33386,36 +7641,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SAS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SHIRO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["SAS", "SHIRO"] }, "solana-mainnet": { "offRamp": { @@ -33451,22 +7677,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDC"] }, "berachain-mainnet": { "offRamp": { @@ -33489,22 +7700,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "YBTC.B": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["YBTC.B"] }, "bsc-mainnet": { "offRamp": { @@ -33516,190 +7712,21 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "BR": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "5800000000" - }, - "out": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "5800000000" - } - } - }, - "elizaOS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FHE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "ILMT": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000", - "isEnabled": true, - "rate": "277777777778" - }, - "out": { - "capacity": "1000000000000000", - "isEnabled": true, - "rate": "277777777778" - } - } - }, - "KNET": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "MEW": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000", - "isEnabled": true, - "rate": "34722" - }, - "out": { - "capacity": "750000000", - "isEnabled": true, - "rate": "34722" - } - } - }, - "SolvBTC.JUP": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "57870" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "57870" - } - } - }, - "USELESS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WLFI": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "XLAB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "250000000", - "isEnabled": true, - "rate": "11574" - } - } - } - } + "supportedTokens": [ + "BR", + "FHE", + "ILMT", + "KNET", + "MEW", + "SolvBTC", + "SolvBTC.JUP", + "USELESS", + "WLFI", + "WMTX", + "XLAB", + "elizaOS", + "xSolvBTC" + ] }, "ethereum-mainnet-arbitrum-1": { "offRamp": { @@ -33711,64 +7738,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "23148100000" - }, - "out": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "23148100000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WFRAGSOL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - } - } + "supportedTokens": ["FLUID", "USDC", "WFRAGSOL", "WMTX"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -33780,148 +7750,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "elizaOS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "23148100000" - }, - "out": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "23148100000" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000", - "isEnabled": true, - "rate": "13880000000" - }, - "out": { - "capacity": "50000000000000", - "isEnabled": true, - "rate": "13880000000" - } - } - }, - "MEW": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - } - } - }, - "MICHI": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "78722220" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "78722220" - } - } - }, - "pippin": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "YNE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "zBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - } - } - } - } + "supportedTokens": ["FLUID", "LINK", "MEW", "MICHI", "USDC", "WMTX", "YNE", "elizaOS", "pippin", "zBTC"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -33933,22 +7762,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDC"] }, "ethereum-mainnet-unichain-1": { "offRamp": { @@ -33960,22 +7774,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDC"] }, "ethereum-mainnet-worldchain-1": { "offRamp": { @@ -34009,22 +7808,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "WHLP": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["WHLP"] }, "mainnet": { "offRamp": { @@ -34036,274 +7820,27 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "brBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "elizaOS": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FHE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "23148100000" - }, - "out": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "23148100000" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000", - "isEnabled": true, - "rate": "13880000000" - }, - "out": { - "capacity": "50000000000000", - "isEnabled": true, - "rate": "13880000000" - } - } - }, - "MEW": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - } - } - }, - "OHM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "PEPE": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "138888888889" - }, - "out": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "138888888889" - } - } - }, - "PTsUSDE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "250000000", - "isEnabled": true, - "rate": "11574" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "USD1": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WFRAGSOL": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WLFI": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "WMTX": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - }, - "out": { - "capacity": "1000000000000", - "isEnabled": true, - "rate": "277770000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "250000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "250000000", - "isEnabled": true, - "rate": "11574" - } - } - }, - "zBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - } - } - } - } + "supportedTokens": [ + "FHE", + "FLUID", + "LINK", + "MEW", + "OHM", + "PEPE", + "PTsUSDE", + "SolvBTC", + "USD1", + "USDC", + "WFRAGSOL", + "WLFI", + "WMTX", + "brBTC", + "elizaOS", + "syrupUSDC", + "uniBTC", + "xSolvBTC", + "zBTC" + ] }, "matic-mainnet": { "offRamp": { @@ -34315,22 +7852,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDC"] }, "memento-mainnet": { "offRamp": { @@ -34364,50 +7886,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "eUSX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "FLUID": { - "rateLimiterConfig": { - "in": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "5787000000" - }, - "out": { - "capacity": "500000000000000", - "isEnabled": true, - "rate": "5787000000" - } - } - }, - "USX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["FLUID", "USX", "eUSX"] }, "polygon-mainnet-katana": { "offRamp": { @@ -34452,50 +7931,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000", - "isEnabled": true, - "rate": "13880000000" - }, - "out": { - "capacity": "50000000000000", - "isEnabled": true, - "rate": "13880000000" - } - } - }, - "MEW": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - } - } - }, - "zBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - } - } - } - } + "supportedTokens": ["LINK", "MEW", "zBTC"] } }, "soneium-mainnet": { @@ -34509,50 +7945,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "SolvBTC.JUP": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "SolvBTC.JUP", "xSolvBTC"] }, "bitcoin-mainnet-bsquared-1": { "offRamp": { @@ -34575,36 +7968,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SKYA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC.JUP": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "1157400000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "1157400000000000" - } - } - } - } + "supportedTokens": ["SKYA", "SolvBTC.JUP"] }, "celo-mainnet": { "offRamp": { @@ -34638,22 +8002,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SKYA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["SKYA"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -34665,36 +8014,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "mainnet": { "offRamp": { @@ -34706,106 +8026,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "DEGEN": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - }, - "pufETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SKYA": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "60000000000000000000", - "isEnabled": true, - "rate": "694440000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "WASTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "60000000000000000000", - "isEnabled": true, - "rate": "694440000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["DEGEN", "LINK", "SKYA", "SolvBTC", "WASTR", "pufETH", "xSolvBTC"] }, "matic-mainnet": { "offRamp": { @@ -34817,36 +8038,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - } - } + "supportedTokens": ["SolvBTC", "xSolvBTC"] }, "polkadot-mainnet-astar": { "offRamp": { @@ -34858,36 +8050,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - }, - "WASTR": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LINK", "WASTR"] } }, "sonic-mainnet": { @@ -34901,22 +8064,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - } - } + "supportedTokens": ["LINK"] }, "avalanche-mainnet": { "offRamp": { @@ -34928,78 +8076,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "SILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BOLD", "LBTC", "SILO", "VRTX", "xSILO"] }, "bitcoin-mainnet-bob-1": { "offRamp": { @@ -35011,22 +8088,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - } - } + "supportedTokens": ["USDT"] }, "bsc-mainnet": { "offRamp": { @@ -35038,50 +8100,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["LBTC", "mBTC", "wUSDx"] }, "core-mainnet": { "offRamp": { @@ -35104,92 +8123,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - }, - "SILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "1000000000000000000000000" - }, - "out": { - "capacity": "10000000000000000000000000", - "isEnabled": true, - "rate": "1000000000000000000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xSILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BOLD", "SILO", "VRTX", "mBTC", "wUSDx", "xSILO"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -35201,106 +8135,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BMX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "VRTX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "zBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - } - } - } - } + "supportedTokens": ["BMX", "BOLD", "LBTC", "USDT", "VRTX", "wUSDx", "zBTC"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -35334,36 +8169,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BMX": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["BMX", "wUSDx"] }, "ethereum-mainnet-optimism-1": { "offRamp": { @@ -35375,50 +8181,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - } - } + "supportedTokens": ["BOLD", "USDT", "wUSDx"] }, "ethereum-mainnet-unichain-1": { "offRamp": { @@ -35441,204 +8204,22 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BOLD": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "egETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - } - } - }, - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - }, - "mBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - }, - "out": { - "capacity": "400000000", - "isEnabled": true, - "rate": "18518" - } - } - }, - "mstETH": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - }, - "out": { - "capacity": "100000000000000000000", - "isEnabled": true, - "rate": "9260000000000000" - } - } - }, - "SILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "SolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - }, - "USDT": { - "rateLimiterConfig": { - "in": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - }, - "out": { - "capacity": "10000000000000", - "isEnabled": true, - "rate": "5000000000" - } - } - }, - "wUSDx": { - "rateLimiterConfig": { - "in": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - }, - "out": { - "capacity": "490000000000", - "isEnabled": true, - "rate": "136111000" - } - } - }, - "xSILO": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "xSolvBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - }, - "out": { - "capacity": "2500000000000000000", - "isEnabled": true, - "rate": "115740000000000" - } - } - }, - "zBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - } - } - } - } + "supportedTokens": [ + "BOLD", + "LBTC", + "LINK", + "SILO", + "SolvBTC", + "USDT", + "egETH", + "mBTC", + "mstETH", + "uniBTC", + "wUSDx", + "xSILO", + "xSolvBTC", + "zBTC" + ] }, "matic-mainnet": { "offRamp": { @@ -35661,22 +8242,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "polygon-mainnet-katana": { "offRamp": { @@ -35688,22 +8254,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "solana-mainnet": { "offRamp": { @@ -35715,50 +8266,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000", - "isEnabled": true, - "rate": "13880000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "13880000000000000000" - } - } - }, - "MEW": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - }, - "out": { - "capacity": "5000000000000", - "isEnabled": true, - "rate": "1388888888" - } - } - }, - "zBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - }, - "out": { - "capacity": "1000000000", - "isEnabled": true, - "rate": "11574" - } - } - } - } + "supportedTokens": ["LINK", "MEW", "zBTC"] }, "stable-mainnet": { "offRamp": { @@ -35770,22 +8278,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "xdai-mainnet": { "offRamp": { @@ -35810,22 +8303,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "bsc-mainnet": { "offRamp": { @@ -35837,22 +8315,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "ethereum-mainnet-arbitrum-1": { "offRamp": { @@ -35875,22 +8338,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "mainnet": { "offRamp": { @@ -35902,36 +8350,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LBTC", "LINK"] }, "polygon-mainnet-katana": { "offRamp": { @@ -35943,22 +8362,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] }, "sonic-mainnet": { "offRamp": { @@ -35970,22 +8374,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - } - } + "supportedTokens": ["LBTC"] } }, "superseed-mainnet": { @@ -36034,78 +8423,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - }, - "out": { - "capacity": "5000000000", - "isEnabled": true, - "rate": "462963" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "RETH": { - "rateLimiterConfig": { - "in": { - "capacity": "1800000000000000000000", - "isEnabled": true, - "rate": "5787000000000000" - }, - "out": { - "capacity": "1800000000000000000000", - "isEnabled": true, - "rate": "5787000000000000" - } - } - }, - "tETH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "uniBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "200000000", - "isEnabled": true, - "rate": "2315" - } - } - } - } + "supportedTokens": ["LBTC", "LINK", "RETH", "tETH", "uniBTC"] } }, "wemix-mainnet": { @@ -36119,22 +8437,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "una.WEMIX": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - } - } + "supportedTokens": ["una.WEMIX"] }, "bsc-mainnet": { "offRamp": { @@ -36146,22 +8449,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "una.WEMIX": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - } - } + "supportedTokens": ["una.WEMIX"] }, "ethereum-mainnet-arbitrum-1": { "offRamp": { @@ -36173,22 +8461,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "una.WEMIX": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - } - } + "supportedTokens": ["una.WEMIX"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -36211,22 +8484,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "una.WEMIX": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - } - } + "supportedTokens": ["una.WEMIX"] }, "mainnet": { "offRamp": { @@ -36238,106 +8496,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "4630000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "una.USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "300000000000", - "isEnabled": true, - "rate": "83330000" - }, - "out": { - "capacity": "300000000000", - "isEnabled": true, - "rate": "83330000" - } - } - }, - "una.WEMIX": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BONE", "LEASH", "LINK", "SHIB", "USDC", "una.USDC", "una.WEMIX"] }, "matic-mainnet": { "offRamp": { @@ -36349,22 +8508,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "una.WEMIX": { - "rateLimiterConfig": { - "in": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - }, - "out": { - "capacity": "200000000000000000000000", - "isEnabled": true, - "rate": "55550000000000000000" - } - } - } - } + "supportedTokens": ["una.WEMIX"] } }, "xdai-mainnet": { @@ -36389,22 +8533,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["GHO"] }, "bsc-mainnet": { "offRamp": { @@ -36427,22 +8556,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["GHO"] }, "ethereum-mainnet-base-1": { "offRamp": { @@ -36454,22 +8568,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["GHO"] }, "ethereum-mainnet-ink-1": { "offRamp": { @@ -36481,22 +8580,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["GHO"] }, "ethereum-mainnet-linea-1": { "offRamp": { @@ -36541,78 +8625,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "BONE": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - }, - "LEASH": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "REG": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "14000000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "14000000000000000000" - } - } - }, - "SHIB": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["BONE", "GHO", "LEASH", "REG", "SHIB"] }, "matic-mainnet": { "offRamp": { @@ -36624,22 +8637,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "REG": { - "rateLimiterConfig": { - "in": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "14000000000000000000" - }, - "out": { - "capacity": "50000000000000000000000", - "isEnabled": true, - "rate": "14000000000000000000" - } - } - } - } + "supportedTokens": ["REG"] }, "plasma-mainnet": { "offRamp": { @@ -36651,22 +8649,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "GHO": { - "rateLimiterConfig": { - "in": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - }, - "out": { - "capacity": "1500000000000000000000000", - "isEnabled": true, - "rate": "300000000000000000000" - } - } - } - } + "supportedTokens": ["GHO"] }, "sonic-mainnet": { "offRamp": { @@ -36702,36 +8685,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "LINK": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDf": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["LINK", "USDf"] } }, "zora-mainnet": { diff --git a/src/config/data/ccip/v1_2_0/mainnet/tokens.json b/src/config/data/ccip/v1_2_0/mainnet/tokens.json index d44a581e269..7dcd9050d20 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/mainnet/tokens.json @@ -4,8 +4,12 @@ "allowListEnabled": false, "decimals": 18, "name": "PAAL AI", - "poolAddress": "0xE4De5151eD60Aa2086172c4caec29f058d16E46e", - "poolType": "burnMint", + "pool": { + "address": "0xE4De5151eD60Aa2086172c4caec29f058d16E46e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "$PAAL", "tokenAddress": "0xbb1B031c591235408755ff4E0739cb88C5cF2507" }, @@ -13,8 +17,12 @@ "allowListEnabled": false, "decimals": 18, "name": "PAAL AI", - "poolAddress": "0x5192Bd10f28A0206211CcBB66671118f85c2E539", - "poolType": "burnMint", + "pool": { + "address": "0x5192Bd10f28A0206211CcBB66671118f85c2E539", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "$PAAL", "tokenAddress": "0xd52333441c0553fACb259600FA833a69186893A5" }, @@ -22,8 +30,12 @@ "allowListEnabled": false, "decimals": 9, "name": "PAAL AI", - "poolAddress": "0x1A4B0621E90Bdc61d341D89158863458CA745dA2", - "poolType": "lockRelease", + "pool": { + "address": "0x1A4B0621E90Bdc61d341D89158863458CA745dA2", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "$PAAL", "tokenAddress": "0x14feE680690900BA0ccCfC76AD70Fd1b95D10e16" } @@ -33,8 +45,12 @@ "allowListEnabled": false, "decimals": 18, "name": "One-XMM Token", - "poolAddress": "0xFdcB1fB6675b7d7c33933Ef56BD031c7B084Af29", - "poolType": "burnMint", + "pool": { + "address": "0xFdcB1fB6675b7d7c33933Ef56BD031c7B084Af29", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "1XMM", "tokenAddress": "0x504C024fcDc01C30ee6379e3381144Df24Bc01B9" }, @@ -42,8 +58,12 @@ "allowListEnabled": false, "decimals": 18, "name": "One-XMM Token", - "poolAddress": "0xF56dcA7a981a53ec2EbeF2040800F04206021583", - "poolType": "burnMint", + "pool": { + "address": "0xF56dcA7a981a53ec2EbeF2040800F04206021583", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "1XMM", "tokenAddress": "0x958d200A49F4765f771C61d2649965e26277fB64" }, @@ -51,8 +71,12 @@ "allowListEnabled": false, "decimals": 18, "name": "One-XMM Token", - "poolAddress": "0x955c82760CAec660Bc823726ee3a90ef53C24577", - "poolType": "burnMint", + "pool": { + "address": "0x955c82760CAec660Bc823726ee3a90ef53C24577", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "1XMM", "tokenAddress": "0xfDC362324740B3CA225ee0E54063746EecB2BFd9" } @@ -62,8 +86,12 @@ "allowListEnabled": false, "decimals": 18, "name": "AicroStrategy", - "poolAddress": "0xafa0f7EEDd310168Ba84BddDA550BA9c93F1083d", - "poolType": "burnMint", + "pool": { + "address": "0xafa0f7EEDd310168Ba84BddDA550BA9c93F1083d", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "AISTR", "tokenAddress": "0xFFd2087838d18225DE3428DFAEeFa4432E7D227F" }, @@ -71,8 +99,12 @@ "allowListEnabled": false, "decimals": 18, "name": "AicroStrategy", - "poolAddress": "0xF4fD65FE6E60822C22B3580ee43FA6E955adb3Ab", - "poolType": "lockRelease", + "pool": { + "address": "0xF4fD65FE6E60822C22B3580ee43FA6E955adb3Ab", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "AISTR", "tokenAddress": "0x323ac72a3a6267D97427944989b896fB411fdCbb" }, @@ -80,8 +112,12 @@ "allowListEnabled": false, "decimals": 18, "name": "AicroStrategy", - "poolAddress": "0xCDc4325995dE9Bd013c606da4D21519A99041673", - "poolType": "burnMint", + "pool": { + "address": "0xCDc4325995dE9Bd013c606da4D21519A99041673", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "AISTR", "tokenAddress": "0xaE1c4c55b0C82C02b0C933d1F890f8fa9D599D3f" }, @@ -89,8 +125,12 @@ "allowListEnabled": false, "decimals": 18, "name": "AicroStrategy", - "poolAddress": "0xe4a9fa29E3d88660577E4ACD9bf88Ef2DF4F8D7C", - "poolType": "burnMint", + "pool": { + "address": "0xe4a9fa29E3d88660577E4ACD9bf88Ef2DF4F8D7C", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "AISTR", "tokenAddress": "0xBD4CaeE14EFDE2888F167130AF84D613D64618Da" } @@ -100,8 +140,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Anima", - "poolAddress": "0xD4C6184DEC4e10395AB84b9e7a7ab46d0D57329e", - "poolType": "burnMint", + "pool": { + "address": "0xD4C6184DEC4e10395AB84b9e7a7ab46d0D57329e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "ANIMA", "tokenAddress": "0x153A381D1207862cA003f68600462fAa66A828a7" }, @@ -109,8 +153,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Anima", - "poolAddress": "0xD27F88501e62D0BDc70B20d6ed06d8E0fF8c3812", - "poolType": "lockRelease", + "pool": { + "address": "0xD27F88501e62D0BDc70B20d6ed06d8E0fF8c3812", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "ANIMA", "tokenAddress": "0xF80132FC0A86ADd011BffCe3AedD60A86E3d704D" } @@ -120,8 +168,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Aperios", - "poolAddress": "0x5882D12bbf902ee88d5FCF8793113ae85fFe97b1", - "poolType": "lockRelease", + "pool": { + "address": "0x5882D12bbf902ee88d5FCF8793113ae85fFe97b1", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "APRS", "tokenAddress": "0x95b4B8CaD3567B5d7EF7399C2aE1d7070692aB0D" }, @@ -129,8 +181,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Aperios", - "poolAddress": "0x5dbBF90Ad00130Fd2Eb788016DcB3E4dFbD0C519", - "poolType": "burnMint", + "pool": { + "address": "0x5dbBF90Ad00130Fd2Eb788016DcB3E4dFbD0C519", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "APRS", "tokenAddress": "0x7894b3088d069E70895EFfA4e8f7D2c243Fd04C1" } @@ -140,7 +196,11 @@ "allowListEnabled": false, "decimals": 8, "name": "Aptos Coin", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "APT", "tokenAddress": "0x000000000000000000000000000000000000000000000000000000000000000A" } @@ -150,8 +210,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Apu Apustaja", - "poolAddress": "0x924982D6616962E7009f5f1fFe6F24ee1e58A2F4", - "poolType": "burnMint", + "pool": { + "address": "0x924982D6616962E7009f5f1fFe6F24ee1e58A2F4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "APU", "tokenAddress": "0x1F53B7aA6f4b36B7DfDEDb4Bc4A14747a19cf7B1" }, @@ -159,8 +223,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Apu Apustaja", - "poolAddress": "0xdf59f3eA407816FcC9e724fF29c5593a536e7984", - "poolType": "burnMint", + "pool": { + "address": "0xdf59f3eA407816FcC9e724fF29c5593a536e7984", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "APU", "tokenAddress": "0xB9926b3fBc5873Db0182016D55727D5ae89E5EFd" }, @@ -168,8 +236,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Apu Apustaja", - "poolAddress": "0x0577EcCC8FBE54B321d3BC8d4F1d09Deb94d5A55", - "poolType": "lockRelease", + "pool": { + "address": "0x0577EcCC8FBE54B321d3BC8d4F1d09Deb94d5A55", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "APU", "tokenAddress": "0x594DaaD7D77592a2b97b725A7AD59D7E188b5bFa" } @@ -179,8 +251,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avBTC", - "poolAddress": "0x5684B0455837d41e47260a31bD954bE72C935E32", - "poolType": "lockRelease", + "pool": { + "address": "0x5684B0455837d41e47260a31bD954bE72C935E32", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "avBTC", "tokenAddress": "0xfd2c2A98009d0cBed715882036e43d26C4289053" }, @@ -188,8 +264,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avBTC", - "poolAddress": "0xCE7Eb84463675C6dD219A6A8939Cc36F650808c6", - "poolType": "burnMint", + "pool": { + "address": "0xCE7Eb84463675C6dD219A6A8939Cc36F650808c6", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "avBTC", "tokenAddress": "0x2D4C0d9742cd0F11b3627f103A3dDd9C8AE341b6" }, @@ -197,8 +277,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avBTC", - "poolAddress": "0x63bd4CC0A4F72cb3a6181604d03633671e5A93d2", - "poolType": "burnMint", + "pool": { + "address": "0x63bd4CC0A4F72cb3a6181604d03633671e5A93d2", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "avBTC", "tokenAddress": "0x84d797c33708E5bDbfdB73481530DCf8c03eC17E" } @@ -208,8 +292,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avETH", - "poolAddress": "0xBEC991c38A8D2b04F7A2a6F2d9304078DFD33dB6", - "poolType": "burnMint", + "pool": { + "address": "0xBEC991c38A8D2b04F7A2a6F2d9304078DFD33dB6", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "avETH", "tokenAddress": "0x223767286Be11d09Ae778fF608687fe858d3A2b4" }, @@ -217,8 +305,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avETH", - "poolAddress": "0x9b52Ab55cFA7aB0079f84390b24Fdc0e5bF5Ab6F", - "poolType": "burnMint", + "pool": { + "address": "0x9b52Ab55cFA7aB0079f84390b24Fdc0e5bF5Ab6F", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "avETH", "tokenAddress": "0x3449A9155Afc1Bab56A572FdfE22A3a2B803AaC4" }, @@ -226,8 +318,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avETH", - "poolAddress": "0xbD09E8846B9DbdA54Ef386Bd9eF3bbd15Add50ee", - "poolType": "lockRelease", + "pool": { + "address": "0xbD09E8846B9DbdA54Ef386Bd9eF3bbd15Add50ee", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "avETH", "tokenAddress": "0x9469470C9878bf3d6d0604831d9A3A366156f7EE" } @@ -237,8 +333,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avETH MAX", - "poolAddress": "0xbb8a25Ee9509bDA375699F6977DfaaC04c08BADa", - "poolType": "burnMint", + "pool": { + "address": "0xbb8a25Ee9509bDA375699F6977DfaaC04c08BADa", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "avETHx", "tokenAddress": "0xDA63630094Aa23B7a49368b713d68dD98F547f98" }, @@ -246,8 +346,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avETH MAX", - "poolAddress": "0x37912A5e451DC711D357E2dC6Bf9035235d6771f", - "poolType": "burnMint", + "pool": { + "address": "0x37912A5e451DC711D357E2dC6Bf9035235d6771f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "avETHx", "tokenAddress": "0x01C9ABFebCDcb53E72bF017Fc1D17F9DB38F722a" }, @@ -255,8 +359,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avETH MAX", - "poolAddress": "0x18d3ebcEF1074f30aba5Da3951FF1a87B30B6Ec1", - "poolType": "lockRelease", + "pool": { + "address": "0x18d3ebcEF1074f30aba5Da3951FF1a87B30B6Ec1", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "avETHx", "tokenAddress": "0x2E8b7190eE84E7AC757Ddff42Ba14d4EAe24B865" } @@ -266,8 +374,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avUSD", - "poolAddress": "0xD4fe4186c4A7b089eb849d57b43C5F6a3d3BcCbe", - "poolType": "lockRelease", + "pool": { + "address": "0xD4fe4186c4A7b089eb849d57b43C5F6a3d3BcCbe", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "avUSD", "tokenAddress": "0x24dE8771bC5DdB3362Db529Fc3358F2df3A0E346" }, @@ -275,8 +387,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avUSD", - "poolAddress": "0x9F299fbDbB581E55217c15b8439588e16b95018f", - "poolType": "burnMint", + "pool": { + "address": "0x9F299fbDbB581E55217c15b8439588e16b95018f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "avUSD", "tokenAddress": "0x37c44fc08e403Efc0946C0623CB1164A52CE1576" }, @@ -284,8 +400,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avUSD", - "poolAddress": "0x81B72171642FaB457aa815C0B8412A22B63A6aF8", - "poolType": "burnMint", + "pool": { + "address": "0x81B72171642FaB457aa815C0B8412A22B63A6aF8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "avUSD", "tokenAddress": "0xf4c13D631450De6B12a19829E37c8e2826891dC4" } @@ -295,8 +415,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avUSD MAX", - "poolAddress": "0x89541CE9940DFA3add6D6dc2e20E3F743075DFF5", - "poolType": "lockRelease", + "pool": { + "address": "0x89541CE9940DFA3add6D6dc2e20E3F743075DFF5", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "avUSDx", "tokenAddress": "0xDd1cDFA52E7D8474d434cd016fd346701db6B3B9" }, @@ -304,8 +428,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avUSD MAX", - "poolAddress": "0x2c12313da5465D6da6E0A3574249A30839Fe8766", - "poolType": "burnMint", + "pool": { + "address": "0x2c12313da5465D6da6E0A3574249A30839Fe8766", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "avUSDx", "tokenAddress": "0xC37d32b09B0bB0aa9B2A70372d7Bc1216CB7D903" }, @@ -313,8 +441,12 @@ "allowListEnabled": false, "decimals": 18, "name": "avUSD MAX", - "poolAddress": "0xD08f814614Fb21bdcdd3Aa92123e2F954F9864b7", - "poolType": "burnMint", + "pool": { + "address": "0xD08f814614Fb21bdcdd3Aa92123e2F954F9864b7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "avUSDx", "tokenAddress": "0xF424a63E4aC41b1faC5074Ccc24c7E5048fcA25D" } @@ -324,8 +456,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Axie Infinity Shard", - "poolAddress": "0xf33341f2CE329B5DbCa7F9a0986Cff40d050440a", - "poolType": "lockRelease", + "pool": { + "address": "0xf33341f2CE329B5DbCa7F9a0986Cff40d050440a", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "AXS", "tokenAddress": "0xBB0E17EF65F82Ab018d8EDd776e8DD940327B28b" }, @@ -333,8 +469,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Axie Infinity Shard", - "poolAddress": "0x554652E7F10fB8aa3e12226213c6826F98B09CF0", - "poolType": "burnMint", + "pool": { + "address": "0x554652E7F10fB8aa3e12226213c6826F98B09CF0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "AXS", "tokenAddress": "0x97a9107C1793BC407d6F527b77e7fff4D812bece" } @@ -344,8 +484,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Banana", - "poolAddress": "0xB18eE11849a805651aC5D456034FD6352cfF635d", - "poolType": "lockRelease", + "pool": { + "address": "0xB18eE11849a805651aC5D456034FD6352cfF635d", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "BANANA", "tokenAddress": "0x94e496474F1725f1c1824cB5BDb92d7691A4F03a" }, @@ -353,8 +497,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Banana", - "poolAddress": "0x93Af6da985fD08dFA839cB2eD189D31E11c0A58f", - "poolType": "burnMint", + "pool": { + "address": "0x93Af6da985fD08dFA839cB2eD189D31E11c0A58f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BANANA", "tokenAddress": "0x1a89ecd466a23e98f07111b0510a2D6c1cd5E400" } @@ -364,8 +512,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lorenzo Governance Token", - "poolAddress": "0x0f9bf5199815e0244cb79B8c768b6979eC0290d3", - "poolType": "lockRelease", + "pool": { + "address": "0x0f9bf5199815e0244cb79B8c768b6979eC0290d3", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "BANK", "tokenAddress": "0x3AeE7602b612de36088F3ffEd8c8f10E86EbF2bF" }, @@ -373,8 +525,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lorenzo Governance Token", - "poolAddress": "0xdEC1532Abf3c2329026B5B26eE0Ea6c5c07a6c9b", - "poolType": "burnMint", + "pool": { + "address": "0xdEC1532Abf3c2329026B5B26eE0Ea6c5c07a6c9b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BANK", "tokenAddress": "0x0ba12138c55A7828b3fA1F9ef002fABdCB8996ae" } @@ -384,8 +540,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lombard", - "poolAddress": "0xAA1BD1c07cfEAdb8Cc025fFa8781a853Dc88d555", - "poolType": "burnMint", + "pool": { + "address": "0xAA1BD1c07cfEAdb8Cc025fFa8781a853Dc88d555", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BARD", "tokenAddress": "0xd23A186A78c0B3B805505E5f8ea4083295ef9f3a" }, @@ -393,8 +553,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lombard", - "poolAddress": "0x94A43cC8C4d755271436cfE42793A66a6C9ae25b", - "poolType": "lockRelease", + "pool": { + "address": "0x94A43cC8C4d755271436cfE42793A66a6C9ae25b", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "BARD", "tokenAddress": "0xf0DB65D17e30a966C2ae6A21f6BBA71cea6e9754" } @@ -404,8 +568,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Bera Bitcoin", - "poolAddress": "0xE354FA112CD7aA0DE5C4Bedce19965c9f549e689", - "poolType": "lockRelease", + "pool": { + "address": "0xE354FA112CD7aA0DE5C4Bedce19965c9f549e689", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "beraBTC", "tokenAddress": "0xE368a6BBb2c285A557800FF676D85Dd7E9C6299B" }, @@ -413,8 +581,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Bera Bitcoin", - "poolAddress": "0x1eCFe2220f18a5e4cDBc08563572d413B46fA8Ea", - "poolType": "burnMint", + "pool": { + "address": "0x1eCFe2220f18a5e4cDBc08563572d413B46fA8Ea", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "beraBTC", "tokenAddress": "0x68C7A170bd9Ea9fb283a50d041531678111FBF31" } @@ -424,8 +596,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BetSwirl v2", - "poolAddress": "0xEf50b39fE4302D8bF499ce854f19B84098E64da6", - "poolType": "burnMint", + "pool": { + "address": "0xEf50b39fE4302D8bF499ce854f19B84098E64da6", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BETS", "tokenAddress": "0x94025780a1aB58868D9B2dBBB775f44b32e8E6e5" }, @@ -433,8 +609,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BetSwirl v2", - "poolAddress": "0x77BEd59eaBa481F3f5122A1C9953d477d97A900d", - "poolType": "burnMint", + "pool": { + "address": "0x77BEd59eaBa481F3f5122A1C9953d477d97A900d", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "BETS", "tokenAddress": "0x94025780a1aB58868D9B2dBBB775f44b32e8E6e5" }, @@ -442,8 +622,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BetSwirl v2", - "poolAddress": "0xCba063b1f328e4d42b05a165CBBB590939BDD70a", - "poolType": "burnMint", + "pool": { + "address": "0xCba063b1f328e4d42b05a165CBBB590939BDD70a", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BETS", "tokenAddress": "0x94025780a1aB58868D9B2dBBB775f44b32e8E6e5" }, @@ -451,8 +635,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BetSwirl v2", - "poolAddress": "0xdfeaa4acb814564Ab8c756A95E8269C620Ed9DEe", - "poolType": "burnMint", + "pool": { + "address": "0xdfeaa4acb814564Ab8c756A95E8269C620Ed9DEe", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "BETS", "tokenAddress": "0x94025780a1aB58868D9B2dBBB775f44b32e8E6e5" }, @@ -460,8 +648,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BetSwirl v2", - "poolAddress": "0x17B54BCEb4dd037d8AFF01EccdAd358De73159dB", - "poolType": "burnMint", + "pool": { + "address": "0x17B54BCEb4dd037d8AFF01EccdAd358De73159dB", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BETS", "tokenAddress": "0x94025780a1aB58868D9B2dBBB775f44b32e8E6e5" }, @@ -469,8 +661,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BetSwirl v2", - "poolAddress": "0x463D98c150A664452F68B914c353C4fB99B227AC", - "poolType": "burnMint", + "pool": { + "address": "0x463D98c150A664452F68B914c353C4fB99B227AC", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "BETS", "tokenAddress": "0x94025780a1aB58868D9B2dBBB775f44b32e8E6e5" }, @@ -478,8 +674,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BetSwirl v2", - "poolAddress": "0x8315Bbe2b2828559CEeCCCBCB4550A466227336E", - "poolType": "burnMint", + "pool": { + "address": "0x8315Bbe2b2828559CEeCCCBCB4550A466227336E", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BETS", "tokenAddress": "0x94025780a1aB58868D9B2dBBB775f44b32e8E6e5" }, @@ -487,8 +687,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BetSwirl v2", - "poolAddress": "0xe7A4bcEb04a06AabC63BAeffb34F7B75217a83fA", - "poolType": "burnMint", + "pool": { + "address": "0xe7A4bcEb04a06AabC63BAeffb34F7B75217a83fA", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BETS", "tokenAddress": "0x94025780a1aB58868D9B2dBBB775f44b32e8E6e5" } @@ -498,8 +702,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Brickken", - "poolAddress": "0x995d8725bFE4909999B86Bb09cf7Cb9fC199Dd8a", - "poolType": "burnMint", + "pool": { + "address": "0x995d8725bFE4909999B86Bb09cf7Cb9fC199Dd8a", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BKN", "tokenAddress": "0xFc209EeBA3D744aA741cc5C2A73Ebf9C977B5F82" }, @@ -507,8 +715,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Brickken", - "poolAddress": "0xf7A646E5Fc6563B2BB4Cd8c4374CdFCa4185e975", - "poolType": "burnMint", + "pool": { + "address": "0xf7A646E5Fc6563B2BB4Cd8c4374CdFCa4185e975", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BKN", "tokenAddress": "0xFc209EeBA3D744aA741cc5C2A73Ebf9C977B5F82" }, @@ -516,8 +728,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Brickken", - "poolAddress": "0xFf3633c00CADAac2C881638D59dF3714a9d59E33", - "poolType": "burnMint", + "pool": { + "address": "0xFf3633c00CADAac2C881638D59dF3714a9d59E33", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BKN", "tokenAddress": "0xFc209EeBA3D744aA741cc5C2A73Ebf9C977B5F82" } @@ -527,8 +743,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BMX", - "poolAddress": "0xc64f6E56a19678190b8263f05beeed9fc5Cbc01f", - "poolType": "lockRelease", + "pool": { + "address": "0xc64f6E56a19678190b8263f05beeed9fc5Cbc01f", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "BMX", "tokenAddress": "0x548f93779fBC992010C07467cBaf329DD5F059B7" }, @@ -536,8 +756,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BMX", - "poolAddress": "0x303D6A634eaeEdD58f2CdbD2eaAD7090d96df15f", - "poolType": "burnMint", + "pool": { + "address": "0x303D6A634eaeEdD58f2CdbD2eaAD7090d96df15f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BMX", "tokenAddress": "0x66eEd5FF1701E6ed8470DC391F05e27B1d0657eb" }, @@ -545,8 +769,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BMX", - "poolAddress": "0x0366ac315670Cde909317F6fbf954E2De28CE5c1", - "poolType": "burnMint", + "pool": { + "address": "0x0366ac315670Cde909317F6fbf954E2De28CE5c1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BMX", "tokenAddress": "0xC28f1D82874ccFebFE6afDAB3c685D5E709067E5" } @@ -556,8 +784,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOB", - "poolAddress": "0xf924B3Ac2d63145Ad88BcD2621a63Cd7D650673e", - "poolType": "lockRelease", + "pool": { + "address": "0xf924B3Ac2d63145Ad88BcD2621a63Cd7D650673e", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "BOB", "tokenAddress": "0xB0BD54846a92b214C04A63B26AD7Dc5e19A60808" }, @@ -565,8 +797,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOB", - "poolAddress": "0x7E685254A1c696CF8A72a2F05d3eDBf18Ea624Bb", - "poolType": "burnMint", + "pool": { + "address": "0x7E685254A1c696CF8A72a2F05d3eDBf18Ea624Bb", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "BOB", "tokenAddress": "0x52B5fB4B0F6572B8C44d0251Cc224513ac5eB7E7" }, @@ -574,8 +810,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOB", - "poolAddress": "0x9Dfaaa0826b8D81Ea7Cf7ED95619574bcb47d6EA", - "poolType": "burnMint", + "pool": { + "address": "0x9Dfaaa0826b8D81Ea7Cf7ED95619574bcb47d6EA", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BOB", "tokenAddress": "0xC9746F73cC33a36c2cD55b8aEFD732586946Cedd" } @@ -585,8 +825,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOLD Stablecoin", - "poolAddress": "0xCfC5092583C1B2122F221F524C198ABDeCBf3D1b", - "poolType": "burnMint", + "pool": { + "address": "0xCfC5092583C1B2122F221F524C198ABDeCBf3D1b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "BOLD", "tokenAddress": "0x03569CC076654F82679C4BA2124D64774781B01D" }, @@ -594,8 +838,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOLD Stablecoin", - "poolAddress": "0xCfC5092583C1B2122F221F524C198ABDeCBf3D1b", - "poolType": "burnMint", + "pool": { + "address": "0xCfC5092583C1B2122F221F524C198ABDeCBf3D1b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BOLD", "tokenAddress": "0xf05a207442f14E446b0e32b12D2043bfc68Cb1C9" }, @@ -603,8 +851,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOLD Stablecoin", - "poolAddress": "0x10A9DE252EB9e11841fa58B18fD09aB43d4B7D92", - "poolType": "burnMint", + "pool": { + "address": "0x10A9DE252EB9e11841fa58B18fD09aB43d4B7D92", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BOLD", "tokenAddress": "0x03569CC076654F82679C4BA2124D64774781B01D" }, @@ -612,8 +864,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOLD Stablecoin", - "poolAddress": "0x10A9DE252EB9e11841fa58B18fD09aB43d4B7D92", - "poolType": "burnMint", + "pool": { + "address": "0x10A9DE252EB9e11841fa58B18fD09aB43d4B7D92", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BOLD", "tokenAddress": "0x03569CC076654F82679C4BA2124D64774781B01D" }, @@ -621,8 +877,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOLD Stablecoin", - "poolAddress": "0x10A9DE252EB9e11841fa58B18fD09aB43d4B7D92", - "poolType": "burnMint", + "pool": { + "address": "0x10A9DE252EB9e11841fa58B18fD09aB43d4B7D92", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BOLD", "tokenAddress": "0x03569CC076654F82679C4BA2124D64774781B01D" }, @@ -630,8 +890,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOLD Stablecoin", - "poolAddress": "0x10A9DE252EB9e11841fa58B18fD09aB43d4B7D92", - "poolType": "burnMint", + "pool": { + "address": "0x10A9DE252EB9e11841fa58B18fD09aB43d4B7D92", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BOLD", "tokenAddress": "0x03569CC076654F82679C4BA2124D64774781B01D" }, @@ -639,8 +903,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOLD Stablecoin", - "poolAddress": "0x48Fd11f0F21bAC2D8486E6682fE1E2Cb98f9AAb1", - "poolType": "burnMint", + "pool": { + "address": "0x48Fd11f0F21bAC2D8486E6682fE1E2Cb98f9AAb1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "BOLD", "tokenAddress": "0x84533b1512A3A23F0c9668D88FDf86FEffdbb11A" }, @@ -648,8 +916,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOLD Stablecoin", - "poolAddress": "0xf05a207442f14E446b0e32b12D2043bfc68Cb1C9", - "poolType": "lockRelease", + "pool": { + "address": "0xf05a207442f14E446b0e32b12D2043bfc68Cb1C9", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "BOLD", "tokenAddress": "0x6440f144b7e50D6a8439336510312d2F54beB01D" }, @@ -657,8 +929,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOLD Stablecoin", - "poolAddress": "0xA7D08c8252FCc5D6B4889eD8E80Ecd5BA37498C4", - "poolType": "burnMint", + "pool": { + "address": "0xA7D08c8252FCc5D6B4889eD8E80Ecd5BA37498C4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BOLD", "tokenAddress": "0xe09B197f8c517ba8EA9440C31a8dDCD049CF7ccC" }, @@ -666,8 +942,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BOLD Stablecoin", - "poolAddress": "0xCfC5092583C1B2122F221F524C198ABDeCBf3D1b", - "poolType": "burnMint", + "pool": { + "address": "0xCfC5092583C1B2122F221F524C198ABDeCBf3D1b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "BOLD", "tokenAddress": "0xf05a207442f14E446b0e32b12D2043bfc68Cb1C9" } @@ -677,8 +957,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x932406A77B3cfd3EF845c7f2999Bae933Ae03739", - "poolType": "burnMint", + "pool": { + "address": "0x932406A77B3cfd3EF845c7f2999Bae933Ae03739", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BONE", "tokenAddress": "0xec0CA5d2F362A826fa8F53C89A5Ce1C17CD604fa" }, @@ -686,8 +970,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x20Dacf037b437854926CAee12BfbEbAB123e6E69", - "poolType": "burnMint", + "pool": { + "address": "0x20Dacf037b437854926CAee12BfbEbAB123e6E69", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BONE", "tokenAddress": "0xF543915698bf89BD6d429adC79577d75DA2FA1fd" }, @@ -695,8 +983,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x6d567695bA1e375e2F994181Aa997328c0bDaE72", - "poolType": "burnMint", + "pool": { + "address": "0x6d567695bA1e375e2F994181Aa997328c0bDaE72", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BONE", "tokenAddress": "0xD301a90cb3C7a9253305af30D92dd2C1FD1e704E" }, @@ -704,8 +996,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x476e0714DE6Fcf0d009Eb4c4E8a8DB325BF2Ba4A", - "poolType": "burnMint", + "pool": { + "address": "0x476e0714DE6Fcf0d009Eb4c4E8a8DB325BF2Ba4A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BONE", "tokenAddress": "0x32aF448529b5067f9E4aBf9764ecfcE97d53aFD4" }, @@ -713,8 +1009,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x2d08A8979C9aE629a22dE33A884aF58bC31e2460", - "poolType": "burnMint", + "pool": { + "address": "0x2d08A8979C9aE629a22dE33A884aF58bC31e2460", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BONE", "tokenAddress": "0x387090cDEa72d6Ab1598394d45c5B3e05616f15D" }, @@ -722,8 +1022,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x37Bbd2052751c42Dc0C2A7A02A140FDE6A1F8416", - "poolType": "burnMint", + "pool": { + "address": "0x37Bbd2052751c42Dc0C2A7A02A140FDE6A1F8416", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BONE", "tokenAddress": "0x88B81FD1753FEF7bbFf3BbC65E4Ba73a28CC9449" }, @@ -731,8 +1035,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x795411Fe0C1f88B30D18F5061589Afd140e49Ff0", - "poolType": "burnMint", + "pool": { + "address": "0x795411Fe0C1f88B30D18F5061589Afd140e49Ff0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BONE", "tokenAddress": "0xe1886337D2ecBdB48A9dE8a68e8dEa2Ba9C5dFd2" }, @@ -740,8 +1048,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0xee83E603b755889ceB652F3D8af3C735a98C486D", - "poolType": "burnMint", + "pool": { + "address": "0xee83E603b755889ceB652F3D8af3C735a98C486D", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "BONE", "tokenAddress": "0xDd2D32Fea6e166fA53DEe5c1584456c0e8A889f5" }, @@ -749,8 +1061,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x691435ED2282052a064B8748BA2E3C7eeefcA8Fd", - "poolType": "burnMint", + "pool": { + "address": "0x691435ED2282052a064B8748BA2E3C7eeefcA8Fd", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BONE", "tokenAddress": "0x79a7d4EF9870474F18A88524Bf2349393B0C2e03" }, @@ -758,8 +1074,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x2B96db391d0f35f821e53De72508237492247e16", - "poolType": "burnMint", + "pool": { + "address": "0x2B96db391d0f35f821e53De72508237492247e16", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BONE", "tokenAddress": "0x2F0B60F0e269dc01132bdCcdD48Bb8CF33021f0a" }, @@ -767,8 +1087,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x67Df6368177C950914C0F634d1a003a6caa18aC0", - "poolType": "burnMint", + "pool": { + "address": "0x67Df6368177C950914C0F634d1a003a6caa18aC0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BONE", "tokenAddress": "0x4A7961249E49642474f9161f245Fc52D59F14113" }, @@ -776,8 +1100,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x7f399748490c25E32D3b8aaE4f0322c6466082B6", - "poolType": "burnMint", + "pool": { + "address": "0x7f399748490c25E32D3b8aaE4f0322c6466082B6", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BONE", "tokenAddress": "0x010c6F656E06f12BB3b115FCBC9ca282654795D2" }, @@ -785,8 +1113,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x9ecde69DF43aDd57AA60949e6Db5AC7b6DC11831", - "poolType": "burnMint", + "pool": { + "address": "0x9ecde69DF43aDd57AA60949e6Db5AC7b6DC11831", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BONE", "tokenAddress": "0x23535421f6e13F2084684BB052F58d1b33E0dB8e" }, @@ -794,8 +1126,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x37cB2B7A45F8d17936EBaBB4Ed95dE61f5371022", - "poolType": "burnMint", + "pool": { + "address": "0x37cB2B7A45F8d17936EBaBB4Ed95dE61f5371022", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BONE", "tokenAddress": "0xeF76346aBA1F8c671BA6F51cCb47e93b4BF72aa0" }, @@ -803,8 +1139,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0xc75aCdceF4c679eaCb7a8CF1eF486B9Cf77478f8", - "poolType": "lockRelease", + "pool": { + "address": "0xc75aCdceF4c679eaCb7a8CF1eF486B9Cf77478f8", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "BONE", "tokenAddress": "0x9813037ee2218799597d83D4a5B6F3b6778218d9" }, @@ -812,8 +1152,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x1cdFc3B0fE64bb943829063D16ff7f835c0Fc28C", - "poolType": "burnMint", + "pool": { + "address": "0x1cdFc3B0fE64bb943829063D16ff7f835c0Fc28C", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BONE", "tokenAddress": "0x56357929B7d7720ac19ad55c923E85EdAC4Fc5D3" }, @@ -821,8 +1165,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0xb88784Ff6fF162D3CD338627eBc171b08B17A1A3", - "poolType": "burnMint", + "pool": { + "address": "0xb88784Ff6fF162D3CD338627eBc171b08B17A1A3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "BONE", "tokenAddress": "0xe785f763d30f583EE6666Fa0e84f8bc32E9D57B9" }, @@ -830,8 +1178,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0xd17E7239feEF68Ac9fdeC962F8cCbEcb3E130F5D", - "poolType": "burnMint", + "pool": { + "address": "0xd17E7239feEF68Ac9fdeC962F8cCbEcb3E130F5D", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BONE", "tokenAddress": "0xc4B60B24F644282aaF6739bc7eb1888C69dB2A4F" }, @@ -839,8 +1191,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BONE SHIBASWAP", - "poolAddress": "0x9342547460E0BE4C9559caE9cfF5E0772371F9Da", - "poolType": "burnMint", + "pool": { + "address": "0x9342547460E0BE4C9559caE9cfF5E0772371F9Da", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "BONE", "tokenAddress": "0x50E23d57309C61eab3D3d1EfE5DC02A36f945027" } @@ -850,8 +1206,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Bedrock", - "poolAddress": "0xEbaf5275843E4Ea7C9867307BB801D2a829e2a58", - "poolType": "burnMint", + "pool": { + "address": "0xEbaf5275843E4Ea7C9867307BB801D2a829e2a58", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BR", "tokenAddress": "0xd352dc6e5F0c45E2F2b38eb5565EB286A1ea4087" }, @@ -859,8 +1219,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Bedrock", - "poolAddress": "0x2E02DF052e7C4a12e1B334DC3D182c39bb754dc3", - "poolType": "lockRelease", + "pool": { + "address": "0x2E02DF052e7C4a12e1B334DC3D182c39bb754dc3", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "BR", "tokenAddress": "0xFf7d6A96ae471BbCD7713aF9CB1fEeB16cf56B41" }, @@ -868,8 +1232,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Bedrock", - "poolAddress": "0xA67AA68B1fF880dA771f2646a95d789EF929610b", - "poolType": "burnMint", + "pool": { + "address": "0xA67AA68B1fF880dA771f2646a95d789EF929610b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BR", "tokenAddress": "0xd6122ddADa244913521F3d62006eaF756c157660" }, @@ -877,8 +1245,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Bedrock", - "poolAddress": "0x3d430E1380286560899B94E3E9459c4ec300EF9a", - "poolType": "burnMint", + "pool": { + "address": "0x3d430E1380286560899B94E3E9459c4ec300EF9a", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BR", "tokenAddress": "0x9B61879e91a0b1322F3d61c23Aaf936231882096" }, @@ -886,8 +1258,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Bedrock", - "poolAddress": "3m8zgkeD3WSEqqjkG8UehV9uwAunkZoiZK99ZjPsyZxH", - "poolType": "burnMint", + "pool": { + "address": "3m8zgkeD3WSEqqjkG8UehV9uwAunkZoiZK99ZjPsyZxH", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BR", "tokenAddress": "BRryKTBVA4xYbgY6kkZtRWGEKz4aujNMeBkqNLRQbzp1" } @@ -897,8 +1273,12 @@ "allowListEnabled": false, "decimals": 8, "name": "brBTC", - "poolAddress": "0x163b337546725c1ef4b943f8d5113af803b5e01e3bc567d000f6565ca38e0aec", - "poolType": "burnMint", + "pool": { + "address": "0x163b337546725c1ef4b943f8d5113af803b5e01e3bc567d000f6565ca38e0aec", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "brBTC", "tokenAddress": "0x8e51106b139001f1f25a320066621a2e0d140724ee9be1d49aaf9e76ceb24d75" }, @@ -906,8 +1286,12 @@ "allowListEnabled": false, "decimals": 8, "name": "brBTC", - "poolAddress": "0xC82793e403a637ded107C3c9D0785776e46852A8", - "poolType": "burnMint", + "pool": { + "address": "0xC82793e403a637ded107C3c9D0785776e46852A8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "brBTC", "tokenAddress": "0x93919784C523f39CACaa98Ee0a9d96c3F32b593e" }, @@ -915,8 +1299,12 @@ "allowListEnabled": false, "decimals": 8, "name": "brBTC", - "poolAddress": "0x5390E2e17C896244B7544e8566E9D77599700DE5", - "poolType": "burnMint", + "pool": { + "address": "0x5390E2e17C896244B7544e8566E9D77599700DE5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "brBTC", "tokenAddress": "0x733a6c29eDA4a58931AE81b8d91e29f2EAf01df3" }, @@ -924,8 +1312,12 @@ "allowListEnabled": false, "decimals": 8, "name": "brBTC", - "poolAddress": "0x30837313d7f9B0450267ccf269A36EdE3A963E56", - "poolType": "burnMint", + "pool": { + "address": "0x30837313d7f9B0450267ccf269A36EdE3A963E56", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "brBTC", "tokenAddress": "0x3376eBCa0A85Fc8D791B1001a571C41fdd61514a" }, @@ -933,8 +1325,12 @@ "allowListEnabled": false, "decimals": 8, "name": "brBTC", - "poolAddress": "0xa08Eb272f3d0bE2ee6D6586fE7A8a129387118d4", - "poolType": "burnMint", + "pool": { + "address": "0xa08Eb272f3d0bE2ee6D6586fE7A8a129387118d4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "brBTC", "tokenAddress": "0xa161132371C94299D215915D4Cbc3B629E2059Be" }, @@ -942,8 +1338,12 @@ "allowListEnabled": false, "decimals": 8, "name": "brBTC", - "poolAddress": "0x110D97B046920e23d201d147B2AfD9e853Ec7c28", - "poolType": "burnMint", + "pool": { + "address": "0x110D97B046920e23d201d147B2AfD9e853Ec7c28", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "brBTC", "tokenAddress": "0xa161132371C94299D215915D4Cbc3B629E2059Be" }, @@ -951,8 +1351,12 @@ "allowListEnabled": false, "decimals": 8, "name": "brBTC", - "poolAddress": "0x330BF3C554ab94533069AF11313143eD3884cf15", - "poolType": "burnMint", + "pool": { + "address": "0x330BF3C554ab94533069AF11313143eD3884cf15", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "brBTC", "tokenAddress": "0xDfc7D2d003A053b2E0490531e9317A59962b511E" }, @@ -960,8 +1364,12 @@ "allowListEnabled": false, "decimals": 8, "name": "brBTC", - "poolAddress": "0x512c2Ddf5f7F48a6c44cFF73CD8d7edEC5e6b0d8", - "poolType": "burnMint", + "pool": { + "address": "0x512c2Ddf5f7F48a6c44cFF73CD8d7edEC5e6b0d8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "brBTC", "tokenAddress": "0x2eC37d45FCAE65D9787ECf71dc85a444968f6646" }, @@ -969,8 +1377,12 @@ "allowListEnabled": false, "decimals": 8, "name": "brBTC", - "poolAddress": "HzJ3Y9MCuywRV4YLd6a8gigee3WDpWUv1dS5z57QNRaT", - "poolType": "burnMint", + "pool": { + "address": "HzJ3Y9MCuywRV4YLd6a8gigee3WDpWUv1dS5z57QNRaT", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "brBTC", "tokenAddress": "brBg8x9yT4WnQd8Z43aX7wfrGMrimLfT2WCWRibHo3d" } @@ -980,8 +1392,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BTR Token", - "poolAddress": "0x786248B634B1ebC7B5fc809c74a1A212fc920d63", - "poolType": "lockRelease", + "pool": { + "address": "0x786248B634B1ebC7B5fc809c74a1A212fc920d63", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "BTR", "tokenAddress": "0x0E4cF4Affdb72b39Ea91fA726D291781cBd020bF" }, @@ -989,8 +1405,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BTR token", - "poolAddress": "0x86248bE697645cfE0fdeB37FBa0102604f355eFA", - "poolType": "burnMint", + "pool": { + "address": "0x86248bE697645cfE0fdeB37FBa0102604f355eFA", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BTR", "tokenAddress": "0xfed13D0c40790220fbdE712987079Eda1Ed75C51" }, @@ -998,8 +1418,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BTR token", - "poolAddress": "0xC78210649aF8A450C0f6E98107a0b614a3198359", - "poolType": "burnMint", + "pool": { + "address": "0xC78210649aF8A450C0f6E98107a0b614a3198359", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "BTR", "tokenAddress": "0x6C76dE483F1752Ac8473e2B4983A873991e70dA7" } @@ -1009,8 +1433,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BYTES", - "poolAddress": "0xAb2e4F219E1A24bA061E0Ecf07c0e3Dc7d410A9A", - "poolType": "burnMint", + "pool": { + "address": "0xAb2e4F219E1A24bA061E0Ecf07c0e3Dc7d410A9A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BYTES", "tokenAddress": "0x13af0Fe9eB35e91758B467f95cbc78e16FdD8B6b" }, @@ -1018,8 +1446,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BYTES", - "poolAddress": "0x5d8cf2624Aafd77b5E2bA9d729658F9BD2058069", - "poolType": "burnMint", + "pool": { + "address": "0x5d8cf2624Aafd77b5E2bA9d729658F9BD2058069", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "BYTES", "tokenAddress": "0x13af0Fe9eB35e91758B467f95cbc78e16FdD8B6b" }, @@ -1027,8 +1459,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BYTES", - "poolAddress": "0x0ef01909C4aA5403654452729149F0Db8C7be1E1", - "poolType": "lockRelease", + "pool": { + "address": "0x0ef01909C4aA5403654452729149F0Db8C7be1E1", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "BYTES", "tokenAddress": "0xa19f5264F7D7Be11c451C093D8f92592820Bea86" }, @@ -1036,8 +1472,12 @@ "allowListEnabled": false, "decimals": 18, "name": "BYTES", - "poolAddress": "0x8Cc3af9D6f107124791A34DFD05A496983b0c11e", - "poolType": "burnMint", + "pool": { + "address": "0x8Cc3af9D6f107124791A34DFD05A496983b0c11e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "BYTES", "tokenAddress": "0x13af0Fe9eB35e91758B467f95cbc78e16FdD8B6b" } @@ -1047,8 +1487,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Canned dog", - "poolAddress": "0x5d7ccbaa5b0D65aa8A2Ed5989B32C64963fDF370", - "poolType": "burnMint", + "pool": { + "address": "0x5d7ccbaa5b0D65aa8A2Ed5989B32C64963fDF370", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CANNED", "tokenAddress": "0xa2e543EE6531bb9640dde7ad018eA965cD936a67" }, @@ -1056,8 +1500,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Canned dog", - "poolAddress": "0x9076EFCAC1a98dF0edC756e3892ED0F54A2F4A29", - "poolType": "lockRelease", + "pool": { + "address": "0x9076EFCAC1a98dF0edC756e3892ED0F54A2F4A29", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "CANNED", "tokenAddress": "0x5d63C604803BbF7919953b73c89309B5CBcc227a" } @@ -1067,8 +1515,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Forkast", - "poolAddress": "0xEcfec1595D273A71aC94370eA1C62480569dCAFf", - "poolType": "burnMint", + "pool": { + "address": "0xEcfec1595D273A71aC94370eA1C62480569dCAFf", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CGX", "tokenAddress": "0xdBDE08d475bd50E2D1A6af34c7b10DD430D8396e" }, @@ -1076,8 +1528,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Forkast", - "poolAddress": "0x394d5854216d0d44c3828f49e201917451eb477B", - "poolType": "burnMint", + "pool": { + "address": "0x394d5854216d0d44c3828f49e201917451eb477B", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CGX", "tokenAddress": "0x656fE582B4C6DC95c598EA54dc820eb36152E2f7" } @@ -1087,8 +1543,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Chintai Exchange Token", - "poolAddress": "0x4ea2cb69c1a347cB2eEE8FE0EfFA2762b4aD68bb", - "poolType": "burnMint", + "pool": { + "address": "0x4ea2cb69c1a347cB2eEE8FE0EfFA2762b4aD68bb", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CHEX", "tokenAddress": "0x9Ce84F6A69986a83d92C324df10bC8E64771030f" }, @@ -1096,8 +1556,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Chintai Exchange Token", - "poolAddress": "0x1c01171761A94538377FD0FDA230ec921274Df47", - "poolType": "burnMint", + "pool": { + "address": "0x1c01171761A94538377FD0FDA230ec921274Df47", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CHEX", "tokenAddress": "0xc43F3Ae305a92043bd9b62eBd2FE14F7547ee485" }, @@ -1105,8 +1569,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Chintai Exchange Token", - "poolAddress": "0xAF819a87231cF522f1e2b2965acdbC436c737c98", - "poolType": "burnMint", + "pool": { + "address": "0xAF819a87231cF522f1e2b2965acdbC436c737c98", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CHEX", "tokenAddress": "0x9Ce84F6A69986a83d92C324df10bC8E64771030f" } @@ -1116,8 +1584,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Chiikawa", - "poolAddress": "0xCE5c6D7383BB72Fd7890f07aCF51C76A36ac00fB", - "poolType": "burnMint", + "pool": { + "address": "0xCE5c6D7383BB72Fd7890f07aCF51C76A36ac00fB", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CHIKA", "tokenAddress": "0xff70300dDED939Ff6db9174EB38EeC183a12344b" }, @@ -1125,8 +1597,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Chiikawa", - "poolAddress": "0x9aD61F86CD457da798C859c26517acd1FC971c04", - "poolType": "lockRelease", + "pool": { + "address": "0x9aD61F86CD457da798C859c26517acd1FC971c04", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "CHIKA", "tokenAddress": "0x61CFA29261d8151D39244b8FfCf8DFd2f9DF3839" } @@ -1136,8 +1612,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Cakepie", - "poolAddress": "0xA690C439dCd4a5507FCEB4Da0517a69e8244DB90", - "poolType": "burnMint", + "pool": { + "address": "0xA690C439dCd4a5507FCEB4Da0517a69e8244DB90", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CKP", "tokenAddress": "0x2B5D9ADea07B590b638FFc165792b2C610EdA649" }, @@ -1145,8 +1625,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Cakepie", - "poolAddress": "0x97Cb0f52CF2270971eB588C1CE664F65382cd032", - "poolType": "burnMint", + "pool": { + "address": "0x97Cb0f52CF2270971eB588C1CE664F65382cd032", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CKP", "tokenAddress": "0x346Af1954e3d6be46B96dA713a1f7fD2d1928F1d" } @@ -1156,8 +1640,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clBTC", - "poolAddress": "0xDDf56a92120E54B39D2E4ba4e92Cb23d45304e48", - "poolType": "burnMint", + "pool": { + "address": "0xDDf56a92120E54B39D2E4ba4e92Cb23d45304e48", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "clBTC", "tokenAddress": "0xb944e1ceb32E5672Bf48fE7145D1A5D4F3D95D25" }, @@ -1165,8 +1653,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clBTC", - "poolAddress": "0x77fBC9CBCd931d4059Df523950F9f685a6003eA1", - "poolType": "lockRelease", + "pool": { + "address": "0x77fBC9CBCd931d4059Df523950F9f685a6003eA1", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "clBTC", "tokenAddress": "0x8d2757EA27AaBf172DA4CCa4e5474c76016e3dC5" }, @@ -1174,8 +1666,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clBTC", - "poolAddress": "0x604Ea3Dd67754bbd309a1657A2f5108559EEaBC9", - "poolType": "burnMint", + "pool": { + "address": "0x604Ea3Dd67754bbd309a1657A2f5108559EEaBC9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "clBTC", "tokenAddress": "0x7a4c2C39e25ca0D6A1Ac4af14dD601c2A7eDA8Ae" }, @@ -1183,8 +1679,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clBTC", - "poolAddress": "0xBb8b739C28898F7d143584380e7b689ecCaB2c9F", - "poolType": "burnMint", + "pool": { + "address": "0xBb8b739C28898F7d143584380e7b689ecCaB2c9F", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "clBTC", "tokenAddress": "0x7a4c2C39e25ca0D6A1Ac4af14dD601c2A7eDA8Ae" } @@ -1194,8 +1694,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Creative Token", - "poolAddress": "0xE9daD7c1D857F09547703Be89Be102ca232D9837", - "poolType": "lockRelease", + "pool": { + "address": "0xE9daD7c1D857F09547703Be89Be102ca232D9837", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "CRTV", "tokenAddress": "0x4B62D9b3DE9FAB98659693c9ee488D2E4eE56c44" }, @@ -1203,8 +1707,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Creative Token", - "poolAddress": "0x7A16780ABCa3CB7C1968c7C726C31A4916F4F828", - "poolType": "burnMint", + "pool": { + "address": "0x7A16780ABCa3CB7C1968c7C726C31A4916F4F828", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CRTV", "tokenAddress": "0x06B9f097407084b9C7d82EA82E8FC693d3394eB6" }, @@ -1212,8 +1720,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Creative Token", - "poolAddress": "0x07d31ab079BF606BADdb806cced99D23284E62F2", - "poolType": "burnMint", + "pool": { + "address": "0x07d31ab079BF606BADdb806cced99D23284E62F2", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CRTV", "tokenAddress": "0xEB531C4470E8588520a7deb8B5Ea2289f9a9ad0f" } @@ -1223,8 +1735,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sol Killer", - "poolAddress": "0x1dBDd800477B67191B70C51f327968f0F835c58d", - "poolType": "burnMint", + "pool": { + "address": "0x1dBDd800477B67191B70C51f327968f0F835c58d", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "DAMN", "tokenAddress": "0x28be0935fd470C46325Bc47A1c65C168E8473a3d" }, @@ -1232,8 +1748,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sol Killer", - "poolAddress": "0x68D443e22AEd9bdEF014Fad3FD19752CCeaE9990", - "poolType": "lockRelease", + "pool": { + "address": "0x68D443e22AEd9bdEF014Fad3FD19752CCeaE9990", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "DAMN", "tokenAddress": "0xeCe898EdCc0AF91430603175F945D8de75291c70" } @@ -1243,8 +1763,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Degen Arena", - "poolAddress": "0xC8c2Fe3Df1d300F366cE831a34276d7E4dd1F9B5", - "poolType": "lockRelease", + "pool": { + "address": "0xC8c2Fe3Df1d300F366cE831a34276d7E4dd1F9B5", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "DEGEN", "tokenAddress": "0x420658A1d8B8F5C36DdAf1Bb828f347Ba9011969" }, @@ -1252,8 +1776,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Degen Arena", - "poolAddress": "0x09624a5520F0a452c5D3D8AefCd6B6E47FB5281f", - "poolType": "burnMint", + "pool": { + "address": "0x09624a5520F0a452c5D3D8AefCd6B6E47FB5281f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "DEGEN", "tokenAddress": "0xf252cf43175CF739022E3A9533b2267dcFE1A830" } @@ -1263,8 +1791,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DFX Token (L2)", - "poolAddress": "0x5B1f92CD2a3cd4137BDc16d92A78795F697bBf7c", - "poolType": "burnMint", + "pool": { + "address": "0x5B1f92CD2a3cd4137BDc16d92A78795F697bBf7c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "DFX", "tokenAddress": "0x27f485b62C4A7E635F561A87560Adf5090239E93" }, @@ -1272,8 +1804,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DFX Token", - "poolAddress": "0xc2ef2f272D2C09b0a8523cEf32C96D3A7f379979", - "poolType": "lockRelease", + "pool": { + "address": "0xc2ef2f272D2C09b0a8523cEf32C96D3A7f379979", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "DFX", "tokenAddress": "0x888888435FDe8e7d4c54cAb67f206e4199454c60" }, @@ -1281,8 +1817,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DFX Token (L2)", - "poolAddress": "0x04505E4182A2ab7989b03eB2321E3141C1c79187", - "poolType": "burnMint", + "pool": { + "address": "0x04505E4182A2ab7989b03eB2321E3141C1c79187", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "DFX", "tokenAddress": "0x27f485b62C4A7E635F561A87560Adf5090239E93" } @@ -1292,8 +1832,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Decentralized Insurance Protocol Token", - "poolAddress": "0x154d09dB12E6e1EF94e57ca1889ffEcBb90CE034", - "poolType": "burnMint", + "pool": { + "address": "0x154d09dB12E6e1EF94e57ca1889ffEcBb90CE034", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "DIP", "tokenAddress": "0xAc86f3556cBd2b4d800D17ADC3a266B500FCB9F5" }, @@ -1301,8 +1845,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Decentralized Insurance Protocol", - "poolAddress": "0xAc3453eEF710e1E6457383F29D696Db5435Bf95b", - "poolType": "lockRelease", + "pool": { + "address": "0xAc3453eEF710e1E6457383F29D696Db5435Bf95b", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "DIP", "tokenAddress": "0xc719d010B63E5bbF2C0551872CD5316ED26AcD83" } @@ -1312,8 +1860,12 @@ "allowListEnabled": false, "decimals": 9, "name": "DogeBonk.com", - "poolAddress": "0x51364bc1a2FB9BC271612BF0936E857B5e000aAb", - "poolType": "lockRelease", + "pool": { + "address": "0x51364bc1a2FB9BC271612BF0936E857B5e000aAb", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "DOBO", "tokenAddress": "0xAe2DF9F730c54400934c06a17462c41C08a06ED8" }, @@ -1321,8 +1873,12 @@ "allowListEnabled": false, "decimals": 9, "name": "DogeBonk.com", - "poolAddress": "0x5F49Ef413B9A0e8C31bf6ecBE67D9B98778294f2", - "poolType": "burnMint", + "pool": { + "address": "0x5F49Ef413B9A0e8C31bf6ecBE67D9B98778294f2", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "DOBO", "tokenAddress": "0x57798c5dc0DCcE1E720c3C4aEB7e6786FeF1BE0d" }, @@ -1330,8 +1886,12 @@ "allowListEnabled": false, "decimals": 9, "name": "DogeBonk.com", - "poolAddress": "0x11EDBA90ae48d44808AB984206F776932c8575A9", - "poolType": "burnMint", + "pool": { + "address": "0x11EDBA90ae48d44808AB984206F776932c8575A9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "DOBO", "tokenAddress": "0x57798c5dc0DCcE1E720c3C4aEB7e6786FeF1BE0d" }, @@ -1339,8 +1899,12 @@ "allowListEnabled": false, "decimals": 9, "name": "DogeBonk.com", - "poolAddress": "0x817404e98d28b8065c6e1C76E6bCD9088aEFb31A", - "poolType": "burnMint", + "pool": { + "address": "0x817404e98d28b8065c6e1C76E6bCD9088aEFb31A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "DOBO", "tokenAddress": "0x3683f8F60A4a52ba7F26c43626E274913020aDaC" } @@ -1350,8 +1914,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Dolomite", - "poolAddress": "0x9E7728077F753dFDF53C2236097E27C743890992", - "poolType": "burnMint", + "pool": { + "address": "0x9E7728077F753dFDF53C2236097E27C743890992", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "DOLO", "tokenAddress": "0x0F81001eF0A83ecCE5ccebf63EB302c70a39a654" }, @@ -1359,8 +1927,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Dolomite", - "poolAddress": "0xeDD4b6936bDD9Fc272ac3a8dDC4A1b61b5C26bAC", - "poolType": "burnMint", + "pool": { + "address": "0xeDD4b6936bDD9Fc272ac3a8dDC4A1b61b5C26bAC", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "DOLO", "tokenAddress": "0x0F81001eF0A83ecCE5ccebf63EB302c70a39a654" }, @@ -1368,8 +1940,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Dolomite", - "poolAddress": "0xC69e7a187fA739028Ee613426795D91B610932c7", - "poolType": "burnMint", + "pool": { + "address": "0xC69e7a187fA739028Ee613426795D91B610932c7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "DOLO", "tokenAddress": "0x0F81001eF0A83ecCE5ccebf63EB302c70a39a654" } @@ -1379,8 +1955,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DefiPulse Index", - "poolAddress": "0x5dFdAF7A7BDB9Da17FF22a8a796e2fcE58daA5b2", - "poolType": "burnMint", + "pool": { + "address": "0x5dFdAF7A7BDB9Da17FF22a8a796e2fcE58daA5b2", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "DPI", "tokenAddress": "0x9737C658272e66Faad39D7AD337789Ee6D54F500" }, @@ -1388,8 +1968,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DefiPulse Index", - "poolAddress": "0xA77Ca3B16aEe1e177FD8Eff038F929819B75490f", - "poolType": "burnMint", + "pool": { + "address": "0xA77Ca3B16aEe1e177FD8Eff038F929819B75490f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "DPI", "tokenAddress": "0xc6955B85b622369a54Cc8C6DBeCb8e03c0885BD8" }, @@ -1397,8 +1981,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DefiPulse Index", - "poolAddress": "0x9b8FEf06D74c3880FC6886b3c6FbbBf601Db0DCC", - "poolType": "lockRelease", + "pool": { + "address": "0x9b8FEf06D74c3880FC6886b3c6FbbBf601Db0DCC", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "DPI", "tokenAddress": "0x1494CA1F11D487c2bBe4543E90080AeBa4BA3C2b" } @@ -1408,8 +1996,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Diversified Staked ETH Index", - "poolAddress": "0xabB35cA480b3f9bcB770fCB7447017373da2Bea6", - "poolType": "burnMint", + "pool": { + "address": "0xabB35cA480b3f9bcB770fCB7447017373da2Bea6", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "dsETH", "tokenAddress": "0x6320320979A901aAb3461A8D9718Ab9CF07E73D3" }, @@ -1417,8 +2009,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Diversified Staked ETH Index", - "poolAddress": "0x9061247649e327B7DFd256D882dCC0A0D6d86A8e", - "poolType": "burnMint", + "pool": { + "address": "0x9061247649e327B7DFd256D882dCC0A0D6d86A8e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "dsETH", "tokenAddress": "0x37E7C051Dc5A24313cEEC581222882648ba537aa" }, @@ -1426,8 +2022,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Diversified Staked ETH Index (dsETH)", - "poolAddress": "0x8E7ebBb95e369BC854Ee7021C7CF2E282c3bCAEa", - "poolType": "lockRelease", + "pool": { + "address": "0x8E7ebBb95e369BC854Ee7021C7CF2E282c3bCAEa", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "dsETH", "tokenAddress": "0x341c05c0E9b33C0E38d64de76516b2Ce970bB3BE" } @@ -1437,8 +2037,12 @@ "allowListEnabled": false, "decimals": 18, "name": "EARNM Token", - "poolAddress": "0xaB9502c8886Bd9CEd344A3684784a5e4C0fC46d0", - "poolType": "burnMint", + "pool": { + "address": "0xaB9502c8886Bd9CEd344A3684784a5e4C0fC46d0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "EARNM", "tokenAddress": "0xcF1C66E3CF649F8E29835337687Be692896a23c5" }, @@ -1446,8 +2050,12 @@ "allowListEnabled": false, "decimals": 18, "name": "EARNM Token", - "poolAddress": "0xaB9502c8886Bd9CEd344A3684784a5e4C0fC46d0", - "poolType": "burnMint", + "pool": { + "address": "0xaB9502c8886Bd9CEd344A3684784a5e4C0fC46d0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "EARNM", "tokenAddress": "0xcF1C66E3CF649F8E29835337687Be692896a23c5" }, @@ -1455,8 +2063,12 @@ "allowListEnabled": false, "decimals": 18, "name": "EARNM Token", - "poolAddress": "0xaB9502c8886Bd9CEd344A3684784a5e4C0fC46d0", - "poolType": "burnMint", + "pool": { + "address": "0xaB9502c8886Bd9CEd344A3684784a5e4C0fC46d0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "EARNM", "tokenAddress": "0xcF1C66E3CF649F8E29835337687Be692896a23c5" }, @@ -1464,8 +2076,12 @@ "allowListEnabled": false, "decimals": 18, "name": "EARNM Token", - "poolAddress": "0xaB9502c8886Bd9CEd344A3684784a5e4C0fC46d0", - "poolType": "lockRelease", + "pool": { + "address": "0xaB9502c8886Bd9CEd344A3684784a5e4C0fC46d0", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "EARNM", "tokenAddress": "0xBA98B09050F8837424fa8b71B4802c61cb1a4097" } @@ -1475,8 +2091,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Eden Token", - "poolAddress": "0x74d0DD4551e4BF18e13c630C1a537fAF323bB43C", - "poolType": "burnMint", + "pool": { + "address": "0x74d0DD4551e4BF18e13c630C1a537fAF323bB43C", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "EDEN", "tokenAddress": "0x235B6fe22B4642aDa16D311855c49Ce7DE260841" }, @@ -1484,8 +2104,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Eden Token", - "poolAddress": "0xC8ADf2f51a35b0a9d8f74675b64c954Ca2Dcbc14", - "poolType": "burnMint", + "pool": { + "address": "0xC8ADf2f51a35b0a9d8f74675b64c954Ca2Dcbc14", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "EDEN", "tokenAddress": "0x24A3D725C37A8D1a66Eb87f0E5D07fE67c120035" } @@ -1495,8 +2119,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Bridged egETH", - "poolAddress": "0xac939a46B8CE13205C68e949205c4683cfE715Ca", - "poolType": "burnMint", + "pool": { + "address": "0xac939a46B8CE13205C68e949205c4683cfE715Ca", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "Bridged egETH", "tokenAddress": "0x6C49A527bdd2E09D4337C8699aA7B44dD053Eda8" }, @@ -1504,8 +2132,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Eigenpie Restaked ETH", - "poolAddress": "0x4E63008092645521CFc989FB78c1324CDd371ed0", - "poolType": "lockRelease", + "pool": { + "address": "0x4E63008092645521CFc989FB78c1324CDd371ed0", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "egETH", "tokenAddress": "0x18f313Fc6Afc9b5FD6f0908c1b3D476E3feA1DD9" }, @@ -1513,8 +2145,12 @@ "allowListEnabled": false, "decimals": 18, "name": "egETH", - "poolAddress": "0x2e797C6b88bEBbD540831F4E55Ed56fDf06a49a7", - "poolType": "burnMint", + "pool": { + "address": "0x2e797C6b88bEBbD540831F4E55Ed56fDf06a49a7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "egETH", "tokenAddress": "0x8631e02168176AB709Cadf4Bcaea0B6266f5fa41" } @@ -1524,8 +2160,12 @@ "allowListEnabled": false, "decimals": 9, "name": "elizaOS", - "poolAddress": "0x3092650398cF38c548eA512C69564b086a357bcD", - "poolType": "burnMint", + "pool": { + "address": "0x3092650398cF38c548eA512C69564b086a357bcD", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "elizaOS", "tokenAddress": "0xea17Df5Cf6D172224892B5477A16ACb111182478" }, @@ -1533,8 +2173,12 @@ "allowListEnabled": false, "decimals": 9, "name": "elizaOS", - "poolAddress": "0x074D27002E1f0b89fEd9685af6e15a6EA8141A33", - "poolType": "burnMint", + "pool": { + "address": "0x074D27002E1f0b89fEd9685af6e15a6EA8141A33", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "elizaOS", "tokenAddress": "0xea17Df5Cf6D172224892B5477A16ACb111182478" }, @@ -1542,8 +2186,12 @@ "allowListEnabled": false, "decimals": 9, "name": "elizaOS", - "poolAddress": "0xC03F9E6c1C5F5D553C77781327640E0c7d30a73d", - "poolType": "burnMint", + "pool": { + "address": "0xC03F9E6c1C5F5D553C77781327640E0c7d30a73d", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "elizaOS", "tokenAddress": "0xea17Df5Cf6D172224892B5477A16ACb111182478" }, @@ -1551,8 +2199,12 @@ "allowListEnabled": false, "decimals": 9, "name": "elizaOS", - "poolAddress": "9RyrjX5Jy3gFpYa4HLBBiK9sHWvvC9YTDKh1XZzJynSz", - "poolType": "burnMint", + "pool": { + "address": "9RyrjX5Jy3gFpYa4HLBBiK9sHWvvC9YTDKh1XZzJynSz", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "elizaOS", "tokenAddress": "DuMbhu7mvQvqQHGcnikDgb4XegXJRyhUBfdU22uELiZA" } @@ -1562,8 +2214,12 @@ "allowListEnabled": false, "decimals": 8, "name": "EmGEMx Switzerland", - "poolAddress": "0x0Fc71Baa3d2e40299c2c8039F6d7a24eF43509d8", - "poolType": "lockRelease", + "pool": { + "address": "0x0Fc71Baa3d2e40299c2c8039F6d7a24eF43509d8", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "EmCH", "tokenAddress": "0xA445bA2c94d9dE6bFd13F2fe4165E738C4330710" }, @@ -1571,8 +2227,12 @@ "allowListEnabled": false, "decimals": 8, "name": "EmGEMx Switzerland", - "poolAddress": "0x4488d79B3996364dBa219d98e82a6B0A3D937E62", - "poolType": "burnMint", + "pool": { + "address": "0x4488d79B3996364dBa219d98e82a6B0A3D937E62", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "EmCH", "tokenAddress": "0xA445bA2c94d9dE6bFd13F2fe4165E738C4330710" } @@ -1582,8 +2242,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lorenzo Wrapped Bitcoin", - "poolAddress": "0xcb0FcCcb7a624395BaE54C3d3D0Ee27BC61Bd57a", - "poolType": "lockRelease", + "pool": { + "address": "0xcb0FcCcb7a624395BaE54C3d3D0Ee27BC61Bd57a", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "enzoBTC", "tokenAddress": "0x6A9A65B84843F5fD4aC9a0471C4fc11AFfFBce4a" }, @@ -1591,8 +2255,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lorenzo Wrapped Bitcoin", - "poolAddress": "0xDA1EbA3837Ea8D96e6c24494F8590028Bc7C4788", - "poolType": "burnMint", + "pool": { + "address": "0xDA1EbA3837Ea8D96e6c24494F8590028Bc7C4788", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "enzoBTC", "tokenAddress": "0x1586E9A616B969e26f0712C504320a6800b5ce91" } @@ -1602,8 +2270,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ETHx", - "poolAddress": "0xc707F7E0f73c17a4eE7D3965c7b3c5E0ab42cBf5", - "poolType": "burnMint", + "pool": { + "address": "0xc707F7E0f73c17a4eE7D3965c7b3c5E0ab42cBf5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "ETHx", "tokenAddress": "0xED65C5085a18Fa160Af0313E60dcc7905E944Dc7" }, @@ -1611,8 +2283,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ETHx", - "poolAddress": "0xb144FcE921D564d77FD9F226965984654C1AFA55", - "poolType": "burnMint", + "pool": { + "address": "0xb144FcE921D564d77FD9F226965984654C1AFA55", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "ETHx", "tokenAddress": "0xc54B43eaF921A5194c7973A4d65E055E5a1453c2" }, @@ -1620,8 +2296,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ETHx", - "poolAddress": "0xeAD31B98179e2637Bb052a970Ac92Cbb2E26461d", - "poolType": "lockRelease", + "pool": { + "address": "0xeAD31B98179e2637Bb052a970Ac92Cbb2E26461d", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "ETHx", "tokenAddress": "0xA35b1B31Ce002FBF2058D22F30f95D405200A15b" } @@ -1631,8 +2311,12 @@ "allowListEnabled": false, "decimals": 6, "name": "eUSX Token", - "poolAddress": "0x60A97bd9ACf755954Ff0fE85837224f2920a57F3", - "poolType": "burnMint", + "pool": { + "address": "0x60A97bd9ACf755954Ff0fE85837224f2920a57F3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "eUSX", "tokenAddress": "0x21ACfc23D57dB524599dA96603acb5e97De2b7B2" }, @@ -1640,8 +2324,12 @@ "allowListEnabled": false, "decimals": 6, "name": "eUSX ", - "poolAddress": "3BLXohtpL2iyHsJLYzp4fmy9ZjbjE7ocPfDMFaU7U3gD", - "poolType": "lockRelease", + "pool": { + "address": "3BLXohtpL2iyHsJLYzp4fmy9ZjbjE7ocPfDMFaU7U3gD", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "eUSX", "tokenAddress": "3ThdFZQKM6kRyVGLG48kaPg5TRMhYMKY1iCRa9xop1WC" } @@ -1651,8 +2339,12 @@ "allowListEnabled": false, "decimals": 18, "name": "FEED", - "poolAddress": "0x6419221A0856f507a0b869814e461033d810990b", - "poolType": "burnMint", + "pool": { + "address": "0x6419221A0856f507a0b869814e461033d810990b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "FEED", "tokenAddress": "0xc3d77Eb7665eDF3c1D3Bdaa325A14D6ff254d2dD" }, @@ -1660,8 +2352,12 @@ "allowListEnabled": false, "decimals": 18, "name": "FEED", - "poolAddress": "0x9a22e73ef65F7EA0E6f2aE40F6847c944D3B5153", - "poolType": "lockRelease", + "pool": { + "address": "0x9a22e73ef65F7EA0E6f2aE40F6847c944D3B5153", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "FEED", "tokenAddress": "0xe9Cb2D7ADC24Fc59FE00D6C0A0669BDF16805Fe0" } @@ -1671,8 +2367,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Falcon Finance", - "poolAddress": "0x470ed414d305D2C784501Cc68e086E3B59d6E51E", - "poolType": "burnMint", + "pool": { + "address": "0x470ed414d305D2C784501Cc68e086E3B59d6E51E", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "FF", "tokenAddress": "0xAC23B90A79504865D52B49B327328411a23d4dB2" }, @@ -1680,8 +2380,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Falcon Finance", - "poolAddress": "0x05ddaB21b57d0Dca8C3955c366526A229577558e", - "poolType": "lockRelease", + "pool": { + "address": "0x05ddaB21b57d0Dca8C3955c366526A229577558e", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "FF", "tokenAddress": "0xFA1C09fC8B491B6A4d3Ff53A10CAd29381b3F949" } @@ -1691,8 +2395,12 @@ "allowListEnabled": false, "decimals": 18, "name": "MindNetwork FHE Token", - "poolAddress": "0x8FA979BCf82859C994b82166390DFB03951CA86D", - "poolType": "burnMint", + "pool": { + "address": "0x8FA979BCf82859C994b82166390DFB03951CA86D", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "FHE", "tokenAddress": "0xd55C9fB62E176a8Eb6968f32958FeFDD0962727E" }, @@ -1700,8 +2408,12 @@ "allowListEnabled": false, "decimals": 18, "name": "MindNetwork FHE Token", - "poolAddress": "0xCf2B643114b1098E5bc09B49f4D73C6A8Ea1c871", - "poolType": "burnMint", + "pool": { + "address": "0xCf2B643114b1098E5bc09B49f4D73C6A8Ea1c871", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "FHE", "tokenAddress": "0x8096cD953Fa2ABa1E60Dad27A3e58d71dF2F62F1" }, @@ -1709,8 +2421,12 @@ "allowListEnabled": false, "decimals": 18, "name": "MindNetwork FHE Token", - "poolAddress": "0x0c31b5DcF3CD6e588938D0699912d0028c911362", - "poolType": "lockRelease", + "pool": { + "address": "0x0c31b5DcF3CD6e588938D0699912d0028c911362", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "FHE", "tokenAddress": "0xd55C9fB62E176a8Eb6968f32958FeFDD0962727E" }, @@ -1718,8 +2434,12 @@ "allowListEnabled": false, "decimals": 18, "name": "MindNetwork FHE Token", - "poolAddress": "0xA88AEdaF95c85b5618379765f2725fFa6313B9DA", - "poolType": "burnMint", + "pool": { + "address": "0xA88AEdaF95c85b5618379765f2725fFa6313B9DA", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "FHE", "tokenAddress": "0xd55C9fB62E176a8Eb6968f32958FeFDD0962727E" }, @@ -1727,8 +2447,12 @@ "allowListEnabled": false, "decimals": 9, "name": "MindNetwork FHE Token", - "poolAddress": "DJSZFhHPB197D5HRTvmPZ5e446wZihscHAPVmgw8jZ23", - "poolType": "burnMint", + "pool": { + "address": "DJSZFhHPB197D5HRTvmPZ5e446wZihscHAPVmgw8jZ23", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "FHE", "tokenAddress": "AUyYTiXWP77qerK7Ccb12oz27kdVcqCqDCe8MUBCWqWH" } @@ -1738,8 +2462,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Fluid", - "poolAddress": "0x2d29D728C48C3F75e221D28d844E2bdFe5656BfC", - "poolType": "burnMint", + "pool": { + "address": "0x2d29D728C48C3F75e221D28d844E2bdFe5656BfC", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "FLUID", "tokenAddress": "0x61E030A56D33e8260FdD81f03B162A79Fe3449Cd" }, @@ -1747,8 +2475,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Fluid", - "poolAddress": "0x99D94f528CeA3eE1791ab7B476A1FACb4297CA17", - "poolType": "burnMint", + "pool": { + "address": "0x99D94f528CeA3eE1791ab7B476A1FACb4297CA17", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "FLUID", "tokenAddress": "0x61E030A56D33e8260FdD81f03B162A79Fe3449Cd" }, @@ -1756,8 +2488,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Fluid", - "poolAddress": "0x639f35C5E212D61Fe14Bd5CD8b66aAe4df11a50c", - "poolType": "lockRelease", + "pool": { + "address": "0x639f35C5E212D61Fe14Bd5CD8b66aAe4df11a50c", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "FLUID", "tokenAddress": "0x6f40d4A6237C257fff2dB00FA0510DeEECd303eb" }, @@ -1765,8 +2501,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Fluid", - "poolAddress": "0x10fD7245f6ca39885D3A398b03dCcCC833fC96A1", - "poolType": "burnMint", + "pool": { + "address": "0x10fD7245f6ca39885D3A398b03dCcCC833fC96A1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "FLUID", "tokenAddress": "0x61E030A56D33e8260FdD81f03B162A79Fe3449Cd" }, @@ -1774,8 +2514,12 @@ "allowListEnabled": false, "decimals": 9, "name": "FLUID", - "poolAddress": "G9gWPSi5WFQuDEujXZgtuaD63uGmaGwfot6MiRZZ9pNm", - "poolType": "burnMint", + "pool": { + "address": "G9gWPSi5WFQuDEujXZgtuaD63uGmaGwfot6MiRZZ9pNm", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "FLUID", "tokenAddress": "DuEy8wWrzCUun5ZbbG9hkVqXqqicpTQw8gB7nEAzpCHQ" } @@ -1785,8 +2529,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Generative Protocol", - "poolAddress": "0x4097142E53fAA47b02f57D61Cf58787c3B6d951b", - "poolType": "burnMint", + "pool": { + "address": "0x4097142E53fAA47b02f57D61Cf58787c3B6d951b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "GEN", "tokenAddress": "0x876ceF4219752930c93446fF15bF64A94ed404D5" }, @@ -1794,8 +2542,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Generative Protocol", - "poolAddress": "0x003491Bdfe15179aC2cEfEf9F5D0e235F096C3b0", - "poolType": "burnMint", + "pool": { + "address": "0x003491Bdfe15179aC2cEfEf9F5D0e235F096C3b0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "GEN", "tokenAddress": "0x442457bA124721f7e0AB7bf8a80FBc35ACDdc9f5" } @@ -1805,8 +2557,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Gho Token", - "poolAddress": "0xDe6539018B095353A40753Dc54C91C68c9487D4E", - "poolType": "burnMint", + "pool": { + "address": "0xDe6539018B095353A40753Dc54C91C68c9487D4E", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "GHO", "tokenAddress": "0xfc421aD3C883Bf9E7C4f42dE845C4e4405799e73" }, @@ -1814,8 +2570,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Gho Token", - "poolAddress": "0xB94Ab28c6869466a46a42abA834ca2B3cECCA5eB", - "poolType": "burnMint", + "pool": { + "address": "0xB94Ab28c6869466a46a42abA834ca2B3cECCA5eB", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "GHO", "tokenAddress": "0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33" }, @@ -1823,8 +2583,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Gho Token", - "poolAddress": "0x98217A06721Ebf727f2C8d9aD7718ec28b7aAe34", - "poolType": "burnMint", + "pool": { + "address": "0x98217A06721Ebf727f2C8d9aD7718ec28b7aAe34", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "GHO", "tokenAddress": "0x6Bb7a212910682DCFdbd5BCBb3e28FB4E8da10Ee" }, @@ -1832,8 +2596,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Gho Token", - "poolAddress": "0xDe6539018B095353A40753Dc54C91C68c9487D4E", - "poolType": "burnMint", + "pool": { + "address": "0xDe6539018B095353A40753Dc54C91C68c9487D4E", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "GHO", "tokenAddress": "0xfc421aD3C883Bf9E7C4f42dE845C4e4405799e73" }, @@ -1841,8 +2609,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Gho Token", - "poolAddress": "0x06179f7C1be40863405f374E7f5F8806c728660A", - "poolType": "lockRelease", + "pool": { + "address": "0x06179f7C1be40863405f374E7f5F8806c728660A", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "GHO", "tokenAddress": "0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f" }, @@ -1850,8 +2622,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Gho Token", - "poolAddress": "0x360d8aa8F6b09B7BC57aF34db2Eb84dD87bf4d12", - "poolType": "burnMint", + "pool": { + "address": "0x360d8aa8F6b09B7BC57aF34db2Eb84dD87bf4d12", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "GHO", "tokenAddress": "0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3" }, @@ -1859,8 +2635,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Gho Token", - "poolAddress": "0xDe6539018B095353A40753Dc54C91C68c9487D4E", - "poolType": "burnMint", + "pool": { + "address": "0xDe6539018B095353A40753Dc54C91C68c9487D4E", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "GHO", "tokenAddress": "0xfc421aD3C883Bf9E7C4f42dE845C4e4405799e73" } @@ -1870,8 +2650,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Graph Token", - "poolAddress": "0xf0b6E11fB42fA8874cCB422C22D8036b1742B783", - "poolType": "burnMint", + "pool": { + "address": "0xf0b6E11fB42fA8874cCB422C22D8036b1742B783", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "GRT", "tokenAddress": "0x408A6A9E7aFa805B92953e5E92D93d5DCCa2B4a2" }, @@ -1879,8 +2663,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Graph Token", - "poolAddress": "0x318Ec96df83AccC18B5EAD5D23e0F022F7Eb5503", - "poolType": "lockRelease", + "pool": { + "address": "0x318Ec96df83AccC18B5EAD5D23e0F022F7Eb5503", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "GRT", "tokenAddress": "0x9623063377AD1B27544C965cCd7342f7EA7e88C7" }, @@ -1888,8 +2676,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Graph Token", - "poolAddress": "0xC1E69F1b34E7F8d05919965Fc81FC7aDB546A52b", - "poolType": "burnMint", + "pool": { + "address": "0xC1E69F1b34E7F8d05919965Fc81FC7aDB546A52b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "GRT", "tokenAddress": "0x7CCC78a24C3311eB6f6806f6fcf2c07CAe78CfE3" } @@ -1899,8 +2691,12 @@ "allowListEnabled": false, "decimals": 18, "name": "High Yield ETH Index", - "poolAddress": "0x288B1b97603b4ae48F18B893caf721f20fcb0E59", - "poolType": "burnMint", + "pool": { + "address": "0x288B1b97603b4ae48F18B893caf721f20fcb0E59", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "hyETH", "tokenAddress": "0x8b5D1d8B3466eC21f8eE33cE63F319642c026142" }, @@ -1908,8 +2704,12 @@ "allowListEnabled": false, "decimals": 18, "name": "High Yield ETH Index", - "poolAddress": "0xbEE038Af079a702b2ED0af7886DA101443Ddb1CE", - "poolType": "burnMint", + "pool": { + "address": "0xbEE038Af079a702b2ED0af7886DA101443Ddb1CE", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "hyETH", "tokenAddress": "0xC73e76Aa9F14C1837CDB49bd028E8Ff5a0a71dAD" }, @@ -1917,8 +2717,12 @@ "allowListEnabled": false, "decimals": 18, "name": "High Yield ETH Index", - "poolAddress": "0x3999490C55Fb8332F5f3AD00212435526fA3E576", - "poolType": "lockRelease", + "pool": { + "address": "0x3999490C55Fb8332F5f3AD00212435526fA3E576", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "hyETH", "tokenAddress": "0xc4506022Fb8090774E8A628d5084EED61D9B99Ee" } @@ -1928,8 +2732,12 @@ "allowListEnabled": false, "decimals": 8, "name": "iBTC", - "poolAddress": "0xCBeD22C12b9CBFaBa8E352D1EC6279885Df8725F", - "poolType": "burnMint", + "pool": { + "address": "0xCBeD22C12b9CBFaBa8E352D1EC6279885Df8725F", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "IBTC", "tokenAddress": "0x050C24dBf1eEc17babE5fc585F06116A259CC77A" }, @@ -1937,8 +2745,12 @@ "allowListEnabled": false, "decimals": 8, "name": "iBTC", - "poolAddress": "0x206E9A22B384d3863b606C41030Ec2A19D3CBb95", - "poolType": "burnMint", + "pool": { + "address": "0x206E9A22B384d3863b606C41030Ec2A19D3CBb95", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "IBTC", "tokenAddress": "0x12418783e860997eb99e8aCf682DF952F721cF62" }, @@ -1946,8 +2758,12 @@ "allowListEnabled": false, "decimals": 8, "name": "iBTC", - "poolAddress": "0xb6f8e9604BAFD1482631740931783998e9E736A7", - "poolType": "burnMint", + "pool": { + "address": "0xb6f8e9604BAFD1482631740931783998e9E736A7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "IBTC", "tokenAddress": "0x2bAa7E92F3F14883264BfA63058cC223Ad719438" }, @@ -1955,8 +2771,12 @@ "allowListEnabled": false, "decimals": 8, "name": "iBTC", - "poolAddress": "0x08B4058F16D243C977ea1fe91B20Af31057b5aBb", - "poolType": "burnMint", + "pool": { + "address": "0x08B4058F16D243C977ea1fe91B20Af31057b5aBb", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "IBTC", "tokenAddress": "0x20157DBAbb84e3BBFE68C349d0d44E48AE7B5AD2" } @@ -1966,8 +2786,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Iluminary Token", - "poolAddress": "0xa132F089492CcE5f1D79483a9e4552f37266ed01", - "poolType": "burnMint", + "pool": { + "address": "0xa132F089492CcE5f1D79483a9e4552f37266ed01", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "ILMT", "tokenAddress": "0x98a0a245Ef9A96Cf28f1Ebf1a3b3bC562Ed8D783" }, @@ -1975,8 +2799,12 @@ "allowListEnabled": false, "decimals": 8, "name": "iLuminary Token", - "poolAddress": "GhgD4CQxPxrV3Ad3xaZn6AAJ6f1R5rKN3n2gkBzQ23jU", - "poolType": "burnMint", + "pool": { + "address": "GhgD4CQxPxrV3Ad3xaZn6AAJ6f1R5rKN3n2gkBzQ23jU", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "ILMT", "tokenAddress": "Au6V6WrkjWZYSdCJtJFYPysZXr1qncHXZshZ7w8SnDjv" } @@ -1986,8 +2814,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xPlanetIX", - "poolAddress": "0x1e9C67b9cbe6FfFfDc441Be359d9f78B5167f30E", - "poolType": "burnMint", + "pool": { + "address": "0x1e9C67b9cbe6FfFfDc441Be359d9f78B5167f30E", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "xIXT", "tokenAddress": "0x8b04bf3358B88e3630aa64C1c76FF3B6C699C6a7" }, @@ -1995,8 +2827,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xPlanetIX", - "poolAddress": "0x803e3858B81E0595E5F39946a68AF3546D629ee7", - "poolType": "burnMint", + "pool": { + "address": "0x803e3858B81E0595E5F39946a68AF3546D629ee7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xIXT", "tokenAddress": "0x8b04bf3358B88e3630aa64C1c76FF3B6C699C6a7" }, @@ -2004,8 +2840,12 @@ "allowListEnabled": false, "decimals": 18, "name": "PlanetIX", - "poolAddress": "0xF85fB90550bB01905556Efd7B07eDe487097Bf78", - "poolType": "burnMint", + "pool": { + "address": "0xF85fB90550bB01905556Efd7B07eDe487097Bf78", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "IXT", "tokenAddress": "0xD32B4e4a565A1B786979276de16a13eA2e10bECd" }, @@ -2013,8 +2853,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xPlanetIX", - "poolAddress": "0x51df9751404DB200b354ED6a5e27DdA6C557883D", - "poolType": "burnMint", + "pool": { + "address": "0x51df9751404DB200b354ED6a5e27DdA6C557883D", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xIXT", "tokenAddress": "0x8b04bf3358B88e3630aa64C1c76FF3B6C699C6a7" }, @@ -2022,8 +2866,12 @@ "allowListEnabled": false, "decimals": 18, "name": "PlanetIX", - "poolAddress": "0x8206A135cac573a2f96873dc7ad7C83B08725FaB", - "poolType": "lockRelease", + "pool": { + "address": "0x8206A135cac573a2f96873dc7ad7C83B08725FaB", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "IXT", "tokenAddress": "0xE06Bd4F5aAc8D0aA337D13eC88dB6defC6eAEefE" } @@ -2033,8 +2881,12 @@ "allowListEnabled": false, "decimals": 18, "name": "JasmyCoin", - "poolAddress": "0xc929ad75B72593967DE83E7F7Cda0493458261D9", - "poolType": "burnMint", + "pool": { + "address": "0xc929ad75B72593967DE83E7F7Cda0493458261D9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "JASMY", "tokenAddress": "0x991Ad9149f3fe170ACc152BE2D46B804de688Ed8" }, @@ -2042,8 +2894,12 @@ "allowListEnabled": false, "decimals": 18, "name": "JasmyCoin", - "poolAddress": "0x3f7AeF129Ce37EA06150C176677bEc75EF29A33f", - "poolType": "lockRelease", + "pool": { + "address": "0x3f7AeF129Ce37EA06150C176677bEc75EF29A33f", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "JASMY", "tokenAddress": "0x7420B4b9a0110cdC71fB720908340C03F9Bc03EC" } @@ -2053,8 +2909,12 @@ "allowListEnabled": false, "decimals": 18, "name": "JANCTION", - "poolAddress": "0xdA1B1B3d3C97974B272E28f70F25Ab7c290e8357", - "poolType": "burnMint", + "pool": { + "address": "0xdA1B1B3d3C97974B272E28f70F25Ab7c290e8357", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "JCT", "tokenAddress": "0xeA37A8DE1de2d9D10772EEB569e28Bfa5Cb17707" }, @@ -2062,8 +2922,12 @@ "allowListEnabled": false, "decimals": 18, "name": "JANCTION", - "poolAddress": "0x58e53cad56180743aCE00349Ef3E1BFE4EfF5732", - "poolType": "burnMint", + "pool": { + "address": "0x58e53cad56180743aCE00349Ef3E1BFE4EfF5732", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "JCT", "tokenAddress": "0xC477B6dfd26EC2460b3b92de18837Fd476Ea7549" } @@ -2073,8 +2937,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Kinetiq Staked HYPE", - "poolAddress": "0xca02b4fd9a4e5dAd986eA2Ecb5d7bb43fa9bC605", - "poolType": "lockRelease", + "pool": { + "address": "0xca02b4fd9a4e5dAd986eA2Ecb5d7bb43fa9bC605", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "kHYPE", "tokenAddress": "0xfD739d4e423301CE9385c1fb8850539D657C296D" }, @@ -2082,8 +2950,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Kinetiq Staked HYPE", - "poolAddress": "0xf76A0c47900ca2dD1874AB4Dc4049810E919684d", - "poolType": "burnMint", + "pool": { + "address": "0xf76A0c47900ca2dD1874AB4Dc4049810E919684d", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "kHYPE", "tokenAddress": "0x319053B625e598994Dd1179948771a4C2f66b873" } @@ -2093,8 +2965,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Kingnet AI", - "poolAddress": "0x02E5F79eFD3c5e0306fD1127787EA672634AACF1", - "poolType": "burnMint", + "pool": { + "address": "0x02E5F79eFD3c5e0306fD1127787EA672634AACF1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "KNET", "tokenAddress": "0x8b24BF9fE8BB1D4D9deA81Eebc9Fed6F0Fc67a46" }, @@ -2102,8 +2978,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Kingnet AI", - "poolAddress": "5skyDWAPgiNe7ttGoEEdn4Z3dHxvkF4vi3wGdebQ76cR", - "poolType": "lockRelease", + "pool": { + "address": "5skyDWAPgiNe7ttGoEEdn4Z3dHxvkF4vi3wGdebQ76cR", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "KNET", "tokenAddress": "CfVs3waH2Z9TM397qSkaipTDhA9wWgtt8UchZKfwkYiu" } @@ -2113,8 +2993,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Landshare Token", - "poolAddress": "0x3404C137c2AA3Cf69c7322c6f39a6cbd8c3b769D", - "poolType": "lockRelease", + "pool": { + "address": "0x3404C137c2AA3Cf69c7322c6f39a6cbd8c3b769D", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "LAND", "tokenAddress": "0xA73164DB271931CF952cBaEfF9E8F5817b42fA5C" }, @@ -2122,8 +3006,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Landshare Token", - "poolAddress": "0x0d13d3683DD866FDfd6707976eb38Fa9A058E100", - "poolType": "burnMint", + "pool": { + "address": "0x0d13d3683DD866FDfd6707976eb38Fa9A058E100", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LAND", "tokenAddress": "0x27Bc2757fAb0b8aB406016D1f71d8123452095d3" }, @@ -2131,8 +3019,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Landshare Token", - "poolAddress": "0x047beEDAC57540d407db63aD6CF72Bde07c5B093", - "poolType": "burnMint", + "pool": { + "address": "0x047beEDAC57540d407db63aD6CF72Bde07c5B093", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LAND", "tokenAddress": "0xC03E6ad83dE7C58c9166fF08D66B960d78e64105" } @@ -2142,8 +3034,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lombard Staked Bitcoin", - "poolAddress": "0xd24658051aa6c8ACf874F686D5dA325a87d2D146", - "poolType": "burnMint", + "pool": { + "address": "0xd24658051aa6c8ACf874F686D5dA325a87d2D146", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LBTC", "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" }, @@ -2151,8 +3047,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lombard Staked Bitcoin", - "poolAddress": "0xc6c22D4Be6Cc50E6D01BD6325b6cD715A52f8154", - "poolType": "burnMint", + "pool": { + "address": "0xc6c22D4Be6Cc50E6D01BD6325b6cD715A52f8154", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LBTC", "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" }, @@ -2160,8 +3060,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lombard Staked Bitcoin", - "poolAddress": "0xf191a1CE04fD54f090B4d97316258b6009C562d7", - "poolType": "burnMint", + "pool": { + "address": "0xf191a1CE04fD54f090B4d97316258b6009C562d7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LBTC", "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" }, @@ -2169,8 +3073,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lombard Staked Bitcoin", - "poolAddress": "0x770D1bbdca08e3272233709B27C004F510bfDf86", - "poolType": "burnMint", + "pool": { + "address": "0x770D1bbdca08e3272233709B27C004F510bfDf86", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LBTC", "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" }, @@ -2178,8 +3086,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lombard Staked Bitcoin", - "poolAddress": "0x2A70CbF60a9252Ff312719885088283f930750BA", - "poolType": "burnMint", + "pool": { + "address": "0x2A70CbF60a9252Ff312719885088283f930750BA", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LBTC", "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" }, @@ -2187,8 +3099,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lombard Staked Bitcoin", - "poolAddress": "0x9Ef2919f333Cdf13Fb609C0341bE0c852f691788", - "poolType": "burnMint", + "pool": { + "address": "0x9Ef2919f333Cdf13Fb609C0341bE0c852f691788", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LBTC", "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" }, @@ -2196,8 +3112,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lombard Staked Bitcoin", - "poolAddress": "0x88E18636EfFC3b3cd520FC72B710eb99C0017BC7", - "poolType": "burnMint", + "pool": { + "address": "0x88E18636EfFC3b3cd520FC72B710eb99C0017BC7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LBTC", "tokenAddress": "0x8236a87084f8B84306f72007F36F2618A5634494" }, @@ -2205,8 +3125,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lombard Staked Bitcoin", - "poolAddress": "0xD9527ffE58CbEcC9A64511Fc559e0C0825Df940a", - "poolType": "burnMint", + "pool": { + "address": "0xD9527ffE58CbEcC9A64511Fc559e0C0825Df940a", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LBTC", "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" }, @@ -2214,8 +3138,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lombard Staked Bitcoin", - "poolAddress": "0xE4B5166b1D60C2208A934176522461c470A37d56", - "poolType": "burnMint", + "pool": { + "address": "0xE4B5166b1D60C2208A934176522461c470A37d56", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LBTC", "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" }, @@ -2223,8 +3151,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lombard Staked Bitcoin", - "poolAddress": "0x775C438b07d5667aEFa3DE493A7cc2Df3a199E99", - "poolType": "burnMint", + "pool": { + "address": "0x775C438b07d5667aEFa3DE493A7cc2Df3a199E99", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LBTC", "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" }, @@ -2232,8 +3164,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lombard Staked Bitcoin", - "poolAddress": "0xD7F069e67345ED91AC699e7EcFDc211782495888", - "poolType": "burnMint", + "pool": { + "address": "0xD7F069e67345ED91AC699e7EcFDc211782495888", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LBTC", "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" }, @@ -2241,8 +3177,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Lombard Staked Bitcoin", - "poolAddress": "0xAe5E2940Fc01C0f8076D36749509C75E43da0C70", - "poolType": "burnMint", + "pool": { + "address": "0xAe5E2940Fc01C0f8076D36749509C75E43da0C70", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LBTC", "tokenAddress": "0xecAc9C5F704e954931349Da37F60E39f515c11c1" } @@ -2252,8 +3192,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Ledgity Token", - "poolAddress": "0x9C4a695903Eaa0d958F3ECabdD8b9122c08505ac", - "poolType": "burnMint", + "pool": { + "address": "0x9C4a695903Eaa0d958F3ECabdD8b9122c08505ac", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LDY", "tokenAddress": "0x999FAF0AF2fF109938eeFE6A7BF91CA56f0D07e1" }, @@ -2261,8 +3205,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Ledgity Token", - "poolAddress": "0x9d5665F2C06C77dF7B3f3bbEE0a14e63dCd614b2", - "poolType": "burnMint", + "pool": { + "address": "0x9d5665F2C06C77dF7B3f3bbEE0a14e63dCd614b2", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LDY", "tokenAddress": "0x055d20a70eFd45aB839Ae1A39603D0cFDBDd8a13" }, @@ -2270,8 +3218,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Ledgity Token", - "poolAddress": "0x542BF6910dB102D10f84565E041c2761BE95be84", - "poolType": "lockRelease", + "pool": { + "address": "0x542BF6910dB102D10f84565E041c2761BE95be84", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "LDY", "tokenAddress": "0x482dF7483a52496F4C65AB499966dfcdf4DDFDbc" } @@ -2281,8 +3233,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x56046FcadbcB62eD4b5643aF09724313624e88e1", - "poolType": "burnMint", + "pool": { + "address": "0x56046FcadbcB62eD4b5643aF09724313624e88e1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LEASH", "tokenAddress": "0x897Ce250199d102Ea103Aaf3a6E7906cde757560" }, @@ -2290,8 +3246,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x385FE033d211BEA56a2E0bF0DE39feB1cE24DFC9", - "poolType": "burnMint", + "pool": { + "address": "0x385FE033d211BEA56a2E0bF0DE39feB1cE24DFC9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LEASH", "tokenAddress": "0xf94A52468fF79862B8f288faF7900d34e74A1992" }, @@ -2299,8 +3259,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x33aC23E54A7Bfb159e781c8973B832b3bE2Bf211", - "poolType": "burnMint", + "pool": { + "address": "0x33aC23E54A7Bfb159e781c8973B832b3bE2Bf211", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LEASH", "tokenAddress": "0x2b702DC45b540aEDA62F60cE4E5BFAED37b1D27a" }, @@ -2308,8 +3272,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x2133c3b98928d0DC519Fc0607EB39DC2fc4b9df4", - "poolType": "burnMint", + "pool": { + "address": "0x2133c3b98928d0DC519Fc0607EB39DC2fc4b9df4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LEASH", "tokenAddress": "0xc55eABF6624224b6E185B6A79a3217e0e751046A" }, @@ -2317,8 +3285,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0xDFb202aD6734530d60501aEaC1BCf99688D8319F", - "poolType": "burnMint", + "pool": { + "address": "0xDFb202aD6734530d60501aEaC1BCf99688D8319F", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LEASH", "tokenAddress": "0x1649DE9028C0a6B958118A977099d66eF0DA5a92" }, @@ -2326,8 +3298,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0xB23a7814f718448ba2e1a2B362a8AB0c4e8Ab341", - "poolType": "burnMint", + "pool": { + "address": "0xB23a7814f718448ba2e1a2B362a8AB0c4e8Ab341", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LEASH", "tokenAddress": "0x90B0C73F19bd2EB9Bcd6b1C6c787a63ae851b336" }, @@ -2335,8 +3311,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x26dEd7458Bf906316b638504965D1e9D5AE73c57", - "poolType": "burnMint", + "pool": { + "address": "0x26dEd7458Bf906316b638504965D1e9D5AE73c57", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LEASH", "tokenAddress": "0xBc53643F2D736743ed29B6dC36E30F5Fb8941090" }, @@ -2344,8 +3324,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x3da3283E0D0c30b44BA899b37fD6da6D0B776646", - "poolType": "burnMint", + "pool": { + "address": "0x3da3283E0D0c30b44BA899b37fD6da6D0B776646", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LEASH", "tokenAddress": "0x4e1a69B48A7aE9Fc8fD2623089c4B378f24a64A9" }, @@ -2353,8 +3337,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0xA6a6663a159e80ad3682698b0a595DF3594491B5", - "poolType": "burnMint", + "pool": { + "address": "0xA6a6663a159e80ad3682698b0a595DF3594491B5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LEASH", "tokenAddress": "0x70Ed1C42D29678D2D5Bad7197A4281B095AD7fD6" }, @@ -2362,8 +3350,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x852467AB8b1bBB2D1c8d8802cd7820B906D4609A", - "poolType": "burnMint", + "pool": { + "address": "0x852467AB8b1bBB2D1c8d8802cd7820B906D4609A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LEASH", "tokenAddress": "0xA3D0D0C81dBe4511724f875F7f2fa794a14bee64" }, @@ -2371,8 +3363,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x975f51b7BFac520F35A791F5E4206162300244c3", - "poolType": "burnMint", + "pool": { + "address": "0x975f51b7BFac520F35A791F5E4206162300244c3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LEASH", "tokenAddress": "0xDE4dd6Db8072eb6999B88B7D7E0c8C0C01637578" }, @@ -2380,8 +3376,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x1d201c7277f971CBb6Cf32636E79187c83C58490", - "poolType": "burnMint", + "pool": { + "address": "0x1d201c7277f971CBb6Cf32636E79187c83C58490", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LEASH", "tokenAddress": "0xCEeDbfc700d17A277Ab1cA9E19A2CaF0c42ced41" }, @@ -2389,8 +3389,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x7f5BB6146B490B6C1e1c8D8fD60FDE93636274b1", - "poolType": "burnMint", + "pool": { + "address": "0x7f5BB6146B490B6C1e1c8D8fD60FDE93636274b1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LEASH", "tokenAddress": "0xa9BBE4c88F4988Ec8328e44b0889404824aBEb62" }, @@ -2398,8 +3402,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0xef98939F005Da3Aa186ebb842842569213863D17", - "poolType": "burnMint", + "pool": { + "address": "0xef98939F005Da3Aa186ebb842842569213863D17", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LEASH", "tokenAddress": "0x743C48C6057b4c2480F2458F2D1CE967dF96B724" }, @@ -2407,8 +3415,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0xEa9c3dB69C9eE60FB0B06d1A1c9077B16F2D7C82", - "poolType": "lockRelease", + "pool": { + "address": "0xEa9c3dB69C9eE60FB0B06d1A1c9077B16F2D7C82", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "LEASH", "tokenAddress": "0x27C70Cd1946795B66be9d954418546998b546634" }, @@ -2416,8 +3428,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x711948bE2234b51653dD9978c107671aF4Eb8d7F", - "poolType": "burnMint", + "pool": { + "address": "0x711948bE2234b51653dD9978c107671aF4Eb8d7F", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LEASH", "tokenAddress": "0x6aF85BfA857bB88F2E3Ae07839182491d34ca11d" }, @@ -2425,8 +3441,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x1D67640d37117Cbe876c5C50e6e2B6DE0c53dA70", - "poolType": "burnMint", + "pool": { + "address": "0x1D67640d37117Cbe876c5C50e6e2B6DE0c53dA70", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LEASH", "tokenAddress": "0x2992F24a5d1A2914C0981933E9870e76d60D299c" }, @@ -2434,8 +3454,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0x5EF69257f95d822b7D6dd60Ee574A34e66D6B3B2", - "poolType": "burnMint", + "pool": { + "address": "0x5EF69257f95d822b7D6dd60Ee574A34e66D6B3B2", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LEASH", "tokenAddress": "0x3C76af2dCCd31ac4A146C0d55cCc4bfd13051379" }, @@ -2443,8 +3467,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DOGE KILLER", - "poolAddress": "0xEaA2885DcdD6689a95642DC6d72F24F81EB170f5", - "poolType": "burnMint", + "pool": { + "address": "0xEaA2885DcdD6689a95642DC6d72F24F81EB170f5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LEASH", "tokenAddress": "0xBb1ea2697b13Cc06e03D875D2d39c06AC6dd5a93" } @@ -2454,8 +3482,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lendefi DAO", - "poolAddress": "0x934635de453A1161D02Ce395F2F59E775597fE13", - "poolType": "burnMint", + "pool": { + "address": "0x934635de453A1161D02Ce395F2F59E775597fE13", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LEND", "tokenAddress": "0x5e53AeBE377eFC92213514eC07f8EF3Af426DD1d" }, @@ -2463,8 +3495,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lendefi DAO", - "poolAddress": "0x934635de453A1161D02Ce395F2F59E775597fE13", - "poolType": "burnMint", + "pool": { + "address": "0x934635de453A1161D02Ce395F2F59E775597fE13", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LEND", "tokenAddress": "0x5e53AeBE377eFC92213514eC07f8EF3Af426DD1d" }, @@ -2472,8 +3508,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lendefi DAO", - "poolAddress": "0x934635de453A1161D02Ce395F2F59E775597fE13", - "poolType": "burnMint", + "pool": { + "address": "0x934635de453A1161D02Ce395F2F59E775597fE13", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LEND", "tokenAddress": "0x5e53AeBE377eFC92213514eC07f8EF3Af426DD1d" }, @@ -2481,8 +3521,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lendefi DAO", - "poolAddress": "0x934635de453A1161D02Ce395F2F59E775597fE13", - "poolType": "burnMint", + "pool": { + "address": "0x934635de453A1161D02Ce395F2F59E775597fE13", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LEND", "tokenAddress": "0x5e53AeBE377eFC92213514eC07f8EF3Af426DD1d" }, @@ -2490,8 +3534,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lendefi DAO", - "poolAddress": "0x934635de453A1161D02Ce395F2F59E775597fE13", - "poolType": "burnMint", + "pool": { + "address": "0x934635de453A1161D02Ce395F2F59E775597fE13", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LEND", "tokenAddress": "0x5e53AeBE377eFC92213514eC07f8EF3Af426DD1d" }, @@ -2499,8 +3547,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lendefi DAO", - "poolAddress": "0x934635de453A1161D02Ce395F2F59E775597fE13", - "poolType": "burnMint", + "pool": { + "address": "0x934635de453A1161D02Ce395F2F59E775597fE13", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LEND", "tokenAddress": "0x5e53AeBE377eFC92213514eC07f8EF3Af426DD1d" } @@ -2510,8 +3562,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xF81f4a748F8d2DbCA48Bfa704968A76fB062A358", - "poolType": "burnMint", + "pool": { + "address": "0xF81f4a748F8d2DbCA48Bfa704968A76fB062A358", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x76159c2b43ff6F630193e37EC68452169914C1Bb" }, @@ -2519,8 +3575,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xD3F31950e5Ec340b021D0d27454F44Edb7304C18", - "poolType": "burnMint", + "pool": { + "address": "0xD3F31950e5Ec340b021D0d27454F44Edb7304C18", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x76a443768A5e3B8d1AED0105FC250877841Deb40" }, @@ -2528,7 +3588,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x2Ea38D6cDb6774992d4A62fe622f4405663729Dd" }, @@ -2536,7 +3600,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xf575731b78981B86d34321d875A3D25a48479be6" }, @@ -2544,8 +3612,12 @@ "allowListEnabled": false, "decimals": 8, "name": "ChainLink Token", - "poolAddress": "0x7a5dcf83decbfc7418ae0d37be93370b47bf9bc4657dacd1a02d6f58629f6b38", - "poolType": "burnMint", + "pool": { + "address": "0x7a5dcf83decbfc7418ae0d37be93370b47bf9bc4657dacd1a02d6f58629f6b38", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x8c764993820ea735719f1ff7f1a0f80c022b18e7b5daefa35adf60a3a6556566" }, @@ -2553,7 +3625,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Chainlink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK.e", "tokenAddress": "0x5947BB275c521040051D82396192181b413227A3" }, @@ -2561,7 +3637,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x71052BAe71C25C78E37fD12E5ff1101A71d9018F" }, @@ -2569,7 +3649,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x99f0d88B81b758AB07E22C7AbA00E0121a882dEA" }, @@ -2577,7 +3661,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x56B275c0Ec034a229a1deD8DB17089544bc276D9" }, @@ -2585,7 +3673,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x5aB885CDa7216b163fb6F813DEC1E1532516c833" }, @@ -2593,7 +3685,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x30e85A5c9525AD9a7A0FA5C74df4Baf0b01aD241" }, @@ -2601,7 +3697,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x709229D9587886a1eDFeE6b5cE636E1D70d1cE39" }, @@ -2609,7 +3709,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x71052BAe71C25C78E37fD12E5ff1101A71d9018F" }, @@ -2617,7 +3721,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13" }, @@ -2625,7 +3733,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x404460C6A5EdE2D891e8297795264fDe62ADBB75" }, @@ -2633,8 +3745,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x554652E7F10fB8aa3e12226213c6826F98B09CF0", - "poolType": "burnMint", + "pool": { + "address": "0x554652E7F10fB8aa3e12226213c6826F98B09CF0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xd07294e6E917e07dfDcee882dd1e2565085C2ae0" }, @@ -2642,7 +3758,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x3902228D6A3d2Dc44731fD9d45FeE6a61c722D0b" }, @@ -2650,7 +3770,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x7311DED199CC28D80E58e81e8589aa160199FCD2" }, @@ -2658,7 +3782,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x8c80A01F461f297Df7F9DA3A4f740D7297C8Ac85" }, @@ -2666,7 +3794,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x61170ca9fB9cF98d4c7d684e07be6D969D59667E" }, @@ -2674,8 +3806,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xff170aD8f1d86eFAC90CA7a2E1204bA64aC5e0f9", - "poolType": "burnMint", + "pool": { + "address": "0xff170aD8f1d86eFAC90CA7a2E1204bA64aC5e0f9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xd2FE54D1E5F568eB710ba9d898Bf4bD02C7c0353" }, @@ -2683,7 +3819,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xf97f4df75117a78c1A5a0DBb814Af92458539FB4" }, @@ -2691,8 +3831,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xBA148bAF60CCc4d7D86aED4fCff04D5b3265cAd4", - "poolType": "burnMint", + "pool": { + "address": "0xBA148bAF60CCc4d7D86aED4fCff04D5b3265cAd4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x88Fb150BDc53A65fe94Dea0c9BA0a6dAf8C6e196" }, @@ -2700,8 +3844,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x9fCd83bC7F67ADa1fB51a4caBEa333c72B641bd1", - "poolType": "burnMint", + "pool": { + "address": "0x9fCd83bC7F67ADa1fB51a4caBEa333c72B641bd1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x93202eC683288a9EA75BB829c6baCFb2BfeA9013" }, @@ -2709,7 +3857,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x71052BAe71C25C78E37fD12E5ff1101A71d9018F" }, @@ -2717,7 +3869,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x71052BAe71C25C78E37fD12E5ff1101A71d9018F" }, @@ -2725,7 +3881,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xa18152629128738a5c081eb226335FEd4B9C95e9" }, @@ -2733,7 +3893,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xfe36cF0B43aAe49fBc5cFC5c0AF22a623114E043" }, @@ -2741,8 +3905,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xDeC8A6f06FDdA5aAE262631f37b79f182a23464B", - "poolType": "burnMint", + "pool": { + "address": "0xDeC8A6f06FDdA5aAE262631f37b79f182a23464B", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x183E3691EfF3524B2315D3703D94F922CbE51F54" }, @@ -2750,7 +3918,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x350a791Bfc2C21F9Ed5d10980Dad2e2638ffa7f6" }, @@ -2758,7 +3930,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xdB7A504CF869484dd6aC5FaF925c8386CBF7573D" }, @@ -2766,8 +3942,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xff170aD8f1d86eFAC90CA7a2E1204bA64aC5e0f9", - "poolType": "burnMint", + "pool": { + "address": "0xff170aD8f1d86eFAC90CA7a2E1204bA64aC5e0f9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x548C6944cba02B9D1C0570102c89de64D258d3Ac" }, @@ -2775,7 +3955,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x917a3964C37993e99a47C779bEb5Db1E9d13804d" }, @@ -2783,7 +3967,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xEF66491eab4bbB582c57b14778afd8dFb70D8A1A" }, @@ -2791,7 +3979,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x915b648e994d5f31059B38223b9fbe98ae185473" }, @@ -2799,7 +3991,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x8aF9711B44695a5A081F25AB9903DDB73aCf8FA9" }, @@ -2807,7 +4003,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x5D6d033B4FbD2190D99D930719fAbAcB64d2439a" }, @@ -2815,8 +4015,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xff170aD8f1d86eFAC90CA7a2E1204bA64aC5e0f9", - "poolType": "burnMint", + "pool": { + "address": "0xff170aD8f1d86eFAC90CA7a2E1204bA64aC5e0f9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x52869bae3E091e36b0915941577F2D47d8d8B534" }, @@ -2824,7 +4028,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x8ce7618E8f8E514d13889283F58FF03B794e6CC3" }, @@ -2832,7 +4040,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x318Ec96df83AccC18B5EAD5D23e0F022F7Eb5503" }, @@ -2840,7 +4052,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xd6A6ba37fAaC229B9665E86739ca501401f5a940" }, @@ -2848,7 +4064,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x7Ce6bb2Cc2D3Fd45a974Da6a0F29236cb9513a98" }, @@ -2856,7 +4076,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x63dbE12A6381D64adE47bc3D92aBF4393DFF4BC8" }, @@ -2864,7 +4088,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x1AC2EE68b8d038C982C1E1f73F596927dd70De59" }, @@ -2872,8 +4100,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x6E6CBEF068fe546ceA52af587AEd8A2EfDD846bD", - "poolType": "burnMint", + "pool": { + "address": "0x6E6CBEF068fe546ceA52af587AEd8A2EfDD846bD", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x76a443768A5e3B8d1AED0105FC250877841Deb40" }, @@ -2881,7 +4113,11 @@ "allowListEnabled": false, "decimals": 0, "name": "", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "", "tokenAddress": "0x7311DED199CC28D80E58e81e8589aa160199FCD2" }, @@ -2889,7 +4125,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x6e970e8d6758164798290c8db1D79a527ca6e1B2" }, @@ -2897,7 +4137,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x71052BAe71C25C78E37fD12E5ff1101A71d9018F" }, @@ -2905,8 +4149,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x1B7492C3bD23A4aDB448710e4275FF14A5288932", - "poolType": "lockRelease", + "pool": { + "address": "0x1B7492C3bD23A4aDB448710e4275FF14A5288932", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x514910771AF9Ca656af840dff83E8264EcF986CA" }, @@ -2914,7 +4162,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xb0897686c545045aFc77CF20eC7A532E3120E0F1" }, @@ -2922,7 +4174,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x76a443768A5e3B8d1AED0105FC250877841Deb40" }, @@ -2930,7 +4186,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x587d19DDF735D6B536aAdB1a2A92938eB23B8d5C" }, @@ -2938,7 +4198,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xd8A9246e84903e82CA01e42774b01A7CdD465BFa" }, @@ -2946,7 +4210,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x71052BAe71C25C78E37fD12E5ff1101A71d9018F" }, @@ -2954,7 +4222,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x76f257B1DDA5cC71bee4eF637Fbdde4C801310A9" }, @@ -2962,8 +4234,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x2E64625FF3b3c9d51A022B28d96935d920a2993A", - "poolType": "burnMint", + "pool": { + "address": "0x2E64625FF3b3c9d51A022B28d96935d920a2993A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x76a443768A5e3B8d1AED0105FC250877841Deb40" }, @@ -2971,7 +4247,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x76a443768A5e3B8d1AED0105FC250877841Deb40" }, @@ -2979,8 +4259,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x3fca88541D9bebe3600Ec03193FfC9D9c4d4Bb49", - "poolType": "burnMint", + "pool": { + "address": "0x3fca88541D9bebe3600Ec03193FfC9D9c4d4Bb49", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x76a443768A5e3B8d1AED0105FC250877841Deb40" }, @@ -2988,7 +4272,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xb549B375dA0c76f8b3877B9aDfDD28378f087A64" }, @@ -2996,8 +4284,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xDeC8A6f06FDdA5aAE262631f37b79f182a23464B", - "poolType": "burnMint", + "pool": { + "address": "0xDeC8A6f06FDdA5aAE262631f37b79f182a23464B", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x31EFB841d5e0b4082F7E1267dab8De1b853f2A9d" }, @@ -3005,7 +4297,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xc2C447b04e0ED3476DdbDae8E9E39bE7159d27b6" }, @@ -3013,8 +4309,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x6bBB2D614f4336784b835E392c62ed7A5345Db6e", - "poolType": "burnMint", + "pool": { + "address": "0x6bBB2D614f4336784b835E392c62ed7A5345Db6e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x3902228D6A3d2Dc44731fD9d45FeE6a61c722D0b" }, @@ -3022,7 +4322,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x938D84942f5D924070A6bb82F8e56a5E2b3098A4" }, @@ -3030,7 +4334,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x71052BAe71C25C78E37fD12E5ff1101A71d9018F" }, @@ -3038,7 +4346,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x71052BAe71C25C78E37fD12E5ff1101A71d9018F" }, @@ -3046,8 +4358,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Chainlink Token", - "poolAddress": "Gu68eAsbqHG8Jx6yLPWu3JDZEdCUzTFnrTCeRQKEy1br", - "poolType": "burnMint", + "pool": { + "address": "Gu68eAsbqHG8Jx6yLPWu3JDZEdCUzTFnrTCeRQKEy1br", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "LinkhB3afbBKb2EQQu7s7umdZceV3wcvAUJhQAfQ23L" }, @@ -3055,8 +4371,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xDeC8A6f06FDdA5aAE262631f37b79f182a23464B", - "poolType": "burnMint", + "pool": { + "address": "0xDeC8A6f06FDdA5aAE262631f37b79f182a23464B", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x32D8F819C8080ae44375F8d383Ffd39FC642f3Ec" }, @@ -3064,8 +4384,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x554652E7F10fB8aa3e12226213c6826F98B09CF0", - "poolType": "burnMint", + "pool": { + "address": "0x554652E7F10fB8aa3e12226213c6826F98B09CF0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x71052BAe71C25C78E37fD12E5ff1101A71d9018F" }, @@ -3073,8 +4397,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x0dC94D4E45031f87b7df9e9B749dBB88f67Bcd78", - "poolType": "burnMint", + "pool": { + "address": "0x0dC94D4E45031f87b7df9e9B749dBB88f67Bcd78", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x985FB0821Eef0056ec26DD8b33dC61b9415B7F4b" }, @@ -3082,7 +4410,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x41Ccf59e3F30EB624eF8E5Ea34b2da96bee472d9" }, @@ -3090,8 +4422,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x819d06D62D7Fc29cFdafEc61bE44a8DB575D6102", - "poolType": "burnMint", + "pool": { + "address": "0x819d06D62D7Fc29cFdafEc61bE44a8DB575D6102", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xc2BE2F77562A6676098e8D363B9d8A33Ea009D4e" }, @@ -3099,8 +4435,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xDeC8A6f06FDdA5aAE262631f37b79f182a23464B", - "poolType": "burnMint", + "pool": { + "address": "0xDeC8A6f06FDdA5aAE262631f37b79f182a23464B", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x80f1FcdC96B55e459BF52b998aBBE2c364935d69" }, @@ -3108,7 +4448,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token on xDai", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xE2e73A1c69ecF83F464EFCE6A5be353a37cA09b2" }, @@ -3116,8 +4460,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x414024b789097c9a81Ec2D34f95B009718f44365", - "poolType": "burnMint", + "pool": { + "address": "0x414024b789097c9a81Ec2D34f95B009718f44365", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xE27dd9BF01B55ce6803c0d81386A04212c718b95" }, @@ -3125,7 +4473,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x3662B6f73c5560229D1a98aF6e59E6649D568374" } @@ -3135,8 +4487,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Liquid Staked ETH", - "poolAddress": "0x3A4e3B9a4fb73A4015b4AFe1efe02214B614D591", - "poolType": "burnMint", + "pool": { + "address": "0x3A4e3B9a4fb73A4015b4AFe1efe02214B614D591", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LsETH", "tokenAddress": "0xB29749498954A3A821ec37BdE86e386dF3cE30B6" }, @@ -3144,8 +4500,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Liquid Staked ETH", - "poolAddress": "0xE939C02E92e9E66d1F0D8E4F099E7d3d269a8a11", - "poolType": "burnMint", + "pool": { + "address": "0xE939C02E92e9E66d1F0D8E4F099E7d3d269a8a11", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LsETH", "tokenAddress": "0xB29749498954A3A821ec37BdE86e386dF3cE30B6" }, @@ -3153,8 +4513,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Liquid Staked ETH", - "poolAddress": "0x0a02473E57902fD7764E6E952E2962763045B404", - "poolType": "lockRelease", + "pool": { + "address": "0x0a02473E57902fD7764E6E952E2962763045B404", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "LsETH", "tokenAddress": "0x8c1BEd5b9a0928467c9B1341Da1D7BD5e10b6549" } @@ -3164,8 +4528,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lumi Finance Token", - "poolAddress": "0xD27F88501e62D0BDc70B20d6ed06d8E0fF8c3812", - "poolType": "lockRelease", + "pool": { + "address": "0xD27F88501e62D0BDc70B20d6ed06d8E0fF8c3812", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "LUA", "tokenAddress": "0x88D100432F98956b16B66Df56962FD3e5cCd297A" }, @@ -3173,8 +4541,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lumi Finance Token", - "poolAddress": "0xCE562455a389F14f54135B84749ddd81Bc0bF869", - "poolType": "burnMint", + "pool": { + "address": "0xCE562455a389F14f54135B84749ddd81Bc0bF869", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LUA", "tokenAddress": "0xd61bBBB8369c46c15868ad9263a2710AcED156C4" } @@ -3184,8 +4556,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lumi Finance USD", - "poolAddress": "0x5686CCb55ee86BEB1e8A1Cf7C769930f3A5E521c", - "poolType": "lockRelease", + "pool": { + "address": "0x5686CCb55ee86BEB1e8A1Cf7C769930f3A5E521c", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "LUAUSD", "tokenAddress": "0x540ddE0739EeFAf90D0Ca05aCa90513Ce89E7e79" }, @@ -3193,8 +4569,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lumi Finance USD", - "poolAddress": "0xe6712A2b96780986342e2C3C0Accdce58fc7Ac38", - "poolType": "burnMint", + "pool": { + "address": "0xe6712A2b96780986342e2C3C0Accdce58fc7Ac38", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LUAUSD", "tokenAddress": "0x18d2bDEf572C67127E218c425f546FE64430a92C" } @@ -3204,8 +4584,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Luisa", - "poolAddress": "0xe9516fB95778682F48C551071Bb917F937229596", - "poolType": "burnMint", + "pool": { + "address": "0xe9516fB95778682F48C551071Bb917F937229596", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LUISA", "tokenAddress": "0x5699c51660C765e57793D1837B400B241cbC4B46" }, @@ -3213,8 +4597,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Luisa", - "poolAddress": "0xCa8FaCd0EB11DEB6114d515D136c79C6f4170E87", - "poolType": "lockRelease", + "pool": { + "address": "0xCa8FaCd0EB11DEB6114d515D136c79C6f4170E87", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "LUISA", "tokenAddress": "0x0cCD687CC6F8461170336D8e8cf46A39313DEab9" } @@ -3224,8 +4612,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lympid Token", - "poolAddress": "0xBCc91222266156c9e92217Bf68117fF3d8Ec5f38", - "poolType": "burnMint", + "pool": { + "address": "0xBCc91222266156c9e92217Bf68117fF3d8Ec5f38", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "LYP", "tokenAddress": "0x4837b18a6d7aF6159c8665505B90a2ed393255E0" }, @@ -3233,8 +4625,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lympid Token", - "poolAddress": "0xba0Db2166508A030324F14dEBE3a6D9d3B8A32c8", - "poolType": "burnMint", + "pool": { + "address": "0xba0Db2166508A030324F14dEBE3a6D9d3B8A32c8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "LYP", "tokenAddress": "0x4837b18a6d7aF6159c8665505B90a2ed393255E0" } @@ -3244,8 +4640,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Bridged Magpie-Peg BTC", - "poolAddress": "0xD7550e0a1C055B444D8d1a9EB3DeA02c0F09D7A1", - "poolType": "burnMint", + "pool": { + "address": "0xD7550e0a1C055B444D8d1a9EB3DeA02c0F09D7A1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "Bridged mBTC", "tokenAddress": "0x7c1cCA5b25Fa0bC9AF9275Fb53cBA89DC172b878" }, @@ -3253,8 +4653,12 @@ "allowListEnabled": false, "decimals": 8, "name": "mBTC", - "poolAddress": "0x82164603B46a79C0DDcF2E622e242f16428939DB", - "poolType": "burnMint", + "pool": { + "address": "0x82164603B46a79C0DDcF2E622e242f16428939DB", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "mBTC", "tokenAddress": "0x2172fAD929E857dDfD7dDC31E24904438434cB0B" }, @@ -3262,8 +4666,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Liquid Staked BTC", - "poolAddress": "0xd86e1fEDB7120369fF5175b74F4413Cb74FCAcDB", - "poolType": "burnMint", + "pool": { + "address": "0xd86e1fEDB7120369fF5175b74F4413Cb74FCAcDB", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "mBTC", "tokenAddress": "0x7FdFbE1fB9783745991CFb0a3D396acE6eE0c909" }, @@ -3271,8 +4679,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Liquid Staked BTC", - "poolAddress": "0x476EefeF46e0d65e1E371Fe093696259B1240B93", - "poolType": "burnMint", + "pool": { + "address": "0x476EefeF46e0d65e1E371Fe093696259B1240B93", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "mBTC", "tokenAddress": "0xbDf245957992bfBC62B07e344128a1EEc7b7eE3f" }, @@ -3280,8 +4692,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Magpie Stake BTC", - "poolAddress": "0xa6F5410BCb028c62DB6f60361C004D9740cFA82b", - "poolType": "burnMint", + "pool": { + "address": "0xa6F5410BCb028c62DB6f60361C004D9740cFA82b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "mBTC", "tokenAddress": "0x29190A076072bd71454E032F821eAAb3ba07e0D3" } @@ -3291,8 +4707,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Magpie locked DLP", - "poolAddress": "0x3fd1D7fc5fE44fCbEE3d506530b790b09EF1459B", - "poolType": "burnMint", + "pool": { + "address": "0x3fd1D7fc5fE44fCbEE3d506530b790b09EF1459B", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "mDLP", "tokenAddress": "0xfe14F790DA92971131544d915c4ADa6F1abce3Bd" }, @@ -3300,8 +4720,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Magpie locked DLP", - "poolAddress": "0x5180865890246278544ea457342b46665C196a97", - "poolType": "burnMint", + "pool": { + "address": "0x5180865890246278544ea457342b46665C196a97", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "mDLP", "tokenAddress": "0x1Cbc4BF664907669CfAB86a3b1aCC3EC8867a25F" } @@ -3311,8 +4735,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Cryptex Meme Index", - "poolAddress": "0x797C54f6E028c70d76c0031e03ab43Eb1b80fa74", - "poolType": "burnMint", + "pool": { + "address": "0x797C54f6E028c70d76c0031e03ab43Eb1b80fa74", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "MEEM", "tokenAddress": "0x15f9cec1c568352Cd48Da1E84D3e74F27f6ee160" }, @@ -3320,8 +4748,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Cryptex Meme Index", - "poolAddress": "0xbfc86CA9b7fa158287bD392eE098246465E63351", - "poolType": "lockRelease", + "pool": { + "address": "0xbfc86CA9b7fa158287bD392eE098246465E63351", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "MEEM", "tokenAddress": "0xA544b3F0c46c15F0B2b00ba3D67b56C250287905" } @@ -3331,8 +4763,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DEXTF Token", - "poolAddress": "0x6c9E5fD0FDB36AaF3293Fcc1fb43D9581F706bf7", - "poolType": "burnMint", + "pool": { + "address": "0x6c9E5fD0FDB36AaF3293Fcc1fb43D9581F706bf7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "DEXTF", "tokenAddress": "0x4816B2157203D8D4c53918e8d4076Adfe9e2FE22" }, @@ -3340,8 +4776,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Memento", - "poolAddress": "0x1c20Db242C0d8EE2cb36480211B9629a00B1e42f", - "poolType": "burnMint", + "pool": { + "address": "0x1c20Db242C0d8EE2cb36480211B9629a00B1e42f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "DEXTF", "tokenAddress": "0xB69bBB15095C0949489FBB43951d2b750Fa7fA89" }, @@ -3349,8 +4789,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DEXTF Token", - "poolAddress": "0x40fa6991CDbd66e91a25a2875d4d6fb1aF88cD91", - "poolType": "lockRelease", + "pool": { + "address": "0x40fa6991CDbd66e91a25a2875d4d6fb1aF88cD91", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "DEXTF", "tokenAddress": "0x5F64Ab1544D28732F0A24F4713c2C8ec0dA089f0" }, @@ -3358,8 +4802,12 @@ "allowListEnabled": false, "decimals": 18, "name": "DEXTF Token", - "poolAddress": "0x1c20Db242C0d8EE2cb36480211B9629a00B1e42f", - "poolType": "burnMint", + "pool": { + "address": "0x1c20Db242C0d8EE2cb36480211B9629a00B1e42f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "DEXTF", "tokenAddress": "0x5C5C6D078A6458179a2E4837Db25dA4a9330ECD4" } @@ -3369,8 +4817,12 @@ "allowListEnabled": false, "decimals": 18, "name": "MEMEX", - "poolAddress": "0xD0bFBE2f17599607AB58def61b9A30CCFF4a0505", - "poolType": "burnMint", + "pool": { + "address": "0xD0bFBE2f17599607AB58def61b9A30CCFF4a0505", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "MEMEX", "tokenAddress": "0x5e7E82B875b09e7A491611B626d90D7748d166d8" }, @@ -3378,8 +4830,12 @@ "allowListEnabled": false, "decimals": 18, "name": "MEMEX", - "poolAddress": "0x21EfedF48D33f09d948fB98dED7dE766b682F049", - "poolType": "burnMint", + "pool": { + "address": "0x21EfedF48D33f09d948fB98dED7dE766b682F049", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "MEMEX", "tokenAddress": "0xd6effD9911797742435EF3d5880545129934aBbe" } @@ -3389,8 +4845,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Metafluence", - "poolAddress": "0xC9eDf4f727A1C21b65613f29059FE9928244110b", - "poolType": "burnMint", + "pool": { + "address": "0xC9eDf4f727A1C21b65613f29059FE9928244110b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "METO", "tokenAddress": "0xa78775bba7a542F291e5ef7f13C6204E704A90Ba" }, @@ -3398,8 +4858,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Metafluence", - "poolAddress": "0x78a2AeDdb8fD3446Fda31F6451a7e11c6446F5B8", - "poolType": "burnMint", + "pool": { + "address": "0x78a2AeDdb8fD3446Fda31F6451a7e11c6446F5B8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "METO", "tokenAddress": "0x4665d6c8882F0fB1b973776C63578f9AF1A0A726" } @@ -3409,8 +4873,12 @@ "allowListEnabled": false, "decimals": 5, "name": "cat in a dogs world", - "poolAddress": "0xBF38331E34ef7f248020611bB31Be0576D06413D", - "poolType": "burnMint", + "pool": { + "address": "0xBF38331E34ef7f248020611bB31Be0576D06413D", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "MEW", "tokenAddress": "0x1b3CF4C6ad50788291160cD10bFEFafC5e4e951C" }, @@ -3418,8 +4886,12 @@ "allowListEnabled": false, "decimals": 5, "name": "cat in a dogs world", - "poolAddress": "0xBF38331E34ef7f248020611bB31Be0576D06413D", - "poolType": "burnMint", + "pool": { + "address": "0xBF38331E34ef7f248020611bB31Be0576D06413D", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "MEW", "tokenAddress": "0xE49FB237974E29AE8022347Ed14084669D70875B" }, @@ -3427,8 +4899,12 @@ "allowListEnabled": false, "decimals": 5, "name": "cat in a dogs world", - "poolAddress": "0xaf0b8f79b667055Db3a54a31144e86e841Be3dAD", - "poolType": "burnMint", + "pool": { + "address": "0xaf0b8f79b667055Db3a54a31144e86e841Be3dAD", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "MEW", "tokenAddress": "0xE49FB237974E29AE8022347Ed14084669D70875B" }, @@ -3436,8 +4912,12 @@ "allowListEnabled": false, "decimals": 5, "name": "cat in a dogs world", - "poolAddress": "BomBbNZ1jgmCin3xzhCwMe1j3ewV3DoRAKAuEy6bJ4Px", - "poolType": "lockRelease", + "pool": { + "address": "BomBbNZ1jgmCin3xzhCwMe1j3ewV3DoRAKAuEy6bJ4Px", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "MEW", "tokenAddress": "MEW1gQWJ3nEXg2qgERiKu7FAFj79PHvQVREQUzScPP5" }, @@ -3445,8 +4925,12 @@ "allowListEnabled": false, "decimals": 5, "name": "cat in a dogs world", - "poolAddress": "0x15C03488B29e27d62BAf10E30b0c474bf60E0264", - "poolType": "burnMint", + "pool": { + "address": "0x15C03488B29e27d62BAf10E30b0c474bf60E0264", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "MEW", "tokenAddress": "0xE49FB237974E29AE8022347Ed14084669D70875B" } @@ -3456,8 +4940,12 @@ "allowListEnabled": false, "decimals": 6, "name": "michi", - "poolAddress": "0x65615642056b48BCB8120C109f7e7c0c3623A8BF", - "poolType": "burnMint", + "pool": { + "address": "0x65615642056b48BCB8120C109f7e7c0c3623A8BF", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "michi", "tokenAddress": "0x18a4d375323DFAB49862aCeb1A4c6E65F8e53F67" }, @@ -3465,8 +4953,12 @@ "allowListEnabled": false, "decimals": 6, "name": "michi", - "poolAddress": "ATyY7SaiayLnp3teH3c4jRBGiPinSSZyt2gHNNN9C6BV", - "poolType": "lockRelease", + "pool": { + "address": "ATyY7SaiayLnp3teH3c4jRBGiPinSSZyt2gHNNN9C6BV", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "$michi", "tokenAddress": "5mbK36SZ7J19An8jFochhQS4of8g6BwUjbeCSxBSoWdp" } @@ -3476,8 +4968,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Milo", - "poolAddress": "0xb1F9dBF3bdc2575F338ac218fDb903E1AF8e88Fb", - "poolType": "lockRelease", + "pool": { + "address": "0xb1F9dBF3bdc2575F338ac218fDb903E1AF8e88Fb", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "MILO", "tokenAddress": "0x8FfC46A1b7a3b12F4A11Db8877d302876DCA7Ab1" }, @@ -3485,8 +4981,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Milo", - "poolAddress": "0xdD66A2a06D1201C6aA84A89248887831Fe625922", - "poolType": "burnMint", + "pool": { + "address": "0xdD66A2a06D1201C6aA84A89248887831Fe625922", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "MILO", "tokenAddress": "0xe22fe63E20c3D817121022316B2430b5A516a6CE" } @@ -3496,8 +4996,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Bridged mmETH", - "poolAddress": "0x2D1d3F65449dd3F36548bBBBD8E9f3C089d30374", - "poolType": "burnMint", + "pool": { + "address": "0x2D1d3F65449dd3F36548bBBBD8E9f3C089d30374", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "Bridged mmETH", "tokenAddress": "0x5d84E0f246E629E6AB29252ecBD9ab20e89aC845" }, @@ -3505,8 +5009,12 @@ "allowListEnabled": false, "decimals": 18, "name": "mmETH", - "poolAddress": "0xa27501561B01D99cde347a63891e8762DCa5bBbd", - "poolType": "lockRelease", + "pool": { + "address": "0xa27501561B01D99cde347a63891e8762DCa5bBbd", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "mmETH", "tokenAddress": "0x8a053350ca5F9352a16deD26ab333e2D251DAd7c" } @@ -3516,8 +5024,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Bridged mstETH", - "poolAddress": "0xf1f89d5127Ce97a3e839993CCC77781AA7DA90bA", - "poolType": "burnMint", + "pool": { + "address": "0xf1f89d5127Ce97a3e839993CCC77781AA7DA90bA", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "Bridged mstETH", "tokenAddress": "0xE367d4b1b9bB40e34aDCE448e1edb0141Fc6a8AC" }, @@ -3525,8 +5037,12 @@ "allowListEnabled": false, "decimals": 18, "name": "mstETH", - "poolAddress": "0x2E3c68D6d2eDD9881429f0565B88024B5Db10F73", - "poolType": "lockRelease", + "pool": { + "address": "0x2E3c68D6d2eDD9881429f0565B88024B5Db10F73", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "mstETH", "tokenAddress": "0x49446A0874197839D15395B908328a74ccc96Bc0" }, @@ -3534,8 +5050,12 @@ "allowListEnabled": false, "decimals": 18, "name": "mstETH", - "poolAddress": "0x7361B97025e2207178EDB9BA59c61BDA69E032fa", - "poolType": "burnMint", + "pool": { + "address": "0x7361B97025e2207178EDB9BA59c61BDA69E032fa", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "mstETH", "tokenAddress": "0x11d525Fb3f8CDfa58bE0d0FaB9339964Aeb89deb" } @@ -3545,8 +5065,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Bridged mswETH", - "poolAddress": "0x5D83430652F8B799F24Dae05B1B9916eB2D089b7", - "poolType": "burnMint", + "pool": { + "address": "0x5D83430652F8B799F24Dae05B1B9916eB2D089b7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "Bridged mswETH", "tokenAddress": "0xAbf9F7200D5337e50BF85748B7e780032BC5838e" }, @@ -3554,8 +5078,12 @@ "allowListEnabled": false, "decimals": 18, "name": "mswETH", - "poolAddress": "0xBDCc99f05D73FB3C2ad4b0F496318BaAE20218b7", - "poolType": "lockRelease", + "pool": { + "address": "0xBDCc99f05D73FB3C2ad4b0F496318BaAE20218b7", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "mswETH", "tokenAddress": "0x32bd822d615A3658A68b6fDD30c2fcb2C996D678" } @@ -3565,8 +5093,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Metaverse Index", - "poolAddress": "0xa970d6B0002CDfd4Ca12f0c4F13315dB612DDB5c", - "poolType": "burnMint", + "pool": { + "address": "0xa970d6B0002CDfd4Ca12f0c4F13315dB612DDB5c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "MVI", "tokenAddress": "0x0104a6FA30540DC1d9F45D2797F05eEa79304525" }, @@ -3574,8 +5106,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Metaverse Index", - "poolAddress": "0xA688993b1195aA6e64f4F835415c854a2C83BC21", - "poolType": "burnMint", + "pool": { + "address": "0xA688993b1195aA6e64f4F835415c854a2C83BC21", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "MVI", "tokenAddress": "0xEA8954dE7607b90F5ec81A5e2e673D0f60BB7596" }, @@ -3583,8 +5119,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Metaverse Index", - "poolAddress": "0x6A888F0f25d2e846ec854d6Fb011BeC6DE31480B", - "poolType": "lockRelease", + "pool": { + "address": "0x6A888F0f25d2e846ec854d6Fb011BeC6DE31480B", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "MVI", "tokenAddress": "0x72e364F2ABdC788b7E918bc238B21f109Cd634D7" } @@ -3594,8 +5134,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Bridged mwBETH", - "poolAddress": "0xF975EafE68839F326012f8AEc8759455B5e0050A", - "poolType": "burnMint", + "pool": { + "address": "0xF975EafE68839F326012f8AEc8759455B5e0050A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "Bridged mwBETH", "tokenAddress": "0x7dC91cBD6CB5A3E6A95EED713Aa6bF1d987146c8" }, @@ -3603,8 +5147,12 @@ "allowListEnabled": false, "decimals": 18, "name": "mwBETH", - "poolAddress": "0xa7689C57aa6D09d28244d3932F34176d853A660f", - "poolType": "lockRelease", + "pool": { + "address": "0xa7689C57aa6D09d28244d3932F34176d853A660f", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "mwBETH", "tokenAddress": "0xE46a5E19B19711332e33F33c2DB3eA143e86Bc10" } @@ -3614,8 +5162,12 @@ "allowListEnabled": false, "decimals": 18, "name": "MyStandard", - "poolAddress": "0xA4D5EF72fCFfa9eac0907856B1db1b68098fA23a", - "poolType": "burnMint", + "pool": { + "address": "0xA4D5EF72fCFfa9eac0907856B1db1b68098fA23a", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "MYST", "tokenAddress": "0x0256B279D973C8d687264AC3eB36bE09232D4474" }, @@ -3623,8 +5175,12 @@ "allowListEnabled": false, "decimals": 18, "name": "MyStandard", - "poolAddress": "0x717C753F9EA66eb763466cf3F8d299C634889B29", - "poolType": "burnMint", + "pool": { + "address": "0x717C753F9EA66eb763466cf3F8d299C634889B29", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "MYST", "tokenAddress": "0xA821aDaCCf08d856c0A36DC2C136B5188c525967" }, @@ -3632,8 +5188,12 @@ "allowListEnabled": false, "decimals": 18, "name": "MyStandard", - "poolAddress": "0xe1A8223DAc2aeC3090322674F054D35C240Dc37f", - "poolType": "burnMint", + "pool": { + "address": "0xe1A8223DAc2aeC3090322674F054D35C240Dc37f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "MYST", "tokenAddress": "0x3d5F61a4BB385B6D1eB34F47aA790A996f1Eba65" } @@ -3643,8 +5203,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Neiro", - "poolAddress": "0x8f43e6A0E48c860946bbDeea28F1eE710FdCf6d4", - "poolType": "burnMint", + "pool": { + "address": "0x8f43e6A0E48c860946bbDeea28F1eE710FdCf6d4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "NEIRO", "tokenAddress": "0x1d192a2f367DaF23540fFEAbF8dBe9B17803F00A" }, @@ -3652,8 +5216,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Neiro", - "poolAddress": "0x47158771e67e4bDdaFd0FBD36f26Db929420B26C", - "poolType": "lockRelease", + "pool": { + "address": "0x47158771e67e4bDdaFd0FBD36f26Db929420B26C", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "NEIRO", "tokenAddress": "0xEE2a03Aa6Dacf51C18679C516ad5283d8E7C2637" } @@ -3663,8 +5231,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Neko", - "poolAddress": "0x6a9A43871a8D468ACF6309f8459bC9623a0F169c", - "poolType": "burnMint", + "pool": { + "address": "0x6a9A43871a8D468ACF6309f8459bC9623a0F169c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "NEKO", "tokenAddress": "0xdb2aa3cDda310AE4e648E0FcE5cb6c19a37a9aD8" }, @@ -3672,8 +5244,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Neko", - "poolAddress": "0xDcE9cf770345584f2DFAA2eA23625cF3eDd6B7cF", - "poolType": "lockRelease", + "pool": { + "address": "0xDcE9cf770345584f2DFAA2eA23625cF3eDd6B7cF", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "NEKO", "tokenAddress": "0x63A67329f761517570345eE86f791F74f9DC5461" } @@ -3683,8 +5259,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Non-Playable Coin", - "poolAddress": "0xe185299D35f5f346ab0e42476B4172A0d020Aad9", - "poolType": "burnMint", + "pool": { + "address": "0xe185299D35f5f346ab0e42476B4172A0d020Aad9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "NPC", "tokenAddress": "0x765DaF34f09CFb86A7d172e016513B6c6355b13d" }, @@ -3692,8 +5272,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Non-Playable Coin", - "poolAddress": "0xF4208675b84E678d0d01528fA97634e2B0873Fa6", - "poolType": "lockRelease", + "pool": { + "address": "0xF4208675b84E678d0d01528fA97634e2B0873Fa6", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "NPC", "tokenAddress": "0x8eD97a637A790Be1feff5e888d43629dc05408F6" } @@ -3703,8 +5287,12 @@ "allowListEnabled": false, "decimals": 18, "name": "NUON", - "poolAddress": "0x7a1d89A602c98936b5b484c2DB42ec77E1E5743C", - "poolType": "lockRelease", + "pool": { + "address": "0x7a1d89A602c98936b5b484c2DB42ec77E1E5743C", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "NUON", "tokenAddress": "0xfb9Fed8cB962548A11fE7F6F282949061395c7F5" }, @@ -3712,8 +5300,12 @@ "allowListEnabled": false, "decimals": 18, "name": "NUON", - "poolAddress": "0xeE9Ea9B65475EE7693e0Ec9B9c308cA2d536e7ea", - "poolType": "burnMint", + "pool": { + "address": "0xeE9Ea9B65475EE7693e0Ec9B9c308cA2d536e7ea", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "NUON", "tokenAddress": "0xCA160D11087E03fd398d40f561cd4768825f4958" }, @@ -3721,8 +5313,12 @@ "allowListEnabled": false, "decimals": 18, "name": "NUON", - "poolAddress": "0xc1D8f275f651E1CAe3A6D971d0836cDAcD25d91a", - "poolType": "burnMint", + "pool": { + "address": "0xc1D8f275f651E1CAe3A6D971d0836cDAcD25d91a", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "NUON", "tokenAddress": "0xCA160D11087E03fd398d40f561cd4768825f4958" } @@ -3732,8 +5328,12 @@ "allowListEnabled": false, "decimals": 18, "name": "NXPC", - "poolAddress": "0x0D9A14a6eD561770295BcCCF1995ae5B026a65d6", - "poolType": "lockRelease", + "pool": { + "address": "0x0D9A14a6eD561770295BcCCF1995ae5B026a65d6", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "NXPC", "tokenAddress": "0x5E0E90E268BC247Cc850c789A0DB0d5c7621fb59" }, @@ -3741,8 +5341,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Nexpace", - "poolAddress": "0xEB8a99EDdFA50375E58033c187A4b65EC3c6B40C", - "poolType": "burnMint", + "pool": { + "address": "0xEB8a99EDdFA50375E58033c187A4b65EC3c6B40C", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "NXPC", "tokenAddress": "0x9f2c4FD0a0BFF91723089775C73394E72c0fC116" }, @@ -3750,8 +5354,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Nexpace", - "poolAddress": "0x6f9234e7ffdC4Fda751f13269a6584582B9F3C8d", - "poolType": "burnMint", + "pool": { + "address": "0x6f9234e7ffdC4Fda751f13269a6584582B9F3C8d", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "NXPC", "tokenAddress": "0x1B601A055711FeE5Ea965bC2AE341e2e4a79D622" } @@ -3761,8 +5369,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Olympus", - "poolAddress": "0xa5588e518CE5ee0e4628C005E4edAbD5e87de3aD", - "poolType": "lockRelease", + "pool": { + "address": "0xa5588e518CE5ee0e4628C005E4edAbD5e87de3aD", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "OHM", "tokenAddress": "0x64aa3364F17a4D01c6f1751Fd97C2BD3D7e7f1D5" }, @@ -3770,8 +5382,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Olympus", - "poolAddress": "4N7bZnVSC1GE27vo2Bv6kG983brwhT68BGsLuzH5nTQp", - "poolType": "burnMint", + "pool": { + "address": "4N7bZnVSC1GE27vo2Bv6kG983brwhT68BGsLuzH5nTQp", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "OHM", "tokenAddress": "2Xva1NeLRuBFdK41gEuXqgeWtnKKDve9PKeCnMEpNG6K" } @@ -3781,8 +5397,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Orange", - "poolAddress": "0x42DFf772b40Eeb42B4DdEd4BB7Fe8ad9212821De", - "poolType": "lockRelease", + "pool": { + "address": "0x42DFf772b40Eeb42B4DdEd4BB7Fe8ad9212821De", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "ORNG", "tokenAddress": "0x6c14c1898C843FF66cA51e87244690bBc28DF215" }, @@ -3790,8 +5410,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Orange", - "poolAddress": "0x5aDc61883D1aEEfF77DF019A119b8528741fed1e", - "poolType": "burnMint", + "pool": { + "address": "0x5aDc61883D1aEEfF77DF019A119b8528741fed1e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "ORNG", "tokenAddress": "0xA588041eA7285e8ab47cfBCC8871Ab338f672147" } @@ -3801,8 +5425,12 @@ "allowListEnabled": false, "decimals": 18, "name": "OSIS Token", - "poolAddress": "0x475c8Fb7F7D4d3bba0b0a4da2bE31328fc36E358", - "poolType": "burnMint", + "pool": { + "address": "0x475c8Fb7F7D4d3bba0b0a4da2bE31328fc36E358", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "OSIS", "tokenAddress": "0x45fcf0Ebb7d79E3de9Fc308b6c7cb680A981CB7a" }, @@ -3810,8 +5438,12 @@ "allowListEnabled": false, "decimals": 18, "name": "OSIS", - "poolAddress": "0xCCb9Ce82667b8ca0178E281340F469787096Ba14", - "poolType": "lockRelease", + "pool": { + "address": "0xCCb9Ce82667b8ca0178E281340F469787096Ba14", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "OSIS", "tokenAddress": "0x3e5351935595600D8e094dEE3Ec7E942CAf9907F" } @@ -3821,8 +5453,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Overtime DAO Token", - "poolAddress": "0xccEDD35627336F20b86a96D81EB88A75908D67e9", - "poolType": "burnMint", + "pool": { + "address": "0xccEDD35627336F20b86a96D81EB88A75908D67e9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "OVER", "tokenAddress": "0x5829D6FE7528bc8E92c4e81CC8F20a528820B51a" }, @@ -3830,8 +5466,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Overtime DAO Token", - "poolAddress": "0xAd897dd53328D86282A3A822C15201d669201AA8", - "poolType": "burnMint", + "pool": { + "address": "0xAd897dd53328D86282A3A822C15201d669201AA8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "OVER", "tokenAddress": "0x7750C092e284e2c7366f50C8306F43c7EB2e82a2" }, @@ -3839,8 +5479,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Overtime DAO Token", - "poolAddress": "0x5c5E86ABC6cfE3772dc2aAe4FAffEEFd641fd460", - "poolType": "burnMint", + "pool": { + "address": "0x5c5E86ABC6cfE3772dc2aAe4FAffEEFd641fd460", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "OVER", "tokenAddress": "0xedF38688b27036816A50185cAA430D5479e1C63e" }, @@ -3848,8 +5492,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Overtime DAO Token", - "poolAddress": "0x9054f2DF5f2AC59b39a175c27a00165989D17d2B", - "poolType": "lockRelease", + "pool": { + "address": "0x9054f2DF5f2AC59b39a175c27a00165989D17d2B", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "OVER", "tokenAddress": "0x90cE5720c17587D28E4Af120ae2d313B3BAD1722" } @@ -3859,8 +5507,12 @@ "allowListEnabled": false, "decimals": 6, "name": "OpenXAUT", - "poolAddress": "0x18e25Ac83477d7013D43174508B7AE7EC2CE2e08", - "poolType": "burnMint", + "pool": { + "address": "0x18e25Ac83477d7013D43174508B7AE7EC2CE2e08", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "oXAUT", "tokenAddress": "0x30974f73A4ac9E606Ed80da928e454977ac486D2" }, @@ -3868,8 +5520,12 @@ "allowListEnabled": false, "decimals": 6, "name": "OpenXAUT", - "poolAddress": "0xaF35bef911A5e0be90987cE5070d7c9CbF5cFd3c", - "poolType": "burnMint", + "pool": { + "address": "0xaF35bef911A5e0be90987cE5070d7c9CbF5cFd3c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "oXAUT", "tokenAddress": "0x30974f73A4ac9E606Ed80da928e454977ac486D2" }, @@ -3877,8 +5533,12 @@ "allowListEnabled": false, "decimals": 6, "name": "OpenXAUT", - "poolAddress": "0xF8AE5209DE22dbd06Dace938934b0D75B5E80299", - "poolType": "burnMint", + "pool": { + "address": "0xF8AE5209DE22dbd06Dace938934b0D75B5E80299", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "oXAUT", "tokenAddress": "0x30974f73A4ac9E606Ed80da928e454977ac486D2" }, @@ -3886,8 +5546,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Tether Gold", - "poolAddress": "0x04db9b1D7f52cB288b95B4934a1fA688F6d0cBc3", - "poolType": "burnMint", + "pool": { + "address": "0x04db9b1D7f52cB288b95B4934a1fA688F6d0cBc3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "XAUt", "tokenAddress": "0x68749665FF8D2d112Fa859AA293F07A622782F38" } @@ -3897,7 +5561,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Pegged Bitcoin", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "pBTC", "tokenAddress": "0x0D2437F93Fed6EA64Ef01cCde385FB1263910C56" } @@ -3907,8 +5575,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Pepe", - "poolAddress": "0xe48D935e6C9e735463ccCf29a7F11e32bC09136E", - "poolType": "lockRelease", + "pool": { + "address": "0xe48D935e6C9e735463ccCf29a7F11e32bC09136E", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "PEPE", "tokenAddress": "0x6982508145454Ce325dDbE47a25d4ec3d2311933" }, @@ -3916,8 +5588,12 @@ "allowListEnabled": false, "decimals": 4, "name": "Pepe", - "poolAddress": "4gqQkUyXrfUuRbviWNPeSWUhqko9Q7KX6axMjE3g9Ma3", - "poolType": "burnMint", + "pool": { + "address": "4gqQkUyXrfUuRbviWNPeSWUhqko9Q7KX6axMjE3g9Ma3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "PEPE", "tokenAddress": "8NPXRWxUD7xKcexDpK1aC5MTckRykvGya8rzgK8cbQcX" } @@ -3927,8 +5603,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Puffverse Token", - "poolAddress": "0x337Dec2C7D98CdC0f59976F3A48aCd706cC6c495", - "poolType": "burnMint", + "pool": { + "address": "0x337Dec2C7D98CdC0f59976F3A48aCd706cC6c495", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "PFVS", "tokenAddress": "0x3157874A7508FCF972379D24590C6806522B784F" }, @@ -3936,8 +5616,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Puffverse Token", - "poolAddress": "0x50Dbf7140A444DB0ACFb6d1bcc12408C6485Fe27", - "poolType": "lockRelease", + "pool": { + "address": "0x50Dbf7140A444DB0ACFb6d1bcc12408C6485Fe27", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "PFVS", "tokenAddress": "0xb4562fDEFD5eD58f7705CE9386D54EE9B53831d1" } @@ -3947,8 +5631,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Pippin", - "poolAddress": "0x5Efb8F091d49ce1e138353c75d4AAd07a98D79A5", - "poolType": "burnMint", + "pool": { + "address": "0x5Efb8F091d49ce1e138353c75d4AAd07a98D79A5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "pippin", "tokenAddress": "0x3945Eaaf908d6c743090D4ca1748c057d8A5634a" }, @@ -3956,8 +5644,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Pippin", - "poolAddress": "GFZDNxdQFFoPok1ZX1uwzbbfFNB46kJGNnAa1rd7LUVF", - "poolType": "lockRelease", + "pool": { + "address": "GFZDNxdQFFoPok1ZX1uwzbbfFNB46kJGNnAa1rd7LUVF", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "pippin", "tokenAddress": "Dfh5DzRgSvvCFDoYc2ciTkMrbDfRKybA4SoFbPmApump" } @@ -3967,8 +5659,12 @@ "allowListEnabled": false, "decimals": 18, "name": "PIXEL", - "poolAddress": "0xe26D9c68cF6d284367C5e90EC834C6Ec0051f73C", - "poolType": "lockRelease", + "pool": { + "address": "0xe26D9c68cF6d284367C5e90EC834C6Ec0051f73C", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "PIXEL", "tokenAddress": "0x3429d03c6F7521AeC737a0BBF2E5ddcef2C3Ae31" }, @@ -3976,8 +5672,12 @@ "allowListEnabled": false, "decimals": 18, "name": "PIXEL", - "poolAddress": "0xd7CE1E7262ce471CC3Db3Bcd8c3EdeEe6d114115", - "poolType": "burnMint", + "pool": { + "address": "0xd7CE1E7262ce471CC3Db3Bcd8c3EdeEe6d114115", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "PIXEL", "tokenAddress": "0x7EAe20d11Ef8c779433Eb24503dEf900b9d28ad7" } @@ -3987,8 +5687,12 @@ "allowListEnabled": false, "decimals": 18, "name": "PT Ethena sUSDE 5FEB2026", - "poolAddress": "0x04790065826123136eB50d9dF1276f98376a6e91", - "poolType": "lockRelease", + "pool": { + "address": "0x04790065826123136eB50d9dF1276f98376a6e91", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "PT-sUSDE-5FEB2026", "tokenAddress": "0xE8483517077afa11A9B07f849cee2552f040d7b2" }, @@ -3996,8 +5700,12 @@ "allowListEnabled": false, "decimals": 9, "name": "ETH PT sUSDe (USDe) 2026Feb", - "poolAddress": "R78LZoZJCfG5dTxPT9bAc6DCgvYQ32Gp8hVrkbjGiF1", - "poolType": "burnMint", + "pool": { + "address": "R78LZoZJCfG5dTxPT9bAc6DCgvYQ32Gp8hVrkbjGiF1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "PTsUSDE", "tokenAddress": "PTSg1sXMujX5bgTM88C2PMksHG5w2bqvXJrG9uUdzpA" } @@ -4007,8 +5715,12 @@ "allowListEnabled": false, "decimals": 18, "name": "pufETH", - "poolAddress": "0x8dA0baE597aC15fB0924713b1e3c1F624474F3E4", - "poolType": "burnMint", + "pool": { + "address": "0x8dA0baE597aC15fB0924713b1e3c1F624474F3E4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "pufETH", "tokenAddress": "0x417b0Ff8358Eb72867Da92225CaB99BCD5e6F205" }, @@ -4016,8 +5728,12 @@ "allowListEnabled": false, "decimals": 18, "name": "pufETH", - "poolAddress": "0x87d00066cf131ff54B72B134a217D5401E5392b6", - "poolType": "burnMint", + "pool": { + "address": "0x87d00066cf131ff54B72B134a217D5401E5392b6", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "pufETH", "tokenAddress": "0x37D6382B6889cCeF8d6871A8b60E667115eDDBcF" }, @@ -4025,8 +5741,12 @@ "allowListEnabled": false, "decimals": 18, "name": "pufETH", - "poolAddress": "0xBc1324F4FaB8e63bF33E5117bb887671B378BFF3", - "poolType": "lockRelease", + "pool": { + "address": "0xBc1324F4FaB8e63bF33E5117bb887671B378BFF3", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "pufETH", "tokenAddress": "0xD9A442856C234a39a81a089C06451EBAa4306a72" }, @@ -4034,8 +5754,12 @@ "allowListEnabled": false, "decimals": 18, "name": "pufETH", - "poolAddress": "0xF9Dd335bF363b2E4ecFe3c94A86EBD7Dd3Dcf0e7", - "poolType": "burnMint", + "pool": { + "address": "0xF9Dd335bF363b2E4ecFe3c94A86EBD7Dd3Dcf0e7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "pufETH", "tokenAddress": "0x6c460b2c6D6719562D5dA43E5152B375e79B9A8B" } @@ -4045,8 +5769,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Radpie", - "poolAddress": "0x879d0803Dc3fB6b435E6407F4b74101bB8f742C8", - "poolType": "burnMint", + "pool": { + "address": "0x879d0803Dc3fB6b435E6407F4b74101bB8f742C8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "RDP", "tokenAddress": "0x27c073e8427aa493a90b8dC8b73A89e670FD77bB" }, @@ -4054,8 +5782,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Radpie", - "poolAddress": "0x3be3266713DeBDeb1CdC420a88f1E9EefB7982e2", - "poolType": "burnMint", + "pool": { + "address": "0x3be3266713DeBDeb1CdC420a88f1E9EefB7982e2", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "RDP", "tokenAddress": "0x54BDBF3cE36f451Ec61493236b8E6213ac87c0f6" } @@ -4065,8 +5797,12 @@ "allowListEnabled": false, "decimals": 18, "name": "RealToken Ecosystem Governance", - "poolAddress": "0x307D0353313F544fc8Da0D85F1005b1de516Bce8", - "poolType": "burnMint", + "pool": { + "address": "0x307D0353313F544fc8Da0D85F1005b1de516Bce8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "REG", "tokenAddress": "0x0AA1e96D2a46Ec6beB2923dE1E61Addf5F5f1dce" }, @@ -4074,8 +5810,12 @@ "allowListEnabled": false, "decimals": 18, "name": "RealToken Ecosystem Governance", - "poolAddress": "0xe61d70B29F6a83A50Acff39e8b8AC6B27F6e6ddA", - "poolType": "burnMint", + "pool": { + "address": "0xe61d70B29F6a83A50Acff39e8b8AC6B27F6e6ddA", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "REG", "tokenAddress": "0x0AA1e96D2a46Ec6beB2923dE1E61Addf5F5f1dce" }, @@ -4083,8 +5823,12 @@ "allowListEnabled": false, "decimals": 18, "name": "RealToken Ecosystem Governance", - "poolAddress": "0x8058d5d465C8CA6BA76De043A7637F8Df74a0989", - "poolType": "burnMint", + "pool": { + "address": "0x8058d5d465C8CA6BA76De043A7637F8Df74a0989", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "REG", "tokenAddress": "0x0AA1e96D2a46Ec6beB2923dE1E61Addf5F5f1dce" } @@ -4094,8 +5838,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Rocket Pool ETH", - "poolAddress": "0x3A2Ea8BaE01410425d01c2C5f488e4777DAA54Df", - "poolType": "lockRelease", + "pool": { + "address": "0x3A2Ea8BaE01410425d01c2C5f488e4777DAA54Df", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "rETH", "tokenAddress": "0xae78736Cd615f374D3085123A210448E74Fc6393" }, @@ -4103,8 +5851,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Rocket Pool ETH", - "poolAddress": "0xABC0F3b9455E308C27C2a6fe0EF82A596c95709F", - "poolType": "burnMint", + "pool": { + "address": "0xABC0F3b9455E308C27C2a6fe0EF82A596c95709F", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "rETH", "tokenAddress": "0xC61a178d9742775f3B741fE60F12659D853c66A1" }, @@ -4112,8 +5864,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Rocket Pool ETH", - "poolAddress": "0xCd4Ee1110707D79704d6881A4fEf158e5FdB334b", - "poolType": "burnMint", + "pool": { + "address": "0xCd4Ee1110707D79704d6881A4fEf158e5FdB334b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "RETH", "tokenAddress": "0x29c46e6F2A67872Ad6b1Dc04e1591934a96Af62E" }, @@ -4121,8 +5877,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Rocket Pool ETH", - "poolAddress": "0xbf22058C8cd5a9fd426aa5176424d41027F14545", - "poolType": "burnMint", + "pool": { + "address": "0xbf22058C8cd5a9fd426aa5176424d41027F14545", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "rETH", "tokenAddress": "0x6e5e9b22E461c2F9786e6d8069d47adA1Ef58aDc" } @@ -4132,8 +5892,12 @@ "allowListEnabled": false, "decimals": 18, "name": "RIZE", - "poolAddress": "0xf234609b2e2704b48745A819C89774Fe21E4a722", - "poolType": "burnMint", + "pool": { + "address": "0xf234609b2e2704b48745A819C89774Fe21E4a722", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "RIZE", "tokenAddress": "0xAEDAff046601BEb063b647845Dfb21841f32d6A4" }, @@ -4141,8 +5905,12 @@ "allowListEnabled": false, "decimals": 18, "name": "RIZE", - "poolAddress": "0xd4D129Df31bF9d9eF7fF030aDF984f3d028E16a0", - "poolType": "burnMint", + "pool": { + "address": "0xd4D129Df31bF9d9eF7fF030aDF984f3d028E16a0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "RIZE", "tokenAddress": "0x9818B6c09f5ECc843060927E8587c427C7C93583" }, @@ -4150,8 +5918,12 @@ "allowListEnabled": false, "decimals": 18, "name": "RIZE", - "poolAddress": "0x17Be5d735D49c84919d3cFDfF9eABbdB12D6Ac20", - "poolType": "burnMint", + "pool": { + "address": "0x17Be5d735D49c84919d3cFDfF9eABbdB12D6Ac20", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "RIZE", "tokenAddress": "0x9F1E8F87c6321b84baD7DDa7DfB86D5115A47605" }, @@ -4159,8 +5931,12 @@ "allowListEnabled": false, "decimals": 18, "name": "RIZE", - "poolAddress": "0xAEDAff046601BEb063b647845Dfb21841f32d6A4", - "poolType": "burnMint", + "pool": { + "address": "0xAEDAff046601BEb063b647845Dfb21841f32d6A4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "RIZE", "tokenAddress": "0x9F1E8F87c6321b84baD7DDa7DfB86D5115A47605" } @@ -4170,8 +5946,12 @@ "allowListEnabled": false, "decimals": 18, "name": "rsETH", - "poolAddress": "0x72a7ffbd763c369d5A86eEe886ABb99BdA613f8A", - "poolType": "burnMint", + "pool": { + "address": "0x72a7ffbd763c369d5A86eEe886ABb99BdA613f8A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "rsETH", "tokenAddress": "0xb999Ea589E0a1Cce9153601daC2D6e203c2fD577" }, @@ -4179,8 +5959,12 @@ "allowListEnabled": false, "decimals": 18, "name": "rsETH", - "poolAddress": "0xc28A1F91e6D0eCf6cBFe6809D256a7753fae52B5", - "poolType": "burnMint", + "pool": { + "address": "0xc28A1F91e6D0eCf6cBFe6809D256a7753fae52B5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "rsETH", "tokenAddress": "0x043849686EE254ada46A432770E1a491491FC44D" }, @@ -4188,8 +5972,12 @@ "allowListEnabled": false, "decimals": 18, "name": "rsETH", - "poolAddress": "0x5bdB8499D400Fb19afc665D1CE0C5459bB3401Eb", - "poolType": "burnMint", + "pool": { + "address": "0x5bdB8499D400Fb19afc665D1CE0C5459bB3401Eb", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "rsETH", "tokenAddress": "0x571405D597091e8728d8240F558BAc01275E8659" }, @@ -4197,8 +5985,12 @@ "allowListEnabled": false, "decimals": 18, "name": "rsETH", - "poolAddress": "0x55e5a21B4cCC7FA502434ab1109D4EDe0397AB25", - "poolType": "lockRelease", + "pool": { + "address": "0x55e5a21B4cCC7FA502434ab1109D4EDe0397AB25", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "rsETH", "tokenAddress": "0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7" } @@ -4208,8 +6000,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ShibArmyStrong", - "poolAddress": "0xd13129ee86f6285d51F66196A02a929E2be977a4", - "poolType": "burnMint", + "pool": { + "address": "0xd13129ee86f6285d51F66196A02a929E2be977a4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SAS", "tokenAddress": "0x28BE7E8cD8125CB7A74D2002A5862E1bfd774cd9" }, @@ -4217,8 +6013,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ShibArmyStrong", - "poolAddress": "0xd13129ee86f6285d51F66196A02a929E2be977a4", - "poolType": "burnMint", + "pool": { + "address": "0xd13129ee86f6285d51F66196A02a929E2be977a4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SAS", "tokenAddress": "0x28BE7E8cD8125CB7A74D2002A5862E1bfd774cd9" }, @@ -4226,8 +6026,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ShibArmyStrong", - "poolAddress": "0x89F39cdbad48b6531DDBd38ea0D84E9c9CbCdA27", - "poolType": "lockRelease", + "pool": { + "address": "0x89F39cdbad48b6531DDBd38ea0D84E9c9CbCdA27", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "SAS", "tokenAddress": "0x28BE7E8cD8125CB7A74D2002A5862E1bfd774cd9" }, @@ -4235,8 +6039,12 @@ "allowListEnabled": false, "decimals": 18, "name": "ShibArmyStrong", - "poolAddress": "0xab8B05d4d7d31b28d9973C5CD2965b9e48a2a35d", - "poolType": "burnMint", + "pool": { + "address": "0xab8B05d4d7d31b28d9973C5CD2965b9e48a2a35d", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SAS", "tokenAddress": "0x7E315C269F7849F80824755A666DC6fb4Ba8BEe1" } @@ -4246,8 +6054,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avBTC", - "poolAddress": "0x9E3021Cedd853C63cBa44e8a351ea807fd116e7C", - "poolType": "lockRelease", + "pool": { + "address": "0x9E3021Cedd853C63cBa44e8a351ea807fd116e7C", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "savBTC", "tokenAddress": "0x649342c6bff544d82DF1B2bA3C93e0C22cDeBa84" }, @@ -4255,8 +6067,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avBTC", - "poolAddress": "0x79A42a8dC09F3501DC265e65139912aE20c5BCeb", - "poolType": "burnMint", + "pool": { + "address": "0x79A42a8dC09F3501DC265e65139912aE20c5BCeb", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "savBTC", "tokenAddress": "0x19452d507b2738aDB8942cD2b0d52BB519f1790a" }, @@ -4264,8 +6080,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avBTC", - "poolAddress": "0x5b0B44bB38E23193111e7AA03E380Ba841e58B17", - "poolType": "burnMint", + "pool": { + "address": "0x5b0B44bB38E23193111e7AA03E380Ba841e58B17", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "savBTC", "tokenAddress": "0x45cF31aF4d67899674B50ab14093b55006fFf563" }, @@ -4273,8 +6093,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avBTC", - "poolAddress": "0x78991cd8ADDf98672A1201D70c6db46e21C25C57", - "poolType": "burnMint", + "pool": { + "address": "0x78991cd8ADDf98672A1201D70c6db46e21C25C57", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "savBTC", "tokenAddress": "0x92181c6f0FED1f1A30c0Ec131f41577F81924bf5" } @@ -4284,8 +6108,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avETH", - "poolAddress": "0xd039ac36B5082ee285471968b88f468e42E27Fa0", - "poolType": "burnMint", + "pool": { + "address": "0xd039ac36B5082ee285471968b88f468e42E27Fa0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "savETH", "tokenAddress": "0x260c0c715A279F239cF44e2F73E964AB550738f3" }, @@ -4293,8 +6121,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avETH", - "poolAddress": "0x10CBdedfD636C777977d621D344791A288528fF0", - "poolType": "burnMint", + "pool": { + "address": "0x10CBdedfD636C777977d621D344791A288528fF0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "savETH", "tokenAddress": "0xA0Fbf835fd24bD1aAFD39a0D4b1779B5B8329770" }, @@ -4302,8 +6134,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avETH", - "poolAddress": "0x43f47a434DADd5A122C42E49378365CcA949fA54", - "poolType": "lockRelease", + "pool": { + "address": "0x43f47a434DADd5A122C42E49378365CcA949fA54", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "savETH", "tokenAddress": "0xDA06eE2dACF9245Aa80072a4407deBDea0D7e341" } @@ -4313,8 +6149,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avUSD", - "poolAddress": "0x8FcC42c414E29e8e3dBFa1628CF45E8ed80C999D", - "poolType": "lockRelease", + "pool": { + "address": "0x8FcC42c414E29e8e3dBFa1628CF45E8ed80C999D", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "savUSD", "tokenAddress": "0x06d47F3fb376649c3A9Dafe069B3D6E35572219E" }, @@ -4322,8 +6162,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avUSD", - "poolAddress": "0x8e4eC56B2E74bD48557F327Ea35F6f08b7E8a4bd", - "poolType": "burnMint", + "pool": { + "address": "0x8e4eC56B2E74bD48557F327Ea35F6f08b7E8a4bd", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "savUSD", "tokenAddress": "0x14063733875204b35D20D5Fc52C7B5569aD00335" }, @@ -4331,8 +6175,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avUSD", - "poolAddress": "0xDd10449dEAF27fc4937DDA64d0b5Af819b79EE63", - "poolType": "burnMint", + "pool": { + "address": "0xDd10449dEAF27fc4937DDA64d0b5Af819b79EE63", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "savUSD", "tokenAddress": "0x5C247948fD58Bb02B6c4678d9940F5e6B9af1127" }, @@ -4340,8 +6188,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avUSD", - "poolAddress": "0x6d3B65eB14ad3546ab4Aa32cf8645a3610a9737b", - "poolType": "burnMint", + "pool": { + "address": "0x6d3B65eB14ad3546ab4Aa32cf8645a3610a9737b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "savUSD", "tokenAddress": "0xb8D89678E75a973E74698c976716308abB8a46A4" }, @@ -4349,8 +6201,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avUSD", - "poolAddress": "0xFCCfA86d9AEdD2fF8dF60600110d6D1649679Fef", - "poolType": "burnMint", + "pool": { + "address": "0xFCCfA86d9AEdD2fF8dF60600110d6D1649679Fef", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "savUSD", "tokenAddress": "0xA29420057F3e3B9512D4786df135Da1674BD74D4" }, @@ -4358,8 +6214,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked avUSD", - "poolAddress": "0x8d2145dB5Da67B262aEb451D16b07B1a958124eC", - "poolType": "burnMint", + "pool": { + "address": "0x8d2145dB5Da67B262aEb451D16b07B1a958124eC", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "savUSD", "tokenAddress": "0xb9827268eBCc4EA7b105cfC787A92c612629A3f1" } @@ -4369,8 +6229,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stader", - "poolAddress": "0x1AEfE4c18198C5838e22951C9382cD3080052407", - "poolType": "burnMint", + "pool": { + "address": "0x1AEfE4c18198C5838e22951C9382cD3080052407", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SD", "tokenAddress": "0x9445F4081AFC7Fa66b53224DCb84aC6e6A1714A2" }, @@ -4378,8 +6242,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stader", - "poolAddress": "0x98BBA66d65Dd48bAD447b73db8181930c02c794D", - "poolType": "burnMint", + "pool": { + "address": "0x98BBA66d65Dd48bAD447b73db8181930c02c794D", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SD", "tokenAddress": "0x32E94BB4A3521EBEBE14AE3Aa5Bc09fCc9E42306" }, @@ -4387,8 +6255,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stader", - "poolAddress": "0x61D405818C8127f0fD30102BF01E6227097eF92f", - "poolType": "lockRelease", + "pool": { + "address": "0x61D405818C8127f0fD30102BF01E6227097eF92f", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "SD", "tokenAddress": "0x30D20208d987713f46DFD34EF128Bb16C404D10f" } @@ -4398,8 +6270,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Mode Savings Dai", - "poolAddress": "0x0e3229079543F047a394833063702E71F733F6a5", - "poolType": "burnMint", + "pool": { + "address": "0x0e3229079543F047a394833063702E71F733F6a5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "msDAI", "tokenAddress": "0x3f51c6c5927B88CDEc4b61e2787F9BD0f5249138" }, @@ -4407,8 +6283,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Savings Dai", - "poolAddress": "0xF6c88f0933126c2e2CDb060910165aA4BfC11B99", - "poolType": "lockRelease", + "pool": { + "address": "0xF6c88f0933126c2e2CDb060910165aA4BfC11B99", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "sDAI", "tokenAddress": "0x83F20F44975D03b1b09e64809B757c47f942BEeA" } @@ -4418,8 +6298,12 @@ "allowListEnabled": false, "decimals": 18, "name": "stake.link", - "poolAddress": "0xC31A8B3Ba209FC60c3E9364649ED452939403E27", - "poolType": "burnMint", + "pool": { + "address": "0xC31A8B3Ba209FC60c3E9364649ED452939403E27", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SDL", "tokenAddress": "0xd7cf0e0fC12fB97e03841CE4f3086dB327CE0F2B" }, @@ -4427,8 +6311,12 @@ "allowListEnabled": false, "decimals": 18, "name": "stake.link", - "poolAddress": "0xb473be8A2b4778C418451C18F4357261D626f91C", - "poolType": "burnMint", + "pool": { + "address": "0xb473be8A2b4778C418451C18F4357261D626f91C", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SDL", "tokenAddress": "0xdFeA35757264F5b6C0ff21104151D9F991D0eEC0" }, @@ -4436,8 +6324,12 @@ "allowListEnabled": false, "decimals": 18, "name": "stake.link", - "poolAddress": "0xAFcC997D86713FeC802Cc665122d64a5130bDd1D", - "poolType": "lockRelease", + "pool": { + "address": "0xAFcC997D86713FeC802Cc665122d64a5130bDd1D", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "SDL", "tokenAddress": "0xA95C5ebB86E0dE73B4fB8c47A45B792CFeA28C23" } @@ -4447,8 +6339,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Diamondz Shadow Game + Movies", - "poolAddress": "0x97831d9E9896B941d1047ECE33031C1eF19fB9A5", - "poolType": "burnMint", + "pool": { + "address": "0x97831d9E9896B941d1047ECE33031C1eF19fB9A5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SDM", "tokenAddress": "0x602b869eEf1C9F0487F31776bad8Af3C4A173394" }, @@ -4456,8 +6352,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Diamondz Shadow Game + Movies", - "poolAddress": "0xBC3cc3F1122a664dc3C650C0A8138Ca2731b9431", - "poolType": "burnMint", + "pool": { + "address": "0xBC3cc3F1122a664dc3C650C0A8138Ca2731b9431", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SDM", "tokenAddress": "0xDd5C53Fa95741B3B896BaC689bd460C29a4F7034" } @@ -4467,8 +6367,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked DOLA", - "poolAddress": "0x8Bbd036d018657E454F679E7C4726F7a8ECE2773", - "poolType": "burnMint", + "pool": { + "address": "0x8Bbd036d018657E454F679E7C4726F7a8ECE2773", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "sDOLA", "tokenAddress": "0x02eaa69646183c069FC2B64F15923F27B9CF3b03" }, @@ -4476,8 +6380,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked DOLA", - "poolAddress": "0xbbc28DB61DF26B76D5F7D5Eed17eD4D6C278460e", - "poolType": "burnMint", + "pool": { + "address": "0xbbc28DB61DF26B76D5F7D5Eed17eD4D6C278460e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "sDOLA", "tokenAddress": "0x7a1e123e41458aabaB8068BFed6010D8f9480898" }, @@ -4485,8 +6393,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked DOLA", - "poolAddress": "0xd84e1B7e1a7A8D49167884855c3985ef4bCa45aB", - "poolType": "burnMint", + "pool": { + "address": "0xd84e1B7e1a7A8D49167884855c3985ef4bCa45aB", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "sDOLA", "tokenAddress": "0xCa78ee4544ec5a33Af86F1E786EfC7d3652bf005" }, @@ -4494,8 +6406,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked DOLA", - "poolAddress": "0x8404024d8F74Ad2D20E82c184816B64D4184A018", - "poolType": "burnMint", + "pool": { + "address": "0x8404024d8F74Ad2D20E82c184816B64D4184A018", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "sDOLA", "tokenAddress": "0xfc63C9c8Ba44AE89C01265453Ed4F427C80cBd4E" }, @@ -4503,8 +6419,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked Dola", - "poolAddress": "0x05eEe76f456C51Be0459EC1c0a78bf177B2c877C", - "poolType": "lockRelease", + "pool": { + "address": "0x05eEe76f456C51Be0459EC1c0a78bf177B2c877C", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "sDOLA", "tokenAddress": "0xb45ad160634c528Cc3D2926d9807104FA3157305" } @@ -4514,8 +6434,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stake DAO Token", - "poolAddress": "0xB1133f3A7bC0392948f4Bb43947b9BB662fB8E20", - "poolType": "burnMint", + "pool": { + "address": "0xB1133f3A7bC0392948f4Bb43947b9BB662fB8E20", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SDT", "tokenAddress": "0x07715EE7219B07b8e01CC7d2787f4e5e75860383" }, @@ -4523,8 +6447,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stake DAO Token", - "poolAddress": "0x4AFdDee00D68ebA82B882db98015bfD816818093", - "poolType": "burnMint", + "pool": { + "address": "0x4AFdDee00D68ebA82B882db98015bfD816818093", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SDT", "tokenAddress": "0x07715EE7219B07b8e01CC7d2787f4e5e75860383" }, @@ -4532,8 +6460,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stake DAO Token", - "poolAddress": "0x89c9038906887A69bD9C20f81B1B4C309F9A6D04", - "poolType": "lockRelease", + "pool": { + "address": "0x89c9038906887A69bD9C20f81B1B4C309F9A6D04", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "SDT", "tokenAddress": "0x73968b9a57c6E53d41345FD57a6E6ae27d6CDB2F" } @@ -4543,8 +6475,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Steadefi", - "poolAddress": "0x2910769511bA734895B127b9564A2b56cd7a4B02", - "poolType": "burnMint", + "pool": { + "address": "0x2910769511bA734895B127b9564A2b56cd7a4B02", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SDY", "tokenAddress": "0x338c6d2DF4dB2459EAB0835fd9004Cf2915842e0" }, @@ -4552,8 +6488,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Steadefi", - "poolAddress": "0x53606d47E92e390B2B4B105e92bAC238CC77F28c", - "poolType": "burnMint", + "pool": { + "address": "0x53606d47E92e390B2B4B105e92bAC238CC77F28c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SDY", "tokenAddress": "0x7d262214f368A896Af42E36F20a97E2d83df701b" }, @@ -4561,8 +6501,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Steadefi", - "poolAddress": "0xC4ABCd324ED49B98795CC8F51C80DAF1A24F5F58", - "poolType": "burnMint", + "pool": { + "address": "0xC4ABCd324ED49B98795CC8F51C80DAF1A24F5F58", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SDY", "tokenAddress": "0xf2DbAaBd8F8E0993F11DE4CEd470Df1ED1a4491b" } @@ -4572,8 +6516,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x6f6F5645B86b1fD3c4C015822a0E672132D4e2F8", - "poolType": "burnMint", + "pool": { + "address": "0x6f6F5645B86b1fD3c4C015822a0E672132D4e2F8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SHIB", "tokenAddress": "0x2f643d728926C20269f0A04931dd7b4b6B650204" }, @@ -4581,8 +6529,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x7f1f90E6b6BAD9fc14ca71224B072541B739beb3", - "poolType": "burnMint", + "pool": { + "address": "0x7f1f90E6b6BAD9fc14ca71224B072541B739beb3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SHIB", "tokenAddress": "0xEc59dE82FFf1959E92b91daB975e4564FC3447cC" }, @@ -4590,8 +6542,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x346368422407aCaF48025ff18891b1D7540539Bf", - "poolType": "burnMint", + "pool": { + "address": "0x346368422407aCaF48025ff18891b1D7540539Bf", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SHIB", "tokenAddress": "0xf5607d767CCa3789CAe872A33E3cfb76cFbaaaA2" }, @@ -4599,8 +6555,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x48A148B6EFAD4D59225034f1A243cea734e67bB0", - "poolType": "burnMint", + "pool": { + "address": "0x48A148B6EFAD4D59225034f1A243cea734e67bB0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SHIB", "tokenAddress": "0x7C87cc813Ce92D384c437C263E9FB2E7F945188E" }, @@ -4608,8 +6568,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x6f93AD7963BBdD8C655A0C819B9b79347EE04b70", - "poolType": "burnMint", + "pool": { + "address": "0x6f93AD7963BBdD8C655A0C819B9b79347EE04b70", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SHIB", "tokenAddress": "0xB359155378FF5E2837f12ed0bee5168123c88ACC" }, @@ -4617,8 +6581,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0xC026ae03C857093979872C665b13dBBA83B55987", - "poolType": "burnMint", + "pool": { + "address": "0xC026ae03C857093979872C665b13dBBA83B55987", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SHIB", "tokenAddress": "0x9Ded28d9EC69F97efd718CE768dc39D78fd014F8" }, @@ -4626,8 +6594,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x2bc58Bf0705f24200c19cF4248E4580d03C44EB8", - "poolType": "burnMint", + "pool": { + "address": "0x2bc58Bf0705f24200c19cF4248E4580d03C44EB8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SHIB", "tokenAddress": "0x3b4F8E846437c7CacE31080E6c9DFC455C1DBE77" }, @@ -4635,8 +6607,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x98A6F5ae745934ba25FF67B1e59C502b97ff1Cc3", - "poolType": "burnMint", + "pool": { + "address": "0x98A6F5ae745934ba25FF67B1e59C502b97ff1Cc3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SHIB", "tokenAddress": "0xC52F506591eb89c04620D47B895d5f951efAd4b4" }, @@ -4644,8 +6620,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x70f30536699c7180C53Ae9e7f64c06c5E7164960", - "poolType": "burnMint", + "pool": { + "address": "0x70f30536699c7180C53Ae9e7f64c06c5E7164960", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SHIB", "tokenAddress": "0x4d8E5D0c79B02A37074025B4C10854df01f33a3F" }, @@ -4653,8 +6633,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x13C4D04ED1Cba19391bD8E9F8F13B261340F474d", - "poolType": "burnMint", + "pool": { + "address": "0x13C4D04ED1Cba19391bD8E9F8F13B261340F474d", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SHIB", "tokenAddress": "0x1bA642B2f27E45d730ff20714B17309644274167" }, @@ -4662,8 +6646,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x7c8d25EF1cE7A5d342A3889DE9BB59939d67DFf8", - "poolType": "burnMint", + "pool": { + "address": "0x7c8d25EF1cE7A5d342A3889DE9BB59939d67DFf8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SHIB", "tokenAddress": "0x72cc27124EA2d36AC13D502C7EBdF28cEF90c31c" }, @@ -4671,8 +6659,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0xf1B85dEC561bfe9fC61BD758e533B85a7108634e", - "poolType": "burnMint", + "pool": { + "address": "0xf1B85dEC561bfe9fC61BD758e533B85a7108634e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SHIB", "tokenAddress": "0x6F7408DAc37a36cD35B5c3Bc2829f60C30E83315" }, @@ -4680,8 +6672,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0xf8678aC9b6b0d6ff9243F88060f595d4771a5E04", - "poolType": "burnMint", + "pool": { + "address": "0xf8678aC9b6b0d6ff9243F88060f595d4771a5E04", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SHIB", "tokenAddress": "0x3D83b2253a523a211cF5679Fea1D10A58b408177" }, @@ -4689,8 +6685,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x8f3829fCB1cD380746F1643Bfaf6aC8CA9960426", - "poolType": "burnMint", + "pool": { + "address": "0x8f3829fCB1cD380746F1643Bfaf6aC8CA9960426", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SHIB", "tokenAddress": "0x1f88af31101d9eAFBe5B9Dd627beb4b3010b8c54" }, @@ -4698,8 +6698,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x3eC718a22B268d7d9Ce27D2dcAB791174D515920", - "poolType": "lockRelease", + "pool": { + "address": "0x3eC718a22B268d7d9Ce27D2dcAB791174D515920", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "SHIB", "tokenAddress": "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE" }, @@ -4707,8 +6711,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x4f36762E13b6df9e717BfC82EB750a5d86393553", - "poolType": "burnMint", + "pool": { + "address": "0x4f36762E13b6df9e717BfC82EB750a5d86393553", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SHIB", "tokenAddress": "0x7627D9C9b045A26672D57741C896B2A48844168D" }, @@ -4716,8 +6724,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x4Ba40931F99188af67262109FBaB2A39de8D82BA", - "poolType": "burnMint", + "pool": { + "address": "0x4Ba40931F99188af67262109FBaB2A39de8D82BA", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SHIB", "tokenAddress": "0xf7bd92DcAad1E095f4f1f454eBEa99C2a96429e9" }, @@ -4725,8 +6737,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x0CBA02AC9C24Fe7b38123976c85Fe03Bbf4C5081", - "poolType": "burnMint", + "pool": { + "address": "0x0CBA02AC9C24Fe7b38123976c85Fe03Bbf4C5081", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SHIB", "tokenAddress": "0x13c24A28F2b1EEF8A657f661396545683D74e9e0" }, @@ -4734,8 +6750,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SHIBA INU", - "poolAddress": "0x25679A2879F6abb919c2dda665ce929D9A5214A8", - "poolType": "burnMint", + "pool": { + "address": "0x25679A2879F6abb919c2dda665ce929D9A5214A8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SHIB", "tokenAddress": "0xAE2e513aC868D27Bf8d697d165bB2e91C1AEA0F0" } @@ -4745,8 +6765,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Shipa", - "poolAddress": "0x54169D9660C21A83C68eb7AEd04AE87ff1b69D5c", - "poolType": "burnMint", + "pool": { + "address": "0x54169D9660C21A83C68eb7AEd04AE87ff1b69D5c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SHIPA", "tokenAddress": "0x74B017277BFFC58BE2D4d61097A69d584dcaF32F" }, @@ -4754,8 +6778,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Shipa", - "poolAddress": "0x67A3B613b2398b43E0B12DD6a07B30cDaCB6A61d", - "poolType": "lockRelease", + "pool": { + "address": "0x67A3B613b2398b43E0B12DD6a07B30cDaCB6A61d", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "SHIPA", "tokenAddress": "0x632d1FF1fB27d88EDeDB90e70bFC094D7932A0ad" } @@ -4765,8 +6793,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Shiro Neko", - "poolAddress": "0x8fd996312CA11849A562C78885021148F25a9841", - "poolType": "lockRelease", + "pool": { + "address": "0x8fd996312CA11849A562C78885021148F25a9841", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "SHIRO", "tokenAddress": "0xb0AC2b5a73da0e67A8e5489Ba922B3f8d582e058" }, @@ -4774,8 +6806,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Shiro Neko", - "poolAddress": "0x26a90cEeFfDfe7CD30913108C99872130c7FEE38", - "poolType": "burnMint", + "pool": { + "address": "0x26a90cEeFfDfe7CD30913108C99872130c7FEE38", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SHIRO", "tokenAddress": "0x15DD0588Dc6C75783B28905d416aE24fa234Fb60" } @@ -4785,8 +6821,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Silo Token", - "poolAddress": "0x3Fa5329dB787ac51D61DcaB9a588ceA106ad593C", - "poolType": "burnMint", + "pool": { + "address": "0x3Fa5329dB787ac51D61DcaB9a588ceA106ad593C", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SILO", "tokenAddress": "0x77EEe23630deC10e96C5A8F731A9cF46FCC8CD6f" }, @@ -4794,8 +6834,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Silo Token", - "poolAddress": "0x76A82571FC85817CEEeDff3Bf71bE3c076668A14", - "poolType": "burnMint", + "pool": { + "address": "0x76A82571FC85817CEEeDff3Bf71bE3c076668A14", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SILO", "tokenAddress": "0x09f569AF991c730Cae05a392bae6490558eF2214" }, @@ -4803,8 +6847,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Silo Token", - "poolAddress": "0x95842Bb96cECfe77e8AC07BA6e6bA948B745CCCd", - "poolType": "lockRelease", + "pool": { + "address": "0x95842Bb96cECfe77e8AC07BA6e6bA948B745CCCd", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "SILO", "tokenAddress": "0xF0B2dd79324A66d2108C961d680F7616E1486bB0" }, @@ -4812,8 +6860,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Silo Token", - "poolAddress": "0x527a8902DB7548353EAf08b6522686509e32B1FE", - "poolType": "burnMint", + "pool": { + "address": "0x527a8902DB7548353EAf08b6522686509e32B1FE", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SILO", "tokenAddress": "0xb098AFC30FCE67f1926e735Db6fDadFE433E61db" } @@ -4823,8 +6875,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked Inv", - "poolAddress": "0xaCDD3f0a2bC4e61ae5cd2b96BF87CCC04aa15DCc", - "poolType": "burnMint", + "pool": { + "address": "0xaCDD3f0a2bC4e61ae5cd2b96BF87CCC04aa15DCc", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "sINV", "tokenAddress": "0x4C7b266B4bf0A8758fa85E69292eE55c212236cF" }, @@ -4832,8 +6888,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked Inv", - "poolAddress": "0xE8E17C4E16EDE9ED62580b48bf784b71197279b8", - "poolType": "burnMint", + "pool": { + "address": "0xE8E17C4E16EDE9ED62580b48bf784b71197279b8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "sINV", "tokenAddress": "0x8Bbd036d018657E454F679E7C4726F7a8ECE2773" }, @@ -4841,8 +6901,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked Inv", - "poolAddress": "0x57500aB5b2b6B5c652B3816E0D53705a7D84F060", - "poolType": "burnMint", + "pool": { + "address": "0x57500aB5b2b6B5c652B3816E0D53705a7D84F060", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "sINV", "tokenAddress": "0x1992AF61FBf8ee38741bcc57d636CAA22A1a7702" }, @@ -4850,8 +6914,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Staked Inv", - "poolAddress": "0xF57fc17729Bd2bcD1e1342917B160eB4b69EE89A", - "poolType": "lockRelease", + "pool": { + "address": "0xF57fc17729Bd2bcD1e1342917B160eB4b69EE89A", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "sINV", "tokenAddress": "0x08d23468A467d2bb86FaE0e32F247A26C7E2e994" } @@ -4861,8 +6929,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sekuya", - "poolAddress": "0x48C4215ccb6Fa0974F7e0383b965959D0e944311", - "poolType": "burnMint", + "pool": { + "address": "0x48C4215ccb6Fa0974F7e0383b965959D0e944311", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SKYA", "tokenAddress": "0x84E9aaE2081AD3135Ec82496c31e5658A31B9756" }, @@ -4870,8 +6942,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sekuya", - "poolAddress": "0xcf9f8A4697510B69ABc3303521FC9d8f68fB689d", - "poolType": "burnMint", + "pool": { + "address": "0xcf9f8A4697510B69ABc3303521FC9d8f68fB689d", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SKYA", "tokenAddress": "0x623cD3a3EdF080057892aaF8D773Bbb7A5C9b6e9" }, @@ -4879,8 +6955,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sekuya", - "poolAddress": "0x78f6EB041A85eF3c1a1dC02C57b6beBfcAcBabbf", - "poolType": "burnMint", + "pool": { + "address": "0x78f6EB041A85eF3c1a1dC02C57b6beBfcAcBabbf", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SKYA", "tokenAddress": "0x623cD3a3EdF080057892aaF8D773Bbb7A5C9b6e9" }, @@ -4888,8 +6968,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sekuya Multiverse", - "poolAddress": "0x285f961842Da90AcFef2f2ab622854a0BFf12F9a", - "poolType": "burnMint", + "pool": { + "address": "0x285f961842Da90AcFef2f2ab622854a0BFf12F9a", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SKYA", "tokenAddress": "0x71b690adae1eba2e1A5d8a7b51a037b39A4CF007" } @@ -4899,8 +6983,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Snow Ball", - "poolAddress": "0x5e2E4A679e9e6c484c1095388A8F829851901746", - "poolType": "burnMint", + "pool": { + "address": "0x5e2E4A679e9e6c484c1095388A8F829851901746", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SNOW", "tokenAddress": "0x19E846C0341260f516b441e0b72a078218f514b0" }, @@ -4908,8 +6996,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Snow Ball", - "poolAddress": "0xa0fFE2d845aeE8dE1DbD652881D8CAb3607fd0d5", - "poolType": "burnMint", + "pool": { + "address": "0xa0fFE2d845aeE8dE1DbD652881D8CAb3607fd0d5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SNOW", "tokenAddress": "0xD62cf77508B80d5776aaAC9CA06227fF84cC845c" }, @@ -4917,8 +7009,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Snow Ball", - "poolAddress": "0xE3C8b709C43c4Fa4D2535f354e28e6FFC2614b69", - "poolType": "lockRelease", + "pool": { + "address": "0xE3C8b709C43c4Fa4D2535f354e28e6FFC2614b69", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "SNOW", "tokenAddress": "0x2778f7E40D90DB18203Ec31C9c5F84fde6cf6763" } @@ -4928,8 +7024,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Soil", - "poolAddress": "0xF3BD0793FAD8b24B7ba58956dE9DE305D34B9098", - "poolType": "burnMint", + "pool": { + "address": "0xF3BD0793FAD8b24B7ba58956dE9DE305D34B9098", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SOIL", "tokenAddress": "0x54991328Ab43c7D5d31C19d1B9fa048E77B5cd16" }, @@ -4937,8 +7037,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Soil", - "poolAddress": "0xb88d671611d6F517d5D94193da4d5B0dB79E3A0C", - "poolType": "lockRelease", + "pool": { + "address": "0xb88d671611d6F517d5D94193da4d5B0dB79E3A0C", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "SOIL", "tokenAddress": "0x43C73b90E0C2A355784dCf0Da12f477729b31e77" } @@ -4948,8 +7052,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0xc929ad75B72593967DE83E7F7Cda0493458261D9", - "poolType": "burnMint", + "pool": { + "address": "0xc929ad75B72593967DE83E7F7Cda0493458261D9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SolvBTC", "tokenAddress": "0xbc78D84Ba0c46dFe32cf2895a19939c86b81a777" }, @@ -4957,8 +7065,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0x0a12ec21c43ab2b4f69693Da1b0149e7652689c0", - "poolType": "burnMint", + "pool": { + "address": "0x0a12ec21c43ab2b4f69693Da1b0149e7652689c0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SolvBTC", "tokenAddress": "0x541FD749419CA806a8bc7da8ac23D346f2dF8B77" }, @@ -4966,8 +7078,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0x6c2310D68F21C024FF66Cc52e65220112F35DC32", - "poolType": "burnMint", + "pool": { + "address": "0x6c2310D68F21C024FF66Cc52e65220112F35DC32", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SolvBTC", "tokenAddress": "0x541FD749419CA806a8bc7da8ac23D346f2dF8B77" }, @@ -4975,8 +7091,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0x99D94f528CeA3eE1791ab7B476A1FACb4297CA17", - "poolType": "burnMint", + "pool": { + "address": "0x99D94f528CeA3eE1791ab7B476A1FACb4297CA17", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SolvBTC", "tokenAddress": "0x4aae823a6a0b376De6A78e74eCC5b079d38cBCf7" }, @@ -4984,8 +7104,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0x4f628aF99578da6A481851779Fa297A35500C173", - "poolType": "burnMint", + "pool": { + "address": "0x4f628aF99578da6A481851779Fa297A35500C173", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SolvBTC", "tokenAddress": "0x3647c54c4c2C65bC7a2D63c0Da2809B399DBBDC0" }, @@ -4993,8 +7117,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0x2315f2A36af9dd75B7a4E1c6c53B11767eBfb750", - "poolType": "burnMint", + "pool": { + "address": "0x2315f2A36af9dd75B7a4E1c6c53B11767eBfb750", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SolvBTC", "tokenAddress": "0x3B86Ad95859b6AB773f55f8d94B4b9d443EE931f" }, @@ -5002,8 +7130,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0xf49f81b3d2F2a79b706621FA2D5934136352140c", - "poolType": "burnMint", + "pool": { + "address": "0xf49f81b3d2F2a79b706621FA2D5934136352140c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SolvBTC", "tokenAddress": "0xaE4EFbc7736f963982aACb17EFA37fCBAb924cB3" }, @@ -5011,8 +7143,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0x99D94f528CeA3eE1791ab7B476A1FACb4297CA17", - "poolType": "burnMint", + "pool": { + "address": "0x99D94f528CeA3eE1791ab7B476A1FACb4297CA17", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SolvBTC", "tokenAddress": "0x541FD749419CA806a8bc7da8ac23D346f2dF8B77" }, @@ -5020,8 +7156,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0xb5829e1f8078860969950852546B947f37855ef1", - "poolType": "burnMint", + "pool": { + "address": "0xb5829e1f8078860969950852546B947f37855ef1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SolvBTC", "tokenAddress": "0x541FD749419CA806a8bc7da8ac23D346f2dF8B77" }, @@ -5029,8 +7169,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0xCd627aA160A6fA45Eb793D19Ef54f5062F20f33f", - "poolType": "burnMint", + "pool": { + "address": "0xCd627aA160A6fA45Eb793D19Ef54f5062F20f33f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SolvBTC", "tokenAddress": "0x74eD17608cc2B5f30a59d6aF07C9aD1B1aB3A5b1" }, @@ -5038,8 +7182,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0xFC361d7443B3E19F3720462d07480a03d60BB620", - "poolType": "burnMint", + "pool": { + "address": "0xFC361d7443B3E19F3720462d07480a03d60BB620", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SolvBTC", "tokenAddress": "0xaE4EFbc7736f963982aACb17EFA37fCBAb924cB3" }, @@ -5047,8 +7195,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0x3300f27EDEeEB59CC4C4203785406cBEAfEC8dF3", - "poolType": "burnMint", + "pool": { + "address": "0x3300f27EDEeEB59CC4C4203785406cBEAfEC8dF3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SolvBTC", "tokenAddress": "0x7A56E1C57C7475CCf742a1832B028F0456652F97" }, @@ -5056,8 +7208,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0x0809FC59B735e0aa90448514bBbEe0C75A080475", - "poolType": "burnMint", + "pool": { + "address": "0x0809FC59B735e0aa90448514bBbEe0C75A080475", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SolvBTC", "tokenAddress": "0xaE4EFbc7736f963982aACb17EFA37fCBAb924cB3" }, @@ -5065,8 +7221,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0x4bc35816c1D0B911940894ccd5121eC64Ffd69eb", - "poolType": "burnMint", + "pool": { + "address": "0x4bc35816c1D0B911940894ccd5121eC64Ffd69eb", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SolvBTC", "tokenAddress": "0xaE4EFbc7736f963982aACb17EFA37fCBAb924cB3" }, @@ -5074,8 +7234,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0x4b75FE6e4a53A510AbC39c7328B0b06E74a3F624", - "poolType": "burnMint", + "pool": { + "address": "0x4b75FE6e4a53A510AbC39c7328B0b06E74a3F624", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SolvBTC", "tokenAddress": "0x541FD749419CA806a8bc7da8ac23D346f2dF8B77" }, @@ -5083,8 +7247,12 @@ "allowListEnabled": false, "decimals": 8, "name": "SolvBTC", - "poolAddress": "2a6KLcDkvoTVWmPDQhc15earc6hU4uwEyBQrmRfcBon4", - "poolType": "burnMint", + "pool": { + "address": "2a6KLcDkvoTVWmPDQhc15earc6hU4uwEyBQrmRfcBon4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SolvBTC", "tokenAddress": "SoLvHDFVstC74Jr9eNLTDoG4goSUsn1RENmjNtFKZvW" }, @@ -5092,8 +7260,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0x6c2310D68F21C024FF66Cc52e65220112F35DC32", - "poolType": "burnMint", + "pool": { + "address": "0x6c2310D68F21C024FF66Cc52e65220112F35DC32", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SolvBTC", "tokenAddress": "0x541FD749419CA806a8bc7da8ac23D346f2dF8B77" }, @@ -5101,8 +7273,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Solv BTC", - "poolAddress": "0x62FD93Fc58D94eE253542ECD5C23467F65dCdB73", - "poolType": "burnMint", + "pool": { + "address": "0x62FD93Fc58D94eE253542ECD5C23467F65dCdB73", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SolvBTC", "tokenAddress": "0x541FD749419CA806a8bc7da8ac23D346f2dF8B77" } @@ -5112,8 +7288,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SolvBTC Bera Vault", - "poolAddress": "0xF8AE5209DE22dbd06Dace938934b0D75B5E80299", - "poolType": "burnMint", + "pool": { + "address": "0xF8AE5209DE22dbd06Dace938934b0D75B5E80299", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SolvBTC.BERA", "tokenAddress": "0x0F6f337B09cb5131cF0ce9df3Beb295b8e728F3B" }, @@ -5121,8 +7301,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SolvBTC Bera Vault", - "poolAddress": "0x42e15ab6098716f3Ae67e0Ff69C64b5a47304406", - "poolType": "burnMint", + "pool": { + "address": "0x42e15ab6098716f3Ae67e0Ff69C64b5a47304406", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SolvBTC.BERA", "tokenAddress": "0x0F6f337B09cb5131cF0ce9df3Beb295b8e728F3B" }, @@ -5130,8 +7314,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SolvBTC Bera Vault", - "poolAddress": "0x0Cd252108EF0CE50f95F75045a97C72A0A8d3118", - "poolType": "burnMint", + "pool": { + "address": "0x0Cd252108EF0CE50f95F75045a97C72A0A8d3118", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SolvBTC.BERA", "tokenAddress": "0x0F6f337B09cb5131cF0ce9df3Beb295b8e728F3B" }, @@ -5139,8 +7327,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SolvBTC Bera Vault", - "poolAddress": "0xD4304D2D5C9cdF63124fD2A6C814f6b4F85925D9", - "poolType": "burnMint", + "pool": { + "address": "0xD4304D2D5C9cdF63124fD2A6C814f6b4F85925D9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "SolvBTC.BERA", "tokenAddress": "0xE7C253EAD50976Caf7b0C2cbca569146A7741B50" } @@ -5150,8 +7342,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SolvBTC Jupiter", - "poolAddress": "0xb655EEd4AD8A1A7011c6C431DaE8b55a19a508B9", - "poolType": "burnMint", + "pool": { + "address": "0xb655EEd4AD8A1A7011c6C431DaE8b55a19a508B9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SolvBTC.JUP", "tokenAddress": "0x6b062AA7F5FC52b530Cb13967aE2E6bc0D8Dd3E4" }, @@ -5159,8 +7355,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SolvBTC Jupiter", - "poolAddress": "0x48731cF7e84dc94C5f84577882c14Be11a5B7456", - "poolType": "burnMint", + "pool": { + "address": "0x48731cF7e84dc94C5f84577882c14Be11a5B7456", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SolvBTC.JUP", "tokenAddress": "0x38a001e57430f781404ffF7a81DE4Bd67d1f6117" }, @@ -5168,8 +7368,12 @@ "allowListEnabled": false, "decimals": 8, "name": "SolvBTC.JUP", - "poolAddress": "HMDSmmuupoWwe9TV3nZ3qmPqAKL2tU7udghJzCywckgM", - "poolType": "burnMint", + "pool": { + "address": "HMDSmmuupoWwe9TV3nZ3qmPqAKL2tU7udghJzCywckgM", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SolvBTCJUP", "tokenAddress": "SoLvzL3ZVjofmNB5LYFrf94QtNhMUSea4DawFhnAau8" }, @@ -5177,8 +7381,12 @@ "allowListEnabled": false, "decimals": 18, "name": "SolvBTC Jupiter", - "poolAddress": "0x62FD93Fc58D94eE253542ECD5C23467F65dCdB73", - "poolType": "burnMint", + "pool": { + "address": "0x62FD93Fc58D94eE253542ECD5C23467F65dCdB73", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "SolvBTC.JUP", "tokenAddress": "0xAffEb8576b927050f5a3B6fbA43F360D2883A118" } @@ -5188,8 +7396,12 @@ "allowListEnabled": false, "decimals": 18, "name": "STABLE", - "poolAddress": "0x7169054A07c8946E45728CDe01Fee68bab5BEB82", - "poolType": "burnMint", + "pool": { + "address": "0x7169054A07c8946E45728CDe01Fee68bab5BEB82", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "STABLE", "tokenAddress": "0x8bF75bc68FD337dfd8186d731Df8b3C2CB14B9E6" }, @@ -5197,8 +7409,12 @@ "allowListEnabled": false, "decimals": 18, "name": "STABLE", - "poolAddress": "0xD5B44D00A3670533c17b6BE38156C0b1bBdBe90A", - "poolType": "burnMint", + "pool": { + "address": "0xD5B44D00A3670533c17b6BE38156C0b1bBdBe90A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "STABLE", "tokenAddress": "0x666966Ef3925B1c92fa355FDA9722899f3e73451" }, @@ -5206,8 +7422,12 @@ "allowListEnabled": false, "decimals": 18, "name": "STABLE", - "poolAddress": "0x581CED7408860a33E47CE6cA93e2cbB4bB48c9C7", - "poolType": "burnMint", + "pool": { + "address": "0x581CED7408860a33E47CE6cA93e2cbB4bB48c9C7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "STABLE", "tokenAddress": "0x60b9C41d99FE3Eb64Ecc1344baD31D87f1bceD6D" } @@ -5217,8 +7437,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stabull Finance", - "poolAddress": "0x500F6D4948Aac25074690a1c42Ae267b41a73326", - "poolType": "burnMint", + "pool": { + "address": "0x500F6D4948Aac25074690a1c42Ae267b41a73326", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "STABUL", "tokenAddress": "0x6722F882cc3A1B1034893eFA9764397C88897892" }, @@ -5226,8 +7450,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stabull Finance", - "poolAddress": "0xd2D62AB60A53Bad539CD8e43121c624B246F6302", - "poolType": "burnMint", + "pool": { + "address": "0xd2D62AB60A53Bad539CD8e43121c624B246F6302", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "STABUL", "tokenAddress": "0x6A43795941113c2F58EB487001f4f8eE74b6938A" }, @@ -5235,8 +7463,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stabull Finance", - "poolAddress": "0x057aDAdDa0C63fE48A41dEFFb13B07528b1Bee3b", - "poolType": "burnMint", + "pool": { + "address": "0x057aDAdDa0C63fE48A41dEFFb13B07528b1Bee3b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "STABUL", "tokenAddress": "0xC4420347a4791832bb7b16bF070D5C017D9fABC4" } @@ -5246,8 +7478,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lorenzo stBTC", - "poolAddress": "0x4B8BdCAdbDbb20330a6f90C8c8B1BA2E363E9BE8", - "poolType": "burnMint", + "pool": { + "address": "0x4B8BdCAdbDbb20330a6f90C8c8B1BA2E363E9BE8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "stBTC", "tokenAddress": "0xf6718b2701D4a6498eF77D7c152b2137Ab28b8A3" }, @@ -5255,8 +7491,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Lorenzo stBTC", - "poolAddress": "0x20282C8e5d2d44BaC0E37A3C78a18b3f78EE1d86", - "poolType": "burnMint", + "pool": { + "address": "0x20282C8e5d2d44BaC0E37A3C78a18b3f78EE1d86", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "stBTC", "tokenAddress": "0xf6718b2701D4a6498eF77D7c152b2137Ab28b8A3" } @@ -5266,8 +7506,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stobox Token v.2", - "poolAddress": "0x44e77d8C6Bb9999B036a6F084005E48928d18C74", - "poolType": "lockRelease", + "pool": { + "address": "0x44e77d8C6Bb9999B036a6F084005E48928d18C74", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "STBU", "tokenAddress": "0xb0c4080a8Fa7afa11a09473f3be14d44AF3f8743" }, @@ -5275,8 +7519,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stobox Token v.3", - "poolAddress": "0x44e77d8C6Bb9999B036a6F084005E48928d18C74", - "poolType": "burnMint", + "pool": { + "address": "0x44e77d8C6Bb9999B036a6F084005E48928d18C74", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "STBU", "tokenAddress": "0x1cb9bD2c6E7F4A7DE3778547d46C8D4c22abC093" }, @@ -5284,8 +7532,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stobox Token v.2", - "poolAddress": "0x44e77d8C6Bb9999B036a6F084005E48928d18C74", - "poolType": "lockRelease", + "pool": { + "address": "0x44e77d8C6Bb9999B036a6F084005E48928d18C74", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "STBU", "tokenAddress": "0xa6422E3E219ee6d4C1B18895275FE43556fd50eD" }, @@ -5293,8 +7545,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Stobox Token v.2", - "poolAddress": "0x44e77d8C6Bb9999B036a6F084005E48928d18C74", - "poolType": "lockRelease", + "pool": { + "address": "0x44e77d8C6Bb9999B036a6F084005E48928d18C74", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "STBU", "tokenAddress": "0xcf403036bc139d30080D2Cf0F5b48066F98191bB" } @@ -5304,8 +7560,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Tensorplex Staked TAO", - "poolAddress": "0x4F3eF0574095DeE6f216b9dD9f21Bfb0466a4CCD", - "poolType": "burnMint", + "pool": { + "address": "0x4F3eF0574095DeE6f216b9dD9f21Bfb0466a4CCD", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "stTAO", "tokenAddress": "0x886C0677D7BB7272C7eD8878dc03EF357aFbb5B5" }, @@ -5313,8 +7573,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Tensorplex Staked TAO", - "poolAddress": "0x43Fadc7B2929078F0f318E0bEC6b31dC2bF1C309", - "poolType": "burnMint", + "pool": { + "address": "0x43Fadc7B2929078F0f318E0bEC6b31dC2bF1C309", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "stTAO", "tokenAddress": "0x806041B6473DA60abbe1b256d9A2749A151be6C6" }, @@ -5322,8 +7586,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Tensorplex Staked TAO", - "poolAddress": "0x46083b69F70dDDbd1212e3AAc566DC3D8AdAc4C4", - "poolType": "burnMint", + "pool": { + "address": "0x46083b69F70dDDbd1212e3AAc566DC3D8AdAc4C4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "stTAO", "tokenAddress": "0x806041B6473DA60abbe1b256d9A2749A151be6C6" }, @@ -5331,8 +7599,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Tensorplex Staked TAO", - "poolAddress": "0x5c16671f7360E32982691c6A14353D8186C57A59", - "poolType": "lockRelease", + "pool": { + "address": "0x5c16671f7360E32982691c6A14353D8186C57A59", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "stTAO", "tokenAddress": "0xB60acD2057067DC9ed8c083f5aa227a244044fD6" } @@ -5342,8 +7614,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sumerian BTC", - "poolAddress": "0xd9193B4aFfA057Fa78E0b5C60fAf1bC09df3708b", - "poolType": "burnMint", + "pool": { + "address": "0xd9193B4aFfA057Fa78E0b5C60fAf1bC09df3708b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "suBTC", "tokenAddress": "0xe85411C030fB32A9D8b14Bbbc6CB19417391F711" }, @@ -5351,8 +7627,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sumerian BTC", - "poolAddress": "0x13d579664bAAb9ADcC4c6B19956f7b7EADBB036f", - "poolType": "burnMint", + "pool": { + "address": "0x13d579664bAAb9ADcC4c6B19956f7b7EADBB036f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "suBTC", "tokenAddress": "0xe85411C030fB32A9D8b14Bbbc6CB19417391F711" }, @@ -5360,8 +7640,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sumerian BTC", - "poolAddress": "0x5Be290d68db372cc487B1356649D906efC4f58Ca", - "poolType": "burnMint", + "pool": { + "address": "0x5Be290d68db372cc487B1356649D906efC4f58Ca", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "suBTC", "tokenAddress": "0xe85411C030fB32A9D8b14Bbbc6CB19417391F711" } @@ -5371,8 +7655,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sumerian ETH", - "poolAddress": "0x70544B4E4FcEd9c61BCdb6E0fFa69002cC4d374f", - "poolType": "burnMint", + "pool": { + "address": "0x70544B4E4FcEd9c61BCdb6E0fFa69002cC4d374f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "suETH", "tokenAddress": "0x1c22531AA9747d76fFF8F0A43b37954ca67d28e0" }, @@ -5380,8 +7668,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sumerian ETH", - "poolAddress": "0xafc7E9fDD13AFF368B1d8d16e04f4977e68128E1", - "poolType": "burnMint", + "pool": { + "address": "0xafc7E9fDD13AFF368B1d8d16e04f4977e68128E1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "suETH", "tokenAddress": "0x1c22531AA9747d76fFF8F0A43b37954ca67d28e0" }, @@ -5389,8 +7681,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sumerian ETH", - "poolAddress": "0xE58eDBb7Fdd5f2DD5cfAD2667e5D570E1a0a6A84", - "poolType": "burnMint", + "pool": { + "address": "0xE58eDBb7Fdd5f2DD5cfAD2667e5D570E1a0a6A84", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "suETH", "tokenAddress": "0x1c22531AA9747d76fFF8F0A43b37954ca67d28e0" } @@ -5400,8 +7696,12 @@ "allowListEnabled": false, "decimals": 18, "name": "sUSD1+", - "poolAddress": "0xa58B73a340f3c0d9d65Be8cAaB6C5EfB9331F775", - "poolType": "burnMint", + "pool": { + "address": "0xa58B73a340f3c0d9d65Be8cAaB6C5EfB9331F775", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "sUSD1+", "tokenAddress": "0x4F2760B32720F013E900DC92F65480137391199b" }, @@ -5409,8 +7709,12 @@ "allowListEnabled": false, "decimals": 18, "name": "sUSD1+", - "poolAddress": "0xBe4fbD980712a800f5e0e7C15a70e097efaCD331", - "poolType": "burnMint", + "pool": { + "address": "0xBe4fbD980712a800f5e0e7C15a70e097efaCD331", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "sUSD1+", "tokenAddress": "0x8F18f2C97d2f5EC0e1d5B91c1D2ce245a9151972" } @@ -5420,8 +7724,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sumerian USD", - "poolAddress": "0x6C8Fee5E05E99db417DFEe0B96275B065eA20EAe", - "poolType": "burnMint", + "pool": { + "address": "0x6C8Fee5E05E99db417DFEe0B96275B065eA20EAe", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "suUSD", "tokenAddress": "0x8BF591Eae535f93a242D5A954d3Cde648b48A5A8" }, @@ -5429,8 +7737,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sumerian USD", - "poolAddress": "0x69797ECF7ACd6CA73a8c42cfb4268F7572047346", - "poolType": "burnMint", + "pool": { + "address": "0x69797ECF7ACd6CA73a8c42cfb4268F7572047346", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "suUSD", "tokenAddress": "0x8BF591Eae535f93a242D5A954d3Cde648b48A5A8" }, @@ -5438,8 +7750,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Sumerian USD", - "poolAddress": "0x67F4e731f446Ff76716E7E3c955CD5A75C1B1787", - "poolType": "burnMint", + "pool": { + "address": "0x67F4e731f446Ff76716E7E3c955CD5A75C1B1787", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "suUSD", "tokenAddress": "0x8BF591Eae535f93a242D5A954d3Cde648b48A5A8" } @@ -5449,8 +7765,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Space and Time", - "poolAddress": "0x44E787a3a81bbc03Ec2C2a7aDADC5aE7Bc925Db9", - "poolType": "burnMint", + "pool": { + "address": "0x44E787a3a81bbc03Ec2C2a7aDADC5aE7Bc925Db9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "SXT", "tokenAddress": "0xA2c22252cDc8b7cDdEe1B0b2E242818509fCf7b8" }, @@ -5458,8 +7778,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Space and Time", - "poolAddress": "0x19EE30DE803b921Ecbba64eD1787Cda6d536c26a", - "poolType": "lockRelease", + "pool": { + "address": "0x19EE30DE803b921Ecbba64eD1787Cda6d536c26a", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "SXT", "tokenAddress": "0xE6Bfd33F52d82Ccb5b37E16D3dD81f9FFDAbB195" } @@ -5469,8 +7793,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDC", - "poolAddress": "0x660975730059246A68521a3e2FBD4740173100f5", - "poolType": "burnMint", + "pool": { + "address": "0x660975730059246A68521a3e2FBD4740173100f5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "syrupUSDC", "tokenAddress": "0x41CA7586cC1311807B4605fBB748a3B8862b42b5" }, @@ -5478,8 +7806,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDC", - "poolAddress": "0xA36955b2Bc12Aee77FF7519482D16C7B86DBe42a", - "poolType": "burnMint", + "pool": { + "address": "0xA36955b2Bc12Aee77FF7519482D16C7B86DBe42a", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "syrupUSDC", "tokenAddress": "0x660975730059246A68521a3e2FBD4740173100f5" }, @@ -5487,8 +7819,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDC", - "poolAddress": "0x966519C334D895121B61584CAdeBc15571b62983", - "poolType": "burnMint", + "pool": { + "address": "0x966519C334D895121B61584CAdeBc15571b62983", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "syrupUSDC", "tokenAddress": "0xd31dB306E5D79F0018Ac92e08492284201493EA1" }, @@ -5496,8 +7832,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDC", - "poolAddress": "0x20B79D39Bd44dEee4F89B1e9d0e3b945fde06491", - "poolType": "lockRelease", + "pool": { + "address": "0x20B79D39Bd44dEee4F89B1e9d0e3b945fde06491", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "syrupUSDC", "tokenAddress": "0x80ac24aA929eaF5013f6436cdA2a7ba190f5Cc0b" }, @@ -5505,8 +7845,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDC", - "poolAddress": "HrTBpF3LqSxXnjnYdR4htnBLyMHNZ6eNaDZGPundvHbm", - "poolType": "burnMint", + "pool": { + "address": "HrTBpF3LqSxXnjnYdR4htnBLyMHNZ6eNaDZGPundvHbm", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "syrupUSDC", "tokenAddress": "AvZZF1YaZDziPY2RCK4oJrRVrbN3mTD9NL24hPeaZeUj" } @@ -5516,8 +7860,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDT", - "poolAddress": "0x0aA145a62153190B8f0D3cA00c441e451529f755", - "poolType": "burnMint", + "pool": { + "address": "0x0aA145a62153190B8f0D3cA00c441e451529f755", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "syrupUSDT", "tokenAddress": "0x051665f2455116e929b9972c36d23070F5054Ce0" }, @@ -5525,8 +7873,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDT", - "poolAddress": "0xDE76A096C5eadDdf97Af3fE15ee49d32AEDa9822", - "poolType": "lockRelease", + "pool": { + "address": "0xDE76A096C5eadDdf97Af3fE15ee49d32AEDa9822", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "syrupUSDT", "tokenAddress": "0x356B8d89c1e1239Cbbb9dE4815c39A1474d5BA7D" }, @@ -5534,8 +7886,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDT", - "poolAddress": "0x1d952d2f6eE86Ef4940Fa648aA7477c8fF175F09", - "poolType": "burnMint", + "pool": { + "address": "0x1d952d2f6eE86Ef4940Fa648aA7477c8fF175F09", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "syrupUSDT", "tokenAddress": "0xC4374775489CB9C56003BF2C9b12495fC64F0771" } @@ -5545,8 +7901,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Treehouse ETH", - "poolAddress": "0x0C3603B0c299e680A5Af4dC83a962d66E852903B", - "poolType": "burnMint", + "pool": { + "address": "0x0C3603B0c299e680A5Af4dC83a962d66E852903B", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "tETH", "tokenAddress": "0xd09ACb80C1E8f2291862c4978A008791c9167003" }, @@ -5554,8 +7914,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Treehouse ETH", - "poolAddress": "0x0C3603B0c299e680A5Af4dC83a962d66E852903B", - "poolType": "burnMint", + "pool": { + "address": "0x0C3603B0c299e680A5Af4dC83a962d66E852903B", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "tETH", "tokenAddress": "0xd09ACb80C1E8f2291862c4978A008791c9167003" }, @@ -5563,8 +7927,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Treehouse ETH", - "poolAddress": "0x0C3603B0c299e680A5Af4dC83a962d66E852903B", - "poolType": "burnMint", + "pool": { + "address": "0x0C3603B0c299e680A5Af4dC83a962d66E852903B", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "tETH", "tokenAddress": "0xd09ACb80C1E8f2291862c4978A008791c9167003" }, @@ -5572,8 +7940,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Treehouse ETH", - "poolAddress": "0x8113f001eA456759264317007220cBc939cA8435", - "poolType": "lockRelease", + "pool": { + "address": "0x8113f001eA456759264317007220cBc939cA8435", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "tETH", "tokenAddress": "0xD11c452fc99cF405034ee446803b6F6c1F6d5ED8" }, @@ -5581,8 +7953,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Treehouse ETH", - "poolAddress": "0x0C3603B0c299e680A5Af4dC83a962d66E852903B", - "poolType": "burnMint", + "pool": { + "address": "0x0C3603B0c299e680A5Af4dC83a962d66E852903B", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "tETH", "tokenAddress": "0xd09ACb80C1E8f2291862c4978A008791c9167003" } @@ -5592,8 +7968,12 @@ "allowListEnabled": false, "decimals": 18, "name": "THENA", - "poolAddress": "0x93cAb7CB2a07477A557754a81971EFeDFa04EdAA", - "poolType": "burnMint", + "pool": { + "address": "0x93cAb7CB2a07477A557754a81971EFeDFa04EdAA", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "THE", "tokenAddress": "0x9d94A7fF461e83F161c8c040E78557e31d8Cba72" }, @@ -5601,8 +7981,12 @@ "allowListEnabled": false, "decimals": 18, "name": "THENA", - "poolAddress": "0xECFF67559c0583027A5fbd85136E33bC4D66eeA0", - "poolType": "lockRelease", + "pool": { + "address": "0xECFF67559c0583027A5fbd85136E33bC4D66eeA0", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "THE", "tokenAddress": "0xF4C8E32EaDEC4BFe97E0F595AdD0f4450a863a11" }, @@ -5610,8 +7994,12 @@ "allowListEnabled": false, "decimals": 18, "name": "THENA", - "poolAddress": "0x2a9f896660E802c59a3178b2E8CB7FBaCCC04e86", - "poolType": "burnMint", + "pool": { + "address": "0x2a9f896660E802c59a3178b2E8CB7FBaCCC04e86", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "THE", "tokenAddress": "0x27DfD2D7b85e0010542da35C6EBcD59E45fc949D" } @@ -5621,8 +8009,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Polytrade", - "poolAddress": "0x7eb93143612CFB6Dda216EBE481e510F3A3b645f", - "poolType": "burnMint", + "pool": { + "address": "0x7eb93143612CFB6Dda216EBE481e510F3A3b645f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "TRADE", "tokenAddress": "0xb75Ba7eF520A5Bd0A5d01108060bE269642c4601" }, @@ -5630,8 +8022,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Polytrade", - "poolAddress": "0x2bFBA5bD4b0b1180A135Bb6a74423cCB429Fc744", - "poolType": "burnMint", + "pool": { + "address": "0x2bFBA5bD4b0b1180A135Bb6a74423cCB429Fc744", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "TRADE", "tokenAddress": "0x72e1868f8EB8f9fb86455c10e72aa4b24774a5a3" }, @@ -5639,8 +8035,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Polytrade", - "poolAddress": "0x520763c1eBDa04DAC9a6077a41CCC703FF22a9f8", - "poolType": "lockRelease", + "pool": { + "address": "0x520763c1eBDa04DAC9a6077a41CCC703FF22a9f8", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "TRADE", "tokenAddress": "0x6e5970DBd6fc7eb1f29C6D2eDF2bC4c36124C0C1" }, @@ -5648,8 +8048,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Polytrade (PoS)", - "poolAddress": "0xbE787bD62c85c2dCB92B662A5d77348eA9A7e461", - "poolType": "lockRelease", + "pool": { + "address": "0xbE787bD62c85c2dCB92B662A5d77348eA9A7e461", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "TRADE", "tokenAddress": "0x692AC1e363ae34b6B489148152b12e2785a3d8d6" } @@ -5659,8 +8063,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Treehouse Token", - "poolAddress": "0x229AE3eC539865444404c666f504Be68CeB81E02", - "poolType": "burnMint", + "pool": { + "address": "0x229AE3eC539865444404c666f504Be68CeB81E02", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "TREE", "tokenAddress": "0x77146784315Ba81904d654466968e3a7c196d1f3" }, @@ -5668,8 +8076,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Treehouse Token", - "poolAddress": "0x229AE3eC539865444404c666f504Be68CeB81E02", - "poolType": "burnMint", + "pool": { + "address": "0x229AE3eC539865444404c666f504Be68CeB81E02", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "TREE", "tokenAddress": "0x77146784315Ba81904d654466968e3a7c196d1f3" }, @@ -5677,8 +8089,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Treehouse Token", - "poolAddress": "0x407dBD0170A79Bb62a016d4555C656205BbA8a68", - "poolType": "lockRelease", + "pool": { + "address": "0x407dBD0170A79Bb62a016d4555C656205BbA8a68", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "TREE", "tokenAddress": "0x77146784315Ba81904d654466968e3a7c196d1f3" } @@ -5688,8 +8104,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Turbo", - "poolAddress": "0xeA771EB68CcfE489cdA2713F4248CD512c880453", - "poolType": "burnMint", + "pool": { + "address": "0xeA771EB68CcfE489cdA2713F4248CD512c880453", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "TURBO", "tokenAddress": "0x620a8b7Bd26b21d0d053ee9a05A593f35Bf37d8e" }, @@ -5697,8 +8117,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Turbo", - "poolAddress": "0x348540aa7b129b0F3c931FEDE811d009E0e18E60", - "poolType": "lockRelease", + "pool": { + "address": "0x348540aa7b129b0F3c931FEDE811d009E0e18E60", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "TURBO", "tokenAddress": "0xA35923162C49cF95e6BF26623385eb431ad920D3" } @@ -5708,8 +8132,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Turtle", - "poolAddress": "0x4559605E3003fdA8c059e14aF4f16ba9a004335a", - "poolType": "burnMint", + "pool": { + "address": "0x4559605E3003fdA8c059e14aF4f16ba9a004335a", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "TURTLE", "tokenAddress": "0x66fD8de541c0594b4DccdFc13Bf3a390E50d3Afd" }, @@ -5717,8 +8145,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Turtle", - "poolAddress": "0x7263Bc9f9D2f94e9a3Bcb3EFB40C79C43aC0C647", - "poolType": "burnMint", + "pool": { + "address": "0x7263Bc9f9D2f94e9a3Bcb3EFB40C79C43aC0C647", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "TURTLE", "tokenAddress": "0x56aa6D651bfefA9207B35E508716466359BAe8eF" }, @@ -5726,8 +8158,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Turtle", - "poolAddress": "0xD3bD7Db2B40DBEE54cA70a34921fde8A8D2f8BbB", - "poolType": "burnMint", + "pool": { + "address": "0xD3bD7Db2B40DBEE54cA70a34921fde8A8D2f8BbB", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "TURTLE", "tokenAddress": "0x66fD8de541c0594b4DccdFc13Bf3a390E50d3Afd" } @@ -5737,8 +8173,12 @@ "allowListEnabled": false, "decimals": 6, "name": "una USDC", - "poolAddress": "0xcfd0637093193ac909f74F9de95c2d4B92Df23c4", - "poolType": "burnMint", + "pool": { + "address": "0xcfd0637093193ac909f74F9de95c2d4B92Df23c4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "una.USDC", "tokenAddress": "0x66cC3FD40612F9c591F977ce026Ef1C79520C472" }, @@ -5746,8 +8186,12 @@ "allowListEnabled": false, "decimals": 6, "name": "una USDC", - "poolAddress": "0x0c118bE814166fb720f8DDEB119F53B622787918", - "poolType": "burnMint", + "pool": { + "address": "0x0c118bE814166fb720f8DDEB119F53B622787918", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "una.USDC", "tokenAddress": "0xcdf764933B9a9ebB2C5DA904B9715F3Cf981572A" } @@ -5757,8 +8201,12 @@ "allowListEnabled": false, "decimals": 18, "name": "una WEMIX", - "poolAddress": "0x2F15F2C9d1E0945C37E3EDCD8914BBd0067e46C8", - "poolType": "burnMint", + "pool": { + "address": "0x2F15F2C9d1E0945C37E3EDCD8914BBd0067e46C8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "una.WEMIX", "tokenAddress": "0x9f1453d0fADC73aE12d4e1BD8311AA2463AE7d0D" }, @@ -5766,8 +8214,12 @@ "allowListEnabled": false, "decimals": 18, "name": "una WEMIX", - "poolAddress": "0x2b975918e804803615131e7de2ca1645B1719ec9", - "poolType": "burnMint", + "pool": { + "address": "0x2b975918e804803615131e7de2ca1645B1719ec9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "una.WEMIX", "tokenAddress": "0x98169bF9B7a44EDaD372364063b897E16eBba88e" }, @@ -5775,8 +8227,12 @@ "allowListEnabled": false, "decimals": 18, "name": "una WEMIX", - "poolAddress": "0x65030ab42BAd6E140ADD01D6998DC7d2eCb34089", - "poolType": "burnMint", + "pool": { + "address": "0x65030ab42BAd6E140ADD01D6998DC7d2eCb34089", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "una.WEMIX", "tokenAddress": "0x89F590D8f9c1a306AEB4E939Dc923C80144998Cd" }, @@ -5784,8 +8240,12 @@ "allowListEnabled": false, "decimals": 18, "name": "una WEMIX", - "poolAddress": "0xFaF7992eB0A1eff0C4cdB070c12512f18E0D6079", - "poolType": "burnMint", + "pool": { + "address": "0xFaF7992eB0A1eff0C4cdB070c12512f18E0D6079", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "una.WEMIX", "tokenAddress": "0x6ff638E48247b003E003aa3EeDDdF97BaA8f3B64" }, @@ -5793,8 +8253,12 @@ "allowListEnabled": false, "decimals": 18, "name": "una WEMIX", - "poolAddress": "0x9F02c16190691CC4ceCD53A9267Bd24e37B6d06C", - "poolType": "burnMint", + "pool": { + "address": "0x9F02c16190691CC4ceCD53A9267Bd24e37B6d06C", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "una.WEMIX", "tokenAddress": "0x2624Bd0094f474713AC9c634b37A5ebef4e0b1FE" }, @@ -5802,8 +8266,12 @@ "allowListEnabled": false, "decimals": 18, "name": "una WEMIX", - "poolAddress": "0xeDb68F273FC95e1DB951580957c3fE49FF0A8cF7", - "poolType": "burnMint", + "pool": { + "address": "0xeDb68F273FC95e1DB951580957c3fE49FF0A8cF7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "una.WEMIX", "tokenAddress": "0x186d65ceD0693382713437e34EF8723FD6aa9A1E" }, @@ -5811,8 +8279,12 @@ "allowListEnabled": false, "decimals": 18, "name": "una WEMIX", - "poolAddress": "0x3B1f09b0Ac19fCd3F03A0Bdda70F65Db01626de1", - "poolType": "burnMint", + "pool": { + "address": "0x3B1f09b0Ac19fCd3F03A0Bdda70F65Db01626de1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "una.WEMIX", "tokenAddress": "0xF500208d9aB68FeA3cc41bd107811e809C0B6B83" } @@ -5822,8 +8294,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x80ab5314fa37a0c2e10bc490acd7ca83898119accaebac9e7bba61f1f164b8ed", - "poolType": "burnMint", + "pool": { + "address": "0x80ab5314fa37a0c2e10bc490acd7ca83898119accaebac9e7bba61f1f164b8ed", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "uniBTC", "tokenAddress": "0xf764dbfd6999067ac052a8e722ae359bec389bd7dba19ead586801b99b81b075" }, @@ -5831,8 +8307,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x097Ae334B90F98637899cfcaa7980B13aa497e5E", - "poolType": "burnMint", + "pool": { + "address": "0x097Ae334B90F98637899cfcaa7980B13aa497e5E", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "uniBTC", "tokenAddress": "0xC3827A4BC8224ee2D116637023b124CED6db6e90" }, @@ -5840,8 +8320,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x4b75FE6e4a53A510AbC39c7328B0b06E74a3F624", - "poolType": "burnMint", + "pool": { + "address": "0x4b75FE6e4a53A510AbC39c7328B0b06E74a3F624", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "uniBTC", "tokenAddress": "0x93919784C523f39CACaa98Ee0a9d96c3F32b593e" }, @@ -5849,8 +8333,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x085e4ADc459699a8Ec60c6da5CBdBF715f23831f", - "poolType": "burnMint", + "pool": { + "address": "0x085e4ADc459699a8Ec60c6da5CBdBF715f23831f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "uniBTC", "tokenAddress": "0x236f8c0a61dA474dB21B693fB2ea7AAB0c803894" }, @@ -5858,8 +8346,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x4b75FE6e4a53A510AbC39c7328B0b06E74a3F624", - "poolType": "burnMint", + "pool": { + "address": "0x4b75FE6e4a53A510AbC39c7328B0b06E74a3F624", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "uniBTC", "tokenAddress": "0x93919784C523f39CACaa98Ee0a9d96c3F32b593e" }, @@ -5867,8 +8359,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0xF0b508c7fF394B94BCb73C19007C7102C2d9aa19", - "poolType": "burnMint", + "pool": { + "address": "0xF0b508c7fF394B94BCb73C19007C7102C2d9aa19", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "uniBTC", "tokenAddress": "0x6B2a01A5f79dEb4c2f3c0eDa7b01DF456FbD726a" }, @@ -5876,8 +8372,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x2c3D51c7B454cB045C8cEc92d2F9E717C7519106", - "poolType": "burnMint", + "pool": { + "address": "0x2c3D51c7B454cB045C8cEc92d2F9E717C7519106", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "uniBTC", "tokenAddress": "0x93919784C523f39CACaa98Ee0a9d96c3F32b593e" }, @@ -5885,8 +8385,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x085BE2297c1A1A2C2a119b731AF887DD0119D035", - "poolType": "burnMint", + "pool": { + "address": "0x085BE2297c1A1A2C2a119b731AF887DD0119D035", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "uniBTC", "tokenAddress": "0x6B2a01A5f79dEb4c2f3c0eDa7b01DF456FbD726a" }, @@ -5894,8 +8398,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x02042Df6933a2Fb8a7Bfc92117146E7CCf6b260f", - "poolType": "burnMint", + "pool": { + "address": "0x02042Df6933a2Fb8a7Bfc92117146E7CCf6b260f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "uniBTC", "tokenAddress": "0x93919784C523f39CACaa98Ee0a9d96c3F32b593e" }, @@ -5903,8 +8411,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0xBf977109Ae4Fd840d23b19454DF1C7414168E9F9", - "poolType": "burnMint", + "pool": { + "address": "0xBf977109Ae4Fd840d23b19454DF1C7414168E9F9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "uniBTC", "tokenAddress": "0xd3c8dA379d71a33BfEE8875F87Ac2748bEB1d58d" }, @@ -5912,8 +8424,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x85d4CfFC273b0766bFa1402d890c71DF167CC2AD", - "poolType": "burnMint", + "pool": { + "address": "0x85d4CfFC273b0766bFa1402d890c71DF167CC2AD", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "uniBTC", "tokenAddress": "0x93919784C523f39CACaa98Ee0a9d96c3F32b593e" }, @@ -5921,8 +8437,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x99D94f528CeA3eE1791ab7B476A1FACb4297CA17", - "poolType": "burnMint", + "pool": { + "address": "0x99D94f528CeA3eE1791ab7B476A1FACb4297CA17", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "uniBTC", "tokenAddress": "0x93919784C523f39CACaa98Ee0a9d96c3F32b593e" }, @@ -5930,8 +8450,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x30782053a09599eE44C054075A36c4CA1B224Be5", - "poolType": "burnMint", + "pool": { + "address": "0x30782053a09599eE44C054075A36c4CA1B224Be5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "uniBTC", "tokenAddress": "0xd3c8dA379d71a33BfEE8875F87Ac2748bEB1d58d" }, @@ -5939,8 +8463,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x5aE00CB3da6d11d525dd7AE288673f3BCB992526", - "poolType": "burnMint", + "pool": { + "address": "0x5aE00CB3da6d11d525dd7AE288673f3BCB992526", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "uniBTC", "tokenAddress": "0xd3c8dA379d71a33BfEE8875F87Ac2748bEB1d58d" }, @@ -5948,8 +8476,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0xda57087632409A30876e978450De23A2f55ADA91", - "poolType": "burnMint", + "pool": { + "address": "0xda57087632409A30876e978450De23A2f55ADA91", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "uniBTC", "tokenAddress": "0xF9775085d726E782E83585033B58606f7731AB18" }, @@ -5957,8 +8489,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x1689C22eD5435e49071CFc208D1Ac6F2A2274490", - "poolType": "burnMint", + "pool": { + "address": "0x1689C22eD5435e49071CFc208D1Ac6F2A2274490", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "uniBTC", "tokenAddress": "0x004E9C3EF86bc1ca1f0bB5C7662861Ee93350568" }, @@ -5966,8 +8502,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "A8qxRKqAftbqatfegeiq3yTVmVTPS9DimGWHtgzjC417", - "poolType": "burnMint", + "pool": { + "address": "A8qxRKqAftbqatfegeiq3yTVmVTPS9DimGWHtgzjC417", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "uniBTC", "tokenAddress": "uniBKsEV37qLRFZD7v3Z9drX6voyiCM8WcaePqeSSLc" }, @@ -5975,8 +8515,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0x22134617Ae0f6CA8D89451e5Ae091c94f7D743DC", - "poolType": "burnMint", + "pool": { + "address": "0x22134617Ae0f6CA8D89451e5Ae091c94f7D743DC", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "uniBTC", "tokenAddress": "0xC3827A4BC8224ee2D116637023b124CED6db6e90" }, @@ -5984,8 +8528,12 @@ "allowListEnabled": false, "decimals": 8, "name": "uniBTC", - "poolAddress": "0xA7ee087c961A22aa25eDdaB9c0b43b4a39EAd5ea", - "poolType": "burnMint", + "pool": { + "address": "0xA7ee087c961A22aa25eDdaB9c0b43b4a39EAd5ea", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "uniBTC", "tokenAddress": "0xF9775085d726E782E83585033B58606f7731AB18" } @@ -5995,8 +8543,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Unio Coin", - "poolAddress": "0x5eD97E6938D4074CdFC83a310de2525F0a4e6c73", - "poolType": "burnMint", + "pool": { + "address": "0x5eD97E6938D4074CdFC83a310de2525F0a4e6c73", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "UNIO", "tokenAddress": "0x01aaC2b594F7bdBeC740F0F1AA22910EbB4B74Ab" }, @@ -6004,8 +8556,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Unio Coin", - "poolAddress": "0x8AA50883f5f62EB081D16c90FdAdAD9E227206c6", - "poolType": "burnMint", + "pool": { + "address": "0x8AA50883f5f62EB081D16c90FdAdAD9E227206c6", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "UNIO", "tokenAddress": "0x01aaC2b594F7bdBeC740F0F1AA22910EbB4B74Ab" }, @@ -6013,8 +8569,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Unio Coin", - "poolAddress": "0xc576D83eA5D672E220f7B099827E73685Fde5B73", - "poolType": "burnMint", + "pool": { + "address": "0xc576D83eA5D672E220f7B099827E73685Fde5B73", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "UNIO", "tokenAddress": "0x01aaC2b594F7bdBeC740F0F1AA22910EbB4B74Ab" } @@ -6024,8 +8584,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Usagi", - "poolAddress": "0x7c458207b7b0E4Eca3c54f3353b2dB00A81a04aA", - "poolType": "burnMint", + "pool": { + "address": "0x7c458207b7b0E4Eca3c54f3353b2dB00A81a04aA", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USAGI", "tokenAddress": "0x760295AA772671f21cd0046d094938d09f2b380D" }, @@ -6033,8 +8597,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Usagi", - "poolAddress": "0xC488be11a33c20bd21f7940D4a5937E8A8c81fEc", - "poolType": "lockRelease", + "pool": { + "address": "0xC488be11a33c20bd21f7940D4a5937E8A8c81fEc", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "USAGI", "tokenAddress": "0x3a1adB8Ef2a37Fe127Aa62B2Fc0399a4A6AD9D79" } @@ -6044,8 +8612,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD+", - "poolAddress": "0x1a1079CBA4bf83Ef2D90997360231F9599800fB5", - "poolType": "burnMint", + "pool": { + "address": "0x1a1079CBA4bf83Ef2D90997360231F9599800fB5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USD+", "tokenAddress": "0xfc90518D5136585ba45e34ED5E1D108BD3950CFa" }, @@ -6053,8 +8625,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD+", - "poolAddress": "0x1e88d63b8805C36f96C530c37bde113361aC6Cc0", - "poolType": "burnMint", + "pool": { + "address": "0x1e88d63b8805C36f96C530c37bde113361aC6Cc0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USD+", "tokenAddress": "0x98C6616F1CC0D3E938A16200830DD55663dd7DD3" }, @@ -6062,8 +8638,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD+", - "poolAddress": "0xCE8342b8eFd4D804B97Df92bC6bb930099098fDE", - "poolType": "burnMint", + "pool": { + "address": "0xCE8342b8eFd4D804B97Df92bC6bb930099098fDE", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USD+", "tokenAddress": "0x98C6616F1CC0D3E938A16200830DD55663dd7DD3" } @@ -6073,8 +8653,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Usual USD", - "poolAddress": "0x8d20F295518B12E63F65aB7cf930AD88e8d17cbA", - "poolType": "burnMint", + "pool": { + "address": "0x8d20F295518B12E63F65aB7cf930AD88e8d17cbA", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USD0", "tokenAddress": "0x758a3e0b1F842C9306B783f8A4078C6C8C03a270" }, @@ -6082,8 +8666,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Usual USD", - "poolAddress": "0x8d20F295518B12E63F65aB7cf930AD88e8d17cbA", - "poolType": "burnMint", + "pool": { + "address": "0x8d20F295518B12E63F65aB7cf930AD88e8d17cbA", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USD0", "tokenAddress": "0x758a3e0b1F842C9306B783f8A4078C6C8C03a270" }, @@ -6091,8 +8679,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Usual USD", - "poolAddress": "0xC3d39B77032114c8884276Dae0F02cdF75162782", - "poolType": "lockRelease", + "pool": { + "address": "0xC3d39B77032114c8884276Dae0F02cdF75162782", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "USD0", "tokenAddress": "0x73A15FeD60Bf67631dC6cd7Bc5B6e8da8190aCF5" } @@ -6102,8 +8694,12 @@ "allowListEnabled": false, "decimals": 18, "name": "World Liberty Financial USD", - "poolAddress": "0xEC1276CA704c612A28cb2C873dEdCEba97F65cED", - "poolType": "burnMint", + "pool": { + "address": "0xEC1276CA704c612A28cb2C873dEdCEba97F65cED", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USD1", "tokenAddress": "0x111111d2bf19e43C34263401e0CAd979eD1cdb61" }, @@ -6111,8 +8707,12 @@ "allowListEnabled": false, "decimals": 6, "name": "World Liberty Financial USD", - "poolAddress": "0x1eb155d08acc900954b6ccee01659b390399ae81ad4c582b73d41374c475caf6", - "poolType": "burnMint", + "pool": { + "address": "0x1eb155d08acc900954b6ccee01659b390399ae81ad4c582b73d41374c475caf6", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "USD1", "tokenAddress": "0x05fabd1b12e39967a3c24e91b7b8f67719a6dacee74f3c8b9fb7d93e855437d2" }, @@ -6120,8 +8720,12 @@ "allowListEnabled": false, "decimals": 18, "name": "World Liberty Financial USD", - "poolAddress": "0xCe3f7378aE409e1CE0dD6fFA70ab683326b73f04", - "poolType": "burnMint", + "pool": { + "address": "0xCe3f7378aE409e1CE0dD6fFA70ab683326b73f04", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USD1", "tokenAddress": "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d" }, @@ -6129,8 +8733,12 @@ "allowListEnabled": false, "decimals": 18, "name": "World Liberty Financial USD", - "poolAddress": "0xf58A2e303e519f6A1b772137995871967e30391a", - "poolType": "burnMint", + "pool": { + "address": "0xf58A2e303e519f6A1b772137995871967e30391a", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USD1", "tokenAddress": "0x111111d2bf19e43C34263401e0CAd979eD1cdb61" }, @@ -6138,8 +8746,12 @@ "allowListEnabled": false, "decimals": 18, "name": "World Liberty Financial USD", - "poolAddress": "0x36a72eD0096B414521C45E3ddC9ed657d1D9c141", - "poolType": "burnMint", + "pool": { + "address": "0x36a72eD0096B414521C45E3ddC9ed657d1D9c141", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "USD1", "tokenAddress": "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d" }, @@ -6147,8 +8759,12 @@ "allowListEnabled": false, "decimals": 6, "name": "World Liberty Financial USD", - "poolAddress": "0x5258D5BEB800DF857D8A4e808EE0C8c7bF567e0E", - "poolType": "burnMint", + "pool": { + "address": "0x5258D5BEB800DF857D8A4e808EE0C8c7bF567e0E", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USD1", "tokenAddress": "0x111111d2bf19e43C34263401e0CAd979eD1cdb61" }, @@ -6156,8 +8772,12 @@ "allowListEnabled": false, "decimals": 18, "name": "World Liberty Financial USD", - "poolAddress": "0x258Fc917b8de98b4aA0d38776E95dcce9e7EC8aC", - "poolType": "burnMint", + "pool": { + "address": "0x258Fc917b8de98b4aA0d38776E95dcce9e7EC8aC", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USD1", "tokenAddress": "0x111111d2bf19e43C34263401e0CAd979eD1cdb61" }, @@ -6165,8 +8785,12 @@ "allowListEnabled": false, "decimals": 18, "name": "World Liberty Financial USD", - "poolAddress": "0x770318D51052871DeF5Eb5c452F4fd28B7960C4e", - "poolType": "burnMint", + "pool": { + "address": "0x770318D51052871DeF5Eb5c452F4fd28B7960C4e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "USD1", "tokenAddress": "0x111111d2bf19e43C34263401e0CAd979eD1cdb61" }, @@ -6174,8 +8798,12 @@ "allowListEnabled": false, "decimals": 6, "name": "World Liberty Financial USD", - "poolAddress": "B4PB9qWUW6R18Gbpk5Km8mJ2GoQgCcVpgdqhU7C2n8fh", - "poolType": "burnMint", + "pool": { + "address": "B4PB9qWUW6R18Gbpk5Km8mJ2GoQgCcVpgdqhU7C2n8fh", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USD1", "tokenAddress": "USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB" } @@ -6185,8 +8813,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Bridged USDC", - "poolAddress": "0x0A3d8eD619ECF1E984488710eB2cEcE4FDbd83CA", - "poolType": "burnMint", + "pool": { + "address": "0x0A3d8eD619ECF1E984488710eB2cEcE4FDbd83CA", + "rawType": "usdc", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USDC.e", "tokenAddress": "0x1f3AA82227281cA364bFb3d253B0f1af1Da6473E" }, @@ -6194,8 +8826,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD Coin", - "poolAddress": "0x966519C334D895121B61584CAdeBc15571b62983", - "poolType": "usdc", + "pool": { + "address": "0x966519C334D895121B61584CAdeBc15571b62983", + "rawType": "Usdc", + "type": "usdc", + "version": "1.5.1" + }, "symbol": "USDC", "tokenAddress": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E" }, @@ -6203,8 +8839,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD Coin", - "poolAddress": "0xff170aD8f1d86eFAC90CA7a2E1204bA64aC5e0f9", - "poolType": "burnMint", + "pool": { + "address": "0xff170aD8f1d86eFAC90CA7a2E1204bA64aC5e0f9", + "rawType": "usdc", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USDC", "tokenAddress": "0xf8C374CE88A3BE3d374e8888349C7768B607c755" }, @@ -6212,8 +8852,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Bridged USDC (BOB)", - "poolAddress": "0x554652E7F10fB8aa3e12226213c6826F98B09CF0", - "poolType": "burnMint", + "pool": { + "address": "0x554652E7F10fB8aa3e12226213c6826F98B09CF0", + "rawType": "usdc", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USDC.e", "tokenAddress": "0xe75D0fB2C24A55cA1e3F96781a2bCC7bdba058F0" }, @@ -6221,8 +8865,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD Coin", - "poolAddress": "0x40530f5305d6Fd6912925C5ec2C36453B85d8F5f", - "poolType": "usdc", + "pool": { + "address": "0x40530f5305d6Fd6912925C5ec2C36453B85d8F5f", + "rawType": "Usdc", + "type": "usdc", + "version": "1.5.1" + }, "symbol": "USDC", "tokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831" }, @@ -6230,8 +8878,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD Coin", - "poolAddress": "0x6378c36C44B28f4d1513e7a5510A8481a23eecda", - "poolType": "usdc", + "pool": { + "address": "0x6378c36C44B28f4d1513e7a5510A8481a23eecda", + "rawType": "Usdc", + "type": "usdc", + "version": "1.5.0" + }, "symbol": "USDC", "tokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" }, @@ -6239,8 +8891,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD Coin", - "poolAddress": "0xE67E30B1b4F80A35852488757C3efc093903651A", - "poolType": "usdc", + "pool": { + "address": "0xE67E30B1b4F80A35852488757C3efc093903651A", + "rawType": "Usdc", + "type": "usdc", + "version": "1.6.1" + }, "symbol": "USDC", "tokenAddress": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85" }, @@ -6248,8 +8904,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USDC", - "poolAddress": "0xf58A2e303e519f6A1b772137995871967e30391a", - "poolType": "usdc", + "pool": { + "address": "0xf58A2e303e519f6A1b772137995871967e30391a", + "rawType": "Usdc", + "type": "usdc", + "version": "1.5.1" + }, "symbol": "USDC", "tokenAddress": "0x078D782b760474a361dDA0AF3839290b0EF57AD6" }, @@ -6257,8 +8917,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD Coin", - "poolAddress": "0x03D19033AdA17750D5BC2d8E325337D0748F9FEF", - "poolType": "usdc", + "pool": { + "address": "0x03D19033AdA17750D5BC2d8E325337D0748F9FEF", + "rawType": "Usdc", + "type": "usdc", + "version": "1.5.0" + }, "symbol": "USDC", "tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }, @@ -6266,8 +8930,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD Coin", - "poolAddress": "0x60A97bd9ACf755954Ff0fE85837224f2920a57F3", - "poolType": "usdc", + "pool": { + "address": "0x60A97bd9ACf755954Ff0fE85837224f2920a57F3", + "rawType": "Usdc", + "type": "usdc", + "version": "1.6.1" + }, "symbol": "USDC", "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359" }, @@ -6275,8 +8943,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD Coin", - "poolAddress": "0xe26D9c68cF6d284367C5e90EC834C6Ec0051f73C", - "poolType": "burnMint", + "pool": { + "address": "0xe26D9c68cF6d284367C5e90EC834C6Ec0051f73C", + "rawType": "usdc", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USDC", "tokenAddress": "0x0B7007c13325C48911F73A2daD5FA5dCBf808aDc" }, @@ -6284,8 +8956,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD Coin", - "poolAddress": "Gog2wHG7KS8St26d1fPrgNFtta6HK8Xza7SSHzgbWPr5", - "poolType": "usdc", + "pool": { + "address": "Gog2wHG7KS8St26d1fPrgNFtta6HK8Xza7SSHzgbWPr5", + "rawType": "Usdc", + "type": "usdc", + "version": "1.5.0" + }, "symbol": "USDC", "tokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" }, @@ -6293,8 +8969,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Bridged USDC", - "poolAddress": "0x5937c7096b054564c6F17B7e61D9Abf1256B0593", - "poolType": "burnMint", + "pool": { + "address": "0x5937c7096b054564c6F17B7e61D9Abf1256B0593", + "rawType": "usdc", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USDC.e", "tokenAddress": "0x44bB111010DfFfb3695F9a1B66aa879976199e7b" } @@ -6304,8 +8984,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Falcon USD", - "poolAddress": "0x4b66431F9E5f5Cd026ae48E617902207b43048D4", - "poolType": "burnMint", + "pool": { + "address": "0x4b66431F9E5f5Cd026ae48E617902207b43048D4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "USDf", "tokenAddress": "0xb3b02E4A9Fb2bD28CC2ff97B0aB3F6B3Ec1eE9D2" }, @@ -6313,8 +8997,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Falcon USD", - "poolAddress": "0xEcf61D6fAA3B9faE7195AF3bc9891450C1733f78", - "poolType": "lockRelease", + "pool": { + "address": "0xEcf61D6fAA3B9faE7195AF3bc9891450C1733f78", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "USDf", "tokenAddress": "0xFa2B947eEc368f42195f24F36d2aF29f7c24CeC2" }, @@ -6322,8 +9010,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Falcon USD", - "poolAddress": "0x33570299e0D73f07c82d005DE75De54cf4582FCC", - "poolType": "burnMint", + "pool": { + "address": "0x33570299e0D73f07c82d005DE75De54cf4582FCC", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USDf", "tokenAddress": "0x8210c0634AB8f273806e4b7866E9Db353773c44B" } @@ -6333,8 +9025,12 @@ "allowListEnabled": false, "decimals": 18, "name": "USDFI", - "poolAddress": "0xDB96110a1d4c447055c71227CE5908AF859c1015", - "poolType": "burnMint", + "pool": { + "address": "0xDB96110a1d4c447055c71227CE5908AF859c1015", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USDFI", "tokenAddress": "0xC9f5955f6dA20e44A068f3d58FB2404f56f9a6f2" }, @@ -6342,8 +9038,12 @@ "allowListEnabled": false, "decimals": 18, "name": "USDFI", - "poolAddress": "0x28B57510597c1629ec76f95A2DAcD579e18f1436", - "poolType": "burnMint", + "pool": { + "address": "0x28B57510597c1629ec76f95A2DAcD579e18f1436", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USDFI", "tokenAddress": "0x249c48e22E95514Ca975De31f473F30c2f3C0916" }, @@ -6351,8 +9051,12 @@ "allowListEnabled": false, "decimals": 18, "name": "USDFI", - "poolAddress": "0xE727F7975bEF908C49D0591724669F05F7dAd811", - "poolType": "burnMint", + "pool": { + "address": "0xE727F7975bEF908C49D0591724669F05F7dAd811", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "USDFI", "tokenAddress": "0xa7a0B3Fe94121E366D774d60D075F6386F750884" } @@ -6362,8 +9066,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Mountain Protocol USD", - "poolAddress": "0x6a1252A0e3100fDFC3Fe65aE43D6829b6d2125Ba", - "poolType": "burnMint", + "pool": { + "address": "0x6a1252A0e3100fDFC3Fe65aE43D6829b6d2125Ba", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USDM", "tokenAddress": "0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C" }, @@ -6371,8 +9079,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Mountain Protocol USD", - "poolAddress": "0x0723Bd0CE11cCFFa3D8bd1649011195fD38EF21E", - "poolType": "burnMint", + "pool": { + "address": "0x0723Bd0CE11cCFFa3D8bd1649011195fD38EF21E", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USDM", "tokenAddress": "0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C" }, @@ -6380,8 +9092,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Mountain Protocol USD", - "poolAddress": "0x4109f7E577596432458F8D4DC2E78637428D5614", - "poolType": "burnMint", + "pool": { + "address": "0x4109f7E577596432458F8D4DC2E78637428D5614", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USDM", "tokenAddress": "0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C" }, @@ -6389,8 +9105,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Mountain Protocol USD", - "poolAddress": "0x028A4Caa308883170C024AcfC367B8B627EceeCb", - "poolType": "burnMint", + "pool": { + "address": "0x028A4Caa308883170C024AcfC367B8B627EceeCb", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USDM", "tokenAddress": "0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C" }, @@ -6398,8 +9118,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Mountain Protocol USD", - "poolAddress": "0x70139902BC147754221FD59DFf8f8A16b34876F8", - "poolType": "burnMint", + "pool": { + "address": "0x70139902BC147754221FD59DFf8f8A16b34876F8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USDM", "tokenAddress": "0x7715c206A14Ac93Cb1A6c0316A6E5f8aD7c9Dc31" }, @@ -6407,8 +9131,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Mountain Protocol USD", - "poolAddress": "0x4109f7E577596432458F8D4DC2E78637428D5614", - "poolType": "burnMint", + "pool": { + "address": "0x4109f7E577596432458F8D4DC2E78637428D5614", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USDM", "tokenAddress": "0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C" }, @@ -6416,8 +9144,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Mountain Protocol USD", - "poolAddress": "0xA2492283F3016b078129290BAf5293Aea4f9ae48", - "poolType": "burnMint", + "pool": { + "address": "0xA2492283F3016b078129290BAf5293Aea4f9ae48", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "USDM", "tokenAddress": "0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C" } @@ -6427,8 +9159,12 @@ "allowListEnabled": false, "decimals": 18, "name": "OpenEden Open Dollar", - "poolAddress": "0x500d4882938020E939a5666c1B4200873da7EfD3", - "poolType": "burnMint", + "pool": { + "address": "0x500d4882938020E939a5666c1B4200873da7EfD3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USDO", "tokenAddress": "0x302e52AFf9815B9D1682473DBFB9C74F9B750AA8" }, @@ -6436,8 +9172,12 @@ "allowListEnabled": false, "decimals": 18, "name": "OpenEden Open Dollar", - "poolAddress": "0x500d4882938020E939a5666c1B4200873da7EfD3", - "poolType": "burnMint", + "pool": { + "address": "0x500d4882938020E939a5666c1B4200873da7EfD3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USDO", "tokenAddress": "0xaD55aebc9b8c03FC43cd9f62260391c13c23e7c0" }, @@ -6445,8 +9185,12 @@ "allowListEnabled": false, "decimals": 18, "name": "OpenEden Open Dollar", - "poolAddress": "0x017566aAD2C164011b9c6552Df3Eb7a8c5c11590", - "poolType": "burnMint", + "pool": { + "address": "0x017566aAD2C164011b9c6552Df3Eb7a8c5c11590", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "USDO", "tokenAddress": "0x87e617C7484aDE79FcD90db58BEB82B057facb48" }, @@ -6454,8 +9198,12 @@ "allowListEnabled": false, "decimals": 18, "name": "OpenEden Open Dollar", - "poolAddress": "0x500d4882938020E939a5666c1B4200873da7EfD3", - "poolType": "burnMint", + "pool": { + "address": "0x500d4882938020E939a5666c1B4200873da7EfD3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USDO", "tokenAddress": "0x8238884Ec9668Ef77B90C6dfF4D1a9F4F4823BFe" } @@ -6465,8 +9213,12 @@ "allowListEnabled": false, "decimals": 6, "name": "OpenUSDT", - "poolAddress": "0xd7502CaBdb70c79382deF58FB6df3CdA69cb2A1b", - "poolType": "burnMint", + "pool": { + "address": "0xd7502CaBdb70c79382deF58FB6df3CdA69cb2A1b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "oUSDT", "tokenAddress": "0x1217BfE6c773EEC6cc4A38b5Dc45B92292B6E189" }, @@ -6474,8 +9226,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Tether USD", - "poolAddress": "0x2c3D51c7B454cB045C8cEc92d2F9E717C7519106", - "poolType": "burnMint", + "pool": { + "address": "0x2c3D51c7B454cB045C8cEc92d2F9E717C7519106", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USDT", "tokenAddress": "0xfe9f969faf8Ad72a83b761138bF25dE87eFF9DD2" }, @@ -6483,8 +9239,12 @@ "allowListEnabled": false, "decimals": 6, "name": "OpenUSDT", - "poolAddress": "0xAFEd606Bd2CAb6983fC6F10167c98aaC2173D77f", - "poolType": "burnMint", + "pool": { + "address": "0xAFEd606Bd2CAb6983fC6F10167c98aaC2173D77f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "oUSDT", "tokenAddress": "0x1217BfE6c773EEC6cc4A38b5Dc45B92292B6E189" }, @@ -6492,8 +9252,12 @@ "allowListEnabled": false, "decimals": 6, "name": "OpenUSDT", - "poolAddress": "0x0EEFa8b75587bcD4A909a0F3c36180D4441481a0", - "poolType": "burnMint", + "pool": { + "address": "0x0EEFa8b75587bcD4A909a0F3c36180D4441481a0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "oUSDT", "tokenAddress": "0x1217BfE6c773EEC6cc4A38b5Dc45B92292B6E189" }, @@ -6501,8 +9265,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Tether USD", - "poolAddress": "0x47Db76c9c97F4bcFd54D8872FDb848Cab696092d", - "poolType": "burnMint", + "pool": { + "address": "0x47Db76c9c97F4bcFd54D8872FDb848Cab696092d", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USD₮", "tokenAddress": "0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e" }, @@ -6510,8 +9278,12 @@ "allowListEnabled": false, "decimals": 6, "name": "OpenUSDT", - "poolAddress": "0xa760D20a91C076A57b270D3F7a3150421ab40591", - "poolType": "burnMint", + "pool": { + "address": "0xa760D20a91C076A57b270D3F7a3150421ab40591", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "oUSDT", "tokenAddress": "0x1217BfE6c773EEC6cc4A38b5Dc45B92292B6E189" }, @@ -6519,8 +9291,12 @@ "allowListEnabled": false, "decimals": 6, "name": "OpenUSDT", - "poolAddress": "0x55aeb80Aa6Ab34aA83E1F387903F8Bb2Aa9e2F2d", - "poolType": "burnMint", + "pool": { + "address": "0x55aeb80Aa6Ab34aA83E1F387903F8Bb2Aa9e2F2d", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "oUSDT", "tokenAddress": "0x1217BfE6c773EEC6cc4A38b5Dc45B92292B6E189" }, @@ -6528,8 +9304,12 @@ "allowListEnabled": false, "decimals": 6, "name": "OpenUSDT", - "poolAddress": "0x6a21a19aD44542d83F7f7FF45Aa31A62a36200de", - "poolType": "burnMint", + "pool": { + "address": "0x6a21a19aD44542d83F7f7FF45Aa31A62a36200de", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "oUSDT", "tokenAddress": "0x1217BfE6c773EEC6cc4A38b5Dc45B92292B6E189" }, @@ -6537,8 +9317,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Tether USD", - "poolAddress": "0xa3532633401AbFfbd15e6be825a45FB7F141469B", - "poolType": "lockRelease", + "pool": { + "address": "0xa3532633401AbFfbd15e6be825a45FB7F141469B", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "USDT", "tokenAddress": "0xdAC17F958D2ee523a2206206994597C13D831ec7" }, @@ -6546,8 +9330,12 @@ "allowListEnabled": false, "decimals": 6, "name": "OpenUSDT", - "poolAddress": "0x6a21a19aD44542d83F7f7FF45Aa31A62a36200de", - "poolType": "burnMint", + "pool": { + "address": "0x6a21a19aD44542d83F7f7FF45Aa31A62a36200de", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "oUSDT", "tokenAddress": "0x1217BfE6c773EEC6cc4A38b5Dc45B92292B6E189" } @@ -6557,8 +9345,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USELESS COIN", - "poolAddress": "0x6378c36C44B28f4d1513e7a5510A8481a23eecda", - "poolType": "burnMint", + "pool": { + "address": "0x6378c36C44B28f4d1513e7a5510A8481a23eecda", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USELESS", "tokenAddress": "0xbA38B3C706f7A515Ff7C8Db04Daa0A134eC46D2b" }, @@ -6566,8 +9358,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USELESS COIN", - "poolAddress": "Aunb4sACHkdsqvb5eDHngkPLNLhnA42YUMosFMYDV5pG", - "poolType": "lockRelease", + "pool": { + "address": "Aunb4sACHkdsqvb5eDHngkPLNLhnA42YUMosFMYDV5pG", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "USELESS", "tokenAddress": "Dz9mQ9NzkBcCsuGPFJ3r1bS4wgqKMHBPiVuniW8Mbonk" } @@ -6577,8 +9373,12 @@ "allowListEnabled": false, "decimals": 18, "name": "USUAL", - "poolAddress": "0x30Ea2d525eF7C234F8AA6E3a8909B88f71244cB0", - "poolType": "burnMint", + "pool": { + "address": "0x30Ea2d525eF7C234F8AA6E3a8909B88f71244cB0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "USUAL", "tokenAddress": "0x4ACD4D03af6F9cc0fB7C5f0868B7b6287D7969c5" }, @@ -6586,8 +9386,12 @@ "allowListEnabled": false, "decimals": 18, "name": "USUAL", - "poolAddress": "0x30Ea2d525eF7C234F8AA6E3a8909B88f71244cB0", - "poolType": "burnMint", + "pool": { + "address": "0x30Ea2d525eF7C234F8AA6E3a8909B88f71244cB0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "USUAL", "tokenAddress": "0x4ACD4D03af6F9cc0fB7C5f0868B7b6287D7969c5" }, @@ -6595,8 +9399,12 @@ "allowListEnabled": false, "decimals": 18, "name": "USUAL", - "poolAddress": "0x72a0203b731EdECE2DdAa506a048c0378C44366a", - "poolType": "lockRelease", + "pool": { + "address": "0x72a0203b731EdECE2DdAa506a048c0378C44366a", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "USUAL", "tokenAddress": "0xC4441c2BE5d8fA8126822B9929CA0b81Ea0DE38E" } @@ -6606,8 +9414,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USX Stablecoin", - "poolAddress": "0x193Beb1E11731B8B740b9fbbB62655553c3b4A25", - "poolType": "burnMint", + "pool": { + "address": "0x193Beb1E11731B8B740b9fbbB62655553c3b4A25", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "USX", "tokenAddress": "0xad1493B01ced4fAAc409124E667b95259F12fb05" }, @@ -6615,8 +9427,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USX", - "poolAddress": "BhqsAa1yib3KqRTDX9WfyuKQtwikoUiDNJTLYgNwBtR6", - "poolType": "lockRelease", + "pool": { + "address": "BhqsAa1yib3KqRTDX9WfyuKQtwikoUiDNJTLYgNwBtR6", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "USX", "tokenAddress": "6FrrzDk5mQARGc1TDYoyVnSyRdds1t4PbtohCD6p3tgG" } @@ -6626,8 +9442,12 @@ "allowListEnabled": false, "decimals": 18, "name": "VOOI", - "poolAddress": "0x4D275A287B86E423E01CceE66F4e3313B5F47Cf7", - "poolType": "burnMint", + "pool": { + "address": "0x4D275A287B86E423E01CceE66F4e3313B5F47Cf7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "VOOI", "tokenAddress": "0x876cEcb73c9ED1B1526F8e35C6a5a51a31BCF341" }, @@ -6635,8 +9455,12 @@ "allowListEnabled": false, "decimals": 18, "name": "VOOI", - "poolAddress": "0x8B8461F822FDb00943C2c7d42aa17e1CDd5626F1", - "poolType": "lockRelease", + "pool": { + "address": "0x8B8461F822FDb00943C2c7d42aa17e1CDd5626F1", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "VOOI", "tokenAddress": "0xb31561F0e2aaC72406103b1926356D756F07A481" } @@ -6646,8 +9470,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Vertex", - "poolAddress": "0xF68fC9ccE79df9719c9801d345fFA38ecDCcad35", - "poolType": "burnMint", + "pool": { + "address": "0xF68fC9ccE79df9719c9801d345fFA38ecDCcad35", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "VRTX", "tokenAddress": "0xFd91eD44Fc13f7FAFF758FE6d339d5790C4a85eC" }, @@ -6655,8 +9483,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Vertex", - "poolAddress": "0x387E40Ed22Ee3396288c874411B00C48f6978653", - "poolType": "lockRelease", + "pool": { + "address": "0x387E40Ed22Ee3396288c874411B00C48f6978653", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "VRTX", "tokenAddress": "0x95146881b86B3ee99e63705eC87AfE29Fcc044D9" }, @@ -6664,8 +9496,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Vertex", - "poolAddress": "0xCaf4E8ED1cbdD5FB9B1359e98d9185dafE01B943", - "poolType": "burnMint", + "pool": { + "address": "0xCaf4E8ED1cbdD5FB9B1359e98d9185dafE01B943", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "VRTX", "tokenAddress": "0xFB0c734Fc3008683c5efF45bcf8128836C4D97D0" }, @@ -6673,8 +9509,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Vertex", - "poolAddress": "0xdF7F1eb75E0Ae7E4867F06dF3344abcd852C6D23", - "poolType": "burnMint", + "pool": { + "address": "0xdF7F1eb75E0Ae7E4867F06dF3344abcd852C6D23", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "VRTX", "tokenAddress": "0x6CD20f11470e9C9d1458a69c8f7B330B99577EF9" }, @@ -6682,8 +9522,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Vertex", - "poolAddress": "0x06Aa321d88e5bc62Ca86c54342cAeFa6F19FE526", - "poolType": "burnMint", + "pool": { + "address": "0x06Aa321d88e5bc62Ca86c54342cAeFa6F19FE526", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "VRTX", "tokenAddress": "0xd0728F5b1F53A834F8dcd1B86f62CeB8726eb0a0" }, @@ -6691,8 +9535,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Vertex", - "poolAddress": "0x826Ba9cF4FE04c73A9750aD88B21b6daCb456516", - "poolType": "burnMint", + "pool": { + "address": "0x826Ba9cF4FE04c73A9750aD88B21b6daCb456516", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "VRTX", "tokenAddress": "0x5B8034F6346A81a1387EA21CDD36c48f6e05eb5f" }, @@ -6700,8 +9548,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Vertex", - "poolAddress": "0x293325B3AacE7322BeB03400e302612A2FC5A4E8", - "poolType": "burnMint", + "pool": { + "address": "0x293325B3AacE7322BeB03400e302612A2FC5A4E8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "VRTX", "tokenAddress": "0xAd747e3CF4e31B8897B96C81C6C74152De52f614" } @@ -6711,8 +9563,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Vision", - "poolAddress": "0x649f03D6F7ac74F6C13733212Aa5419c890d2db6", - "poolType": "burnMint", + "pool": { + "address": "0x649f03D6F7ac74F6C13733212Aa5419c890d2db6", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "VSN", "tokenAddress": "0x699Ccf919C1dfdFa4C374292f42CAdC9899BF753" }, @@ -6720,8 +9576,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Vision", - "poolAddress": "0x96db781A7EF341dA5ca348Ece4B824b3AdC71D55", - "poolType": "burnMint", + "pool": { + "address": "0x96db781A7EF341dA5ca348Ece4B824b3AdC71D55", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "VSN", "tokenAddress": "0x6fBBbD8bFB1cd3986B1D05e7861a0f62F87DB74b" }, @@ -6729,8 +9589,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Vision", - "poolAddress": "0x1bb58BA8B6fc5a779EDB2D6421c330d464183c08", - "poolType": "burnMint", + "pool": { + "address": "0x1bb58BA8B6fc5a779EDB2D6421c330d464183c08", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "VSN", "tokenAddress": "0x31185950db028eCFc70DF6a35a4B552462A35773" }, @@ -6738,8 +9602,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Vision", - "poolAddress": "0x3DAa89A5AB49DBa691FEA66EB89aC8Cf8BeE2e35", - "poolType": "burnMint", + "pool": { + "address": "0x3DAa89A5AB49DBa691FEA66EB89aC8Cf8BeE2e35", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "VSN", "tokenAddress": "0x699Ccf919C1dfdFa4C374292f42CAdC9899BF753" } @@ -6749,8 +9617,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped 0G", - "poolAddress": "0xF6839B313671daE8c1B6AbCaB4eBd0bF41259187", - "poolType": "lockRelease", + "pool": { + "address": "0xF6839B313671daE8c1B6AbCaB4eBd0bF41259187", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "W0G", "tokenAddress": "0x1Cd0690fF9a693f5EF2dD976660a8dAFc81A109c" }, @@ -6758,8 +9630,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped 0G", - "poolAddress": "0x22fF19A7307eee6bd6d38C569f8bcb40fD071Ff4", - "poolType": "burnMint", + "pool": { + "address": "0x22fF19A7307eee6bd6d38C569f8bcb40fD071Ff4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "W0G", "tokenAddress": "0x418176040912d11d9445dd4AEc322772A42f2a59" }, @@ -6767,8 +9643,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped 0G", - "poolAddress": "0x049DF7Ed53037C58BCAB45510c153D5CD5564830", - "poolType": "burnMint", + "pool": { + "address": "0x049DF7Ed53037C58BCAB45510c153D5CD5564830", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "W0G", "tokenAddress": "0x23cd099eB438CcA50349EE2BC809196b1ae00861" }, @@ -6776,8 +9656,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped 0G", - "poolAddress": "0xE25a97E9e2f1Eeee81d4a7986A018AC3Ae8D857b", - "poolType": "burnMint", + "pool": { + "address": "0xE25a97E9e2f1Eeee81d4a7986A018AC3Ae8D857b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "W0G", "tokenAddress": "0x4C1Dab3Be86347977F3DfC4b9688224ef2272939" } @@ -6787,7 +9671,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped AB", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WAB", "tokenAddress": "0x51dA03503FBBA94B9d0D88C15690D840F02F15F4" } @@ -6797,7 +9685,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped ApeCoin", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WAPE", "tokenAddress": "0x48b62137EdfA95a428D35C09E44256a739F6B557" } @@ -6807,8 +9699,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Astar Token", - "poolAddress": "0x98ef4B1Fe8fe9C73Deb07a77c9f861E8558439d7", - "poolType": "burnMint", + "pool": { + "address": "0x98ef4B1Fe8fe9C73Deb07a77c9f861E8558439d7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "ASTR", "tokenAddress": "0xF27441230EADEaC85B764610325Cc9a0D7859689" }, @@ -6816,8 +9712,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped ASTR", - "poolAddress": "0x99B41d3e1529dF578f02d68c0c11a0Ca89a522d0", - "poolType": "lockRelease", + "pool": { + "address": "0x99B41d3e1529dF578f02d68c0c11a0Ca89a522d0", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "WASTR", "tokenAddress": "0x37795FdD8C165CaB4D6c05771D564d80439CD093" }, @@ -6825,8 +9725,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Astar Token", - "poolAddress": "0x2200B5f4fA30a55359Ef0FaE04890113BD73bd16", - "poolType": "burnMint", + "pool": { + "address": "0x2200B5f4fA30a55359Ef0FaE04890113BD73bd16", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "ASTR", "tokenAddress": "0x2CAE934a1e84F693fbb78CA5ED3B0A6893259441" } @@ -6836,7 +9740,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped AVAX", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WAVAX", "tokenAddress": "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7" } @@ -6846,7 +9754,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Bera", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WBERA", "tokenAddress": "0x6969696969696969696969696969696969696969" } @@ -6856,7 +9768,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped BNB", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WBNB", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -6864,7 +9780,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped BNB", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WBNB", "tokenAddress": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c" } @@ -6874,7 +9794,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Shibarium Wrapped BONE", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WBONE", "tokenAddress": "0xC76F4c819D820369Fb2d7C1531aB3Bb18e6fE8d8" } @@ -6884,7 +9808,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped BTC", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WBTC", "tokenAddress": "0xfF204e2681A6fA0e2C3FaDe68a1B28fb90E4Fc5F" }, @@ -6892,7 +9820,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped BTC", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WBTC", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -6900,7 +9832,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped BTC", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WBTC", "tokenAddress": "0xF6D226f9Dc15d9bB51182815b320D3fBE324e1bA" }, @@ -6908,8 +9844,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Wrapped BTC", - "poolAddress": "0xF6698064776D521b0AFE469F30C40B39B4875b93", - "poolType": "lockRelease", + "pool": { + "address": "0xF6698064776D521b0AFE469F30C40B39B4875b93", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "WBTC", "tokenAddress": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599" }, @@ -6917,8 +9857,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Wrapped Bitcoin", - "poolAddress": "0x57C6e9E48476B4d08CeAc0ba885D34f7dE71F323", - "poolType": "burnMint", + "pool": { + "address": "0x57C6e9E48476B4d08CeAc0ba885D34f7dE71F323", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "WBTC", "tokenAddress": "0xCa3Eb64F3DFd7861C76070e3d1492eE5ee20cdC3" } @@ -6928,7 +9872,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Bitcorn", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WBTCN", "tokenAddress": "0xda5dDd7270381A7C2717aD10D1c0ecB19e3CDFb2" } @@ -6938,7 +9886,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Celo", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WCELO", "tokenAddress": "0x2021B12D8138e2D63cF0895eccABC0DFc92416c6" } @@ -6948,7 +9900,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped CORE", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WCORE", "tokenAddress": "0x40375C92d9FAf44d2f9db9Bd9ba41a3317a2404f" } @@ -6958,7 +9914,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped CRO", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WCRO", "tokenAddress": "0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23" } @@ -6968,8 +9928,12 @@ "allowListEnabled": false, "decimals": 18, "name": "WECOIN", - "poolAddress": "0x9766a4A5c1F7Eacc5D9aAc1086aec62137e81596", - "poolType": "lockRelease", + "pool": { + "address": "0x9766a4A5c1F7Eacc5D9aAc1086aec62137e81596", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "WECO", "tokenAddress": "0x5d37ABAFd5498B0E7af753a2E83bd4F0335AA89F" }, @@ -6977,8 +9941,12 @@ "allowListEnabled": false, "decimals": 18, "name": "WECOIN", - "poolAddress": "0xf327989Ad11388B1fd943C29eE12ba0ed06f5180", - "poolType": "burnMint", + "pool": { + "address": "0xf327989Ad11388B1fd943C29eE12ba0ed06f5180", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "WECO", "tokenAddress": "0x44ca3E3649Bf8a905b6B07133BaAc43F1A00fa34" }, @@ -6986,8 +9954,12 @@ "allowListEnabled": false, "decimals": 18, "name": "WECOIN", - "poolAddress": "0x8aC68225b0E80cF7f16EA67639b455d679a158d7", - "poolType": "burnMint", + "pool": { + "address": "0x8aC68225b0E80cF7f16EA67639b455d679a158d7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "WECO", "tokenAddress": "0x54Df3076ac0CdC9bC97fA290AB9c5a88E3D23630" }, @@ -6995,8 +9967,12 @@ "allowListEnabled": false, "decimals": 18, "name": "WECOIN", - "poolAddress": "0x6e2910e4eCFE573a8e351AdAe4a0d9F095a793CC", - "poolType": "burnMint", + "pool": { + "address": "0x6e2910e4eCFE573a8e351AdAe4a0d9F095a793CC", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "WECO", "tokenAddress": "0x7200e56E62543Ecdba7a7f60A25e305BB88304B5" } @@ -7006,7 +9982,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x3439153EB7AF838Ad19d56E1571FBD09333C2809" }, @@ -7014,8 +9994,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Ethereum Token", - "poolAddress": "0xe96cC12AA0E2e545621bcbE1E035D91a7871fE8f", - "poolType": "burnMint", + "pool": { + "address": "0xe96cC12AA0E2e545621bcbE1E035D91a7871fE8f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "ETH", "tokenAddress": "0xEf63d4E178b3180BeEc9B0E143e0f37F4c93f4C2" }, @@ -7023,7 +10007,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7031,8 +10019,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolAddress": "0xb3deA004d4d23b543934DfFb884d699Ee7C99269", - "poolType": "lockRelease", + "pool": { + "address": "0xb3deA004d4d23b543934DfFb884d699Ee7C99269", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1" }, @@ -7040,8 +10032,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolAddress": "0x0bEB0e87661a15cEEa56D8B7ED99e583459F48bA", - "poolType": "lockRelease", + "pool": { + "address": "0x0bEB0e87661a15cEEa56D8B7ED99e583459F48bA", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7049,7 +10045,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x4300000000000000000000000000000000000004" }, @@ -7057,7 +10057,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7065,8 +10069,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolAddress": "0x538dBDcC6902c3fbE109261833c77FA77e8e7f60", - "poolType": "lockRelease", + "pool": { + "address": "0x538dBDcC6902c3fbE109261833c77FA77e8e7f60", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f" }, @@ -7074,7 +10082,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7082,8 +10094,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolAddress": "0x0bEB0e87661a15cEEa56D8B7ED99e583459F48bA", - "poolType": "lockRelease", + "pool": { + "address": "0x0bEB0e87661a15cEEa56D8B7ED99e583459F48bA", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7091,7 +10107,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9" }, @@ -7099,7 +10119,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x5300000000000000000000000000000000000004" }, @@ -7107,7 +10131,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0xA51894664A773981C6C112C43ce576f315d5b1B6" }, @@ -7115,7 +10143,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7123,7 +10155,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7131,7 +10167,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7139,7 +10179,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91" }, @@ -7147,7 +10191,11 @@ "allowListEnabled": false, "decimals": 18, "name": "WETH", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x2e31ebD2eB114943630Db6ba8c7f7687bdA5835F" }, @@ -7155,7 +10203,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7163,7 +10215,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0xeA29Cbb2808CF848C185E4405Bb002F53f92a241" }, @@ -7171,7 +10227,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7179,8 +10239,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolAddress": "0x011Ef1fe26D20077A59F38e9Ad155b166AD87D40", - "poolType": "lockRelease", + "pool": { + "address": "0x011Ef1fe26D20077A59F38e9Ad155b166AD87D40", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" }, @@ -7188,7 +10252,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x086917568f9317b68595B7552842de816698D7BD" }, @@ -7196,7 +10264,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7204,7 +10276,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x3902228D6A3d2Dc44731fD9d45FeE6a61c722D0b" }, @@ -7212,7 +10288,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7220,7 +10300,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x5300000000000000000000000000000000000011" }, @@ -7228,7 +10312,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Vault Bridge ETH", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "vbETH", "tokenAddress": "0xEE7D8BCFb72bC1880D0Cf19822eB0A2e6577aB62" }, @@ -7236,8 +10324,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Ronin Wrapped Ether", - "poolAddress": "0x16d313Bd248Bf3A9513719c1A9d188FE7Ff65cF8", - "poolType": "burnMint", + "pool": { + "address": "0x16d313Bd248Bf3A9513719c1A9d188FE7Ff65cF8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0xc99a6A985eD2Cac1ef41640596C5A5f9F4E19Ef5" }, @@ -7245,7 +10337,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7253,7 +10349,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -7261,7 +10361,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" } @@ -7271,8 +10375,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Wrapped Fragmetric Restaked SOL", - "poolAddress": "0x414024b789097c9a81Ec2D34f95B009718f44365", - "poolType": "burnMint", + "pool": { + "address": "0x414024b789097c9a81Ec2D34f95B009718f44365", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "WFRAGSOL", "tokenAddress": "0x8624b87F9b766d82CdaDDE8Cf4192df76682F946" }, @@ -7280,8 +10388,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Wrapped Fragmetric Restaked SOL", - "poolAddress": "0x789428528A842053b52cd0D77692125829406712", - "poolType": "burnMint", + "pool": { + "address": "0x789428528A842053b52cd0D77692125829406712", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "WFRAGSOL", "tokenAddress": "0x8624b87F9b766d82CdaDDE8Cf4192df76682F946" }, @@ -7289,8 +10401,12 @@ "allowListEnabled": false, "decimals": 9, "name": "Wrapped Fragmetric Restaked SOL", - "poolAddress": "5a37uszDg5q34tvCpuFikEwSYiUWD78nPr3cUFsNQ2kK", - "poolType": "lockRelease", + "pool": { + "address": "5a37uszDg5q34tvCpuFikEwSYiUWD78nPr3cUFsNQ2kK", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "wfragSOL", "tokenAddress": "WFRGSWjaz8tbAxsJitmbfRuFV2mSNwy7BMWcCwaA28U" } @@ -7300,7 +10416,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Frax", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WFRAX", "tokenAddress": "0xFc00000000000000000000000000000000000002" } @@ -7310,7 +10430,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Gho Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WGHO", "tokenAddress": "0x6bDc36E20D267Ff0dd6097799f82e78907105e2F" } @@ -7320,7 +10444,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped gUSDT", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WgUSDT", "tokenAddress": "0x817997Ca8394E26CCE3dE3A076a4889b27DbF9dE" } @@ -7330,7 +10458,11 @@ "allowListEnabled": false, "decimals": 8, "name": "Wrapped HBAR", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WHBAR", "tokenAddress": "0xb1F616b8134F602c3Bb465fB5b5e6565cCAd37Ed" } @@ -7340,8 +10472,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wrapped HLP", - "poolAddress": "0x051665f2455116e929b9972c36d23070F5054Ce0", - "poolType": "lockRelease", + "pool": { + "address": "0x051665f2455116e929b9972c36d23070F5054Ce0", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "WHLP", "tokenAddress": "0x1359b05241cA5076c9F59605214f4F84114c0dE8" }, @@ -7349,8 +10485,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wrapped HLP", - "poolAddress": "JCPtaQkKFwBbjAfBbDrDF1wHpMfoEDEXJbwDfXvgs3j3", - "poolType": "burnMint", + "pool": { + "address": "JCPtaQkKFwBbjAfBbDrDF1wHpMfoEDEXJbwDfXvgs3j3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "wHLP", "tokenAddress": "wHLPX7ChYUnbR5G8JKqPjZyeLwSY8Mdo4kXZpQubRnJ" } @@ -7360,8 +10500,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped HSK", - "poolAddress": "0xaF6db93135F5820201e9E9b048Dd5e7Ef3dCf866", - "poolType": "burnMint", + "pool": { + "address": "0xaF6db93135F5820201e9E9b048Dd5e7Ef3dCf866", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "WHSK", "tokenAddress": "0xC080b24a11fdAaf01548e384757b4c905993aF1a" }, @@ -7369,8 +10513,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped HSK", - "poolAddress": "0x71821F883E8f8F4D17889bF1E0bF548c2CFD9096", - "poolType": "burnMint", + "pool": { + "address": "0x71821F883E8f8F4D17889bF1E0bF548c2CFD9096", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "WHSK", "tokenAddress": "0x54b92Ae9C9b8ce75fa958191649bC20B7e6c54C7" }, @@ -7378,8 +10526,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped HSK", - "poolAddress": "0x0B004c8e028495dC94e53e432810FAa4E66EfEe1", - "poolType": "lockRelease", + "pool": { + "address": "0x0B004c8e028495dC94e53e432810FAa4E66EfEe1", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "WHSK", "tokenAddress": "0xB210D2120d57b758EE163cFfb43e73728c471Cf1" } @@ -7389,8 +10541,12 @@ "allowListEnabled": false, "decimals": 18, "name": "why", - "poolAddress": "0x5156b61beb12eCdbB6caA4a49f41Db2203943702", - "poolType": "lockRelease", + "pool": { + "address": "0x5156b61beb12eCdbB6caA4a49f41Db2203943702", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "WHY", "tokenAddress": "0x9eC02756A559700d8D9e79ECe56809f7bcC5dC27" }, @@ -7398,8 +10554,12 @@ "allowListEnabled": false, "decimals": 18, "name": "why", - "poolAddress": "0xf00986Ebb280A1B06bfDA84700ff4cEc9696E8c0", - "poolType": "burnMint", + "pool": { + "address": "0xf00986Ebb280A1B06bfDA84700ff4cEc9696E8c0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "WHY", "tokenAddress": "0x9eC02756A559700d8D9e79ECe56809f7bcC5dC27" }, @@ -7407,8 +10567,12 @@ "allowListEnabled": false, "decimals": 18, "name": "why", - "poolAddress": "0xCfee3d8CBc7dFdea23608E73b48B1b83Af8603a9", - "poolType": "burnMint", + "pool": { + "address": "0xCfee3d8CBc7dFdea23608E73b48B1b83Af8603a9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "WHY", "tokenAddress": "0x9eC02756A559700d8D9e79ECe56809f7bcC5dC27" } @@ -7418,7 +10582,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped HYPE", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WHYPE", "tokenAddress": "0x5555555555555555555555555555555555555555" } @@ -7428,7 +10596,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Klay", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WKLAY", "tokenAddress": "0x19Aac5f612f524B754CA7e7c41cbFa2E981A4432" } @@ -7438,8 +10610,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Worldcoin", - "poolAddress": "0xc751E86208F0F8aF2d5CD0e29716cA7AD98B5eF5", - "poolType": "lockRelease", + "pool": { + "address": "0xc751E86208F0F8aF2d5CD0e29716cA7AD98B5eF5", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "WLD", "tokenAddress": "0x2cFc85d8E48F8EAB294be644d9E25C3030863003" }, @@ -7447,8 +10623,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Worldcoin", - "poolAddress": "0x10c9a3c76bDbDB8600d726De621b941fd26F6058", - "poolType": "lockRelease", + "pool": { + "address": "0x10c9a3c76bDbDB8600d726De621b941fd26F6058", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "WLD", "tokenAddress": "0x163f8C2467924be0ae7B5347228CABF260318753" } @@ -7458,8 +10638,12 @@ "allowListEnabled": false, "decimals": 18, "name": "World Liberty Financial", - "poolAddress": "0xa92261171d09aea90Bbf86c75A7322519F014c78", - "poolType": "burnMint", + "pool": { + "address": "0xa92261171d09aea90Bbf86c75A7322519F014c78", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "WLFI", "tokenAddress": "0x47474747477b199288bF72a1D702f7Fe0Fb1DEeA" }, @@ -7467,8 +10651,12 @@ "allowListEnabled": false, "decimals": 18, "name": "World Liberty Financial", - "poolAddress": "0xc785D05961B3C537cAC11f1D496876a255F6D650", - "poolType": "lockRelease", + "pool": { + "address": "0xc785D05961B3C537cAC11f1D496876a255F6D650", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "WLFI", "tokenAddress": "0xdA5e1988097297dCdc1f90D4dFE7909e847CBeF6" }, @@ -7476,8 +10664,12 @@ "allowListEnabled": false, "decimals": 6, "name": "World Liberty Financial", - "poolAddress": "7QziXoi8PodowR8XxGMN8TfdYnJzmQ8i4HcCk4LWovb7", - "poolType": "burnMint", + "pool": { + "address": "7QziXoi8PodowR8XxGMN8TfdYnJzmQ8i4HcCk4LWovb7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "WLFI", "tokenAddress": "WLFinEv6ypjkczcS83FZqFpgFZYwQXutRbxGe7oC16g" } @@ -7487,7 +10679,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped METIS", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WMETIS", "tokenAddress": "0x75cb093E4D61d2A2e65D8e0BBb01DE8d89b53481" } @@ -7497,7 +10693,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Mantle", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WMNT", "tokenAddress": "0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8" } @@ -7507,7 +10707,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped MON", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WMON", "tokenAddress": "0x3A704ad3E4784b935AE029171AdCF57ee7988198" } @@ -7517,8 +10721,12 @@ "allowListEnabled": false, "decimals": 6, "name": "WorldMobileToken", - "poolAddress": "0x0C03636614fe25278786e363643Ee5D4260C9eFE", - "poolType": "burnMint", + "pool": { + "address": "0x0C03636614fe25278786e363643Ee5D4260C9eFE", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "WMTX", "tokenAddress": "0xDBB5Cf12408a3Ac17d668037Ce289f9eA75439D7" }, @@ -7526,8 +10734,12 @@ "allowListEnabled": false, "decimals": 6, "name": "WorldMobileToken", - "poolAddress": "0xF32C2942Cb14Dc47DB8d0387A089948171Bb8F05", - "poolType": "burnMint", + "pool": { + "address": "0xF32C2942Cb14Dc47DB8d0387A089948171Bb8F05", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "WMTX", "tokenAddress": "0xDBB5Cf12408a3Ac17d668037Ce289f9eA75439D7" }, @@ -7535,8 +10747,12 @@ "allowListEnabled": false, "decimals": 6, "name": "WorldMobileToken", - "poolAddress": "0x7adF83556CE7141BaB0eFdA46DB40C5d5840eBe7", - "poolType": "burnMint", + "pool": { + "address": "0x7adF83556CE7141BaB0eFdA46DB40C5d5840eBe7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "WMTX", "tokenAddress": "0x3e31966d4f81C72D2a55310A6365A56A4393E98D" }, @@ -7544,8 +10760,12 @@ "allowListEnabled": false, "decimals": 6, "name": "WorldMobileToken", - "poolAddress": "0x229a1956929489870A31b01854a80EF9B0fd27c9", - "poolType": "burnMint", + "pool": { + "address": "0x229a1956929489870A31b01854a80EF9B0fd27c9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "WMTX", "tokenAddress": "0xDBB5Cf12408a3Ac17d668037Ce289f9eA75439D7" }, @@ -7553,8 +10773,12 @@ "allowListEnabled": false, "decimals": 6, "name": "World Mobile Token", - "poolAddress": "4B9Yvea3RNJ7pJQfdDxz18yzPV5sKSpvQBxoMYgLnzuK", - "poolType": "burnMint", + "pool": { + "address": "4B9Yvea3RNJ7pJQfdDxz18yzPV5sKSpvQBxoMYgLnzuK", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "WMTX", "tokenAddress": "WMTXyYKUMTG3VuZA5beXuHVRLpyTwwaoP7h2i8YpuRH" } @@ -7564,7 +10788,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped NXPC", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WNXPC", "tokenAddress": "0x150869eac5C58d3655f860C4316107fB626244d0" } @@ -7574,8 +10802,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped OETH", - "poolAddress": "0xbC92233eca3c53c002Ab80eAc8b6F9f84Fa27DBE", - "poolType": "burnMint", + "pool": { + "address": "0xbC92233eca3c53c002Ab80eAc8b6F9f84Fa27DBE", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "WOETH", "tokenAddress": "0xD8724322f44E5c58D7A815F542036fb17DbbF839" }, @@ -7583,8 +10815,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped OETH", - "poolAddress": "0xFE8671c82036b1afEF2Fd423d1aadeF5dC735A43", - "poolType": "burnMint", + "pool": { + "address": "0xFE8671c82036b1afEF2Fd423d1aadeF5dC735A43", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "wOETH", "tokenAddress": "0xD8724322f44E5c58D7A815F542036fb17DbbF839" }, @@ -7592,8 +10828,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped OETH", - "poolAddress": "0x75a852478792E5a99bc4cdd0aDBd97129B0d9799", - "poolType": "lockRelease", + "pool": { + "address": "0x75a852478792E5a99bc4cdd0aDBd97129B0d9799", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "wOETH", "tokenAddress": "0xDcEe70654261AF21C44c093C300eD3Bb97b78192" } @@ -7603,7 +10843,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped OKB", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WOKB", "tokenAddress": "0xe538905cf8410324e03A5A23C1c177a474D59b2b" } @@ -7613,8 +10857,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Landwolf", - "poolAddress": "0x158fbCD99c333afD5838aeF6ee3236c3e0a7041c", - "poolType": "burnMint", + "pool": { + "address": "0x158fbCD99c333afD5838aeF6ee3236c3e0a7041c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "WOLF", "tokenAddress": "0xe760fc2c7B94075Ae010216a539dcE7f91AF0e13" }, @@ -7622,8 +10870,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Landwolf", - "poolAddress": "0x89C13177406982051baC3305D14180F763422CE2", - "poolType": "burnMint", + "pool": { + "address": "0x89C13177406982051baC3305D14180F763422CE2", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "WOLF", "tokenAddress": "0x77Ca224436B132CD83581826669025Ed9cfd9b94" }, @@ -7631,8 +10883,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Landwolf", - "poolAddress": "0xfaFcaC5F48A7E034fec3264A6c42F88ef705638a", - "poolType": "lockRelease", + "pool": { + "address": "0xfaFcaC5F48A7E034fec3264A6c42F88ef705638a", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "WOLF", "tokenAddress": "0x67466BE17df832165F8C80a5A120CCc652bD7E69" } @@ -7642,8 +10898,12 @@ "allowListEnabled": false, "decimals": 18, "name": "WOW", - "poolAddress": "0x0563f39D663D44B64677ead7D75CdC7ADA842eCf", - "poolType": "burnMint", + "pool": { + "address": "0x0563f39D663D44B64677ead7D75CdC7ADA842eCf", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "WOW", "tokenAddress": "0xc97Cb00245a50c607b57D9b6d2e854FcA3B33F9c" }, @@ -7651,8 +10911,12 @@ "allowListEnabled": false, "decimals": 18, "name": "WOW", - "poolAddress": "0xB858917F2dA9253736c7869eD40f1212015AF4DE", - "poolType": "lockRelease", + "pool": { + "address": "0xB858917F2dA9253736c7869eD40f1212015AF4DE", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "WOW", "tokenAddress": "0x8f4b11d923BbAA6206f3Dd3ff84e8e31bafB49b7" } @@ -7662,7 +10926,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Plume", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WPLUME", "tokenAddress": "0xEa237441c92CAe6FC17Caaf9a7acB3f953be4bd1" } @@ -7672,7 +10940,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Polygon Ecosystem Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WPOL", "tokenAddress": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270" } @@ -7682,7 +10954,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped BTC", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WRBTC", "tokenAddress": "0x542fDA317318eBF1d3DEAf76E0b632741A7e677d" } @@ -7692,7 +10968,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ronin", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WRON", "tokenAddress": "0xe514d9DEB7966c8BE0ca922de8a064264eA6bcd4" } @@ -7702,7 +10982,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Sonic", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "wS", "tokenAddress": "0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38" } @@ -7712,8 +10996,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wisdomise", - "poolAddress": "0x862428cA8C8108486e0c6e66a897Aa0166841349", - "poolType": "burnMint", + "pool": { + "address": "0x862428cA8C8108486e0c6e66a897Aa0166841349", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "WSDM", "tokenAddress": "0x5F2F8818002dc64753daeDF4A6CB2CcB757CD220" }, @@ -7721,8 +11009,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wisdomise", - "poolAddress": "0xCF241Cdd2dee05Ef1Bd7F3FdAEf1bEc143E4f87c", - "poolType": "burnMint", + "pool": { + "address": "0xCF241Cdd2dee05Ef1Bd7F3FdAEf1bEc143E4f87c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "WSDM", "tokenAddress": "0x5F2F8818002dc64753daeDF4A6CB2CcB757CD220" }, @@ -7730,8 +11022,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wisdomise", - "poolAddress": "0x8ee28906BA9E482d881d28E825118b8b8e46A4a5", - "poolType": "burnMint", + "pool": { + "address": "0x8ee28906BA9E482d881d28E825118b8b8e46A4a5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "WSDM", "tokenAddress": "0x5F2F8818002dc64753daeDF4A6CB2CcB757CD220" }, @@ -7739,8 +11035,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wisdomise", - "poolAddress": "0x2DeBF941D469709853d96Df09dEF1DD8151D44D3", - "poolType": "lockRelease", + "pool": { + "address": "0x2DeBF941D469709853d96Df09dEF1DD8151D44D3", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "WSDM", "tokenAddress": "0x5F2F8818002dc64753daeDF4A6CB2CcB757CD220" } @@ -7750,7 +11050,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped SEI", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WSEI", "tokenAddress": "0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7" } @@ -7760,7 +11064,11 @@ "allowListEnabled": false, "decimals": 9, "name": "Wrapped Solana", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WSOL", "tokenAddress": "So11111111111111111111111111111111111111112" } @@ -7770,8 +11078,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped stETH", - "poolAddress": "0xFEe991bB8695a336f5C4ab00062BEEd4b5783f4F", - "poolType": "burnMint", + "pool": { + "address": "0xFEe991bB8695a336f5C4ab00062BEEd4b5783f4F", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "wstETH", "tokenAddress": "0x161a128567BF0C005b58211757F7e46eed983F02" }, @@ -7779,8 +11091,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped liquid staked Ether 2.0", - "poolAddress": "0xC78210649aF8A450C0f6E98107a0b614a3198359", - "poolType": "burnMint", + "pool": { + "address": "0xC78210649aF8A450C0f6E98107a0b614a3198359", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "wstETH", "tokenAddress": "0x5659b4C62897Fa36C05780cD96c2D5c0a5602488" }, @@ -7788,8 +11104,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped liquid staked Ether 2.0", - "poolAddress": "0x2dC99af320BC317c567f24eE95811dcbd5983DfD", - "poolType": "burnMint", + "pool": { + "address": "0x2dC99af320BC317c567f24eE95811dcbd5983DfD", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "wstETH", "tokenAddress": "0xE561152E8d3f618b386EF4dD6E3fb980Eb2f9e61" }, @@ -7797,8 +11117,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped liquid staked Ether 2.0", - "poolAddress": "0xA586a732394A1AFfCF15b972cd47C936033C9FA7", - "poolType": "lockRelease", + "pool": { + "address": "0xA586a732394A1AFfCF15b972cd47C936033C9FA7", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "wstETH", "tokenAddress": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0" }, @@ -7806,8 +11130,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped liquid staked Ether 2.0", - "poolAddress": "0x2f2E55517aac64c4066f6eB333b4Cb072eD00E8A", - "poolType": "burnMint", + "pool": { + "address": "0x2f2E55517aac64c4066f6eB333b4Cb072eD00E8A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "wstETH", "tokenAddress": "0x10Aeaf63194db8d453d4D85a06E5eFE1dd0b5417" }, @@ -7815,8 +11143,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped liquid staked Ether 2.0", - "poolAddress": "0xa4b1d393104a5eF340154c337009156aA0E83Bd8", - "poolType": "burnMint", + "pool": { + "address": "0xa4b1d393104a5eF340154c337009156aA0E83Bd8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "wstETH", "tokenAddress": "0x481e638105407Be40c2f2E2e006DE272d05930d0" } @@ -7826,8 +11158,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped stLINK", - "poolAddress": "0x04be180c1c3468c86EB68939aB53dbDC7306aDc7", - "poolType": "burnMint", + "pool": { + "address": "0x04be180c1c3468c86EB68939aB53dbDC7306aDc7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "wstLINK", "tokenAddress": "0x601486C8Fdc3aD22745b01c920037d6c036A38B9" }, @@ -7835,8 +11171,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped stLINK", - "poolAddress": "0x5406e9d1CEF8f54eb675bd41139A5E3D83bFf80c", - "poolType": "burnMint", + "pool": { + "address": "0x5406e9d1CEF8f54eb675bd41139A5E3D83bFf80c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "wstLINK", "tokenAddress": "0x3106E2e148525b3DB36795b04691D444c24972fB" }, @@ -7844,8 +11184,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped stLINK", - "poolAddress": "0xc80088D32830Cdb869eBA08bb25Bb6D7B17467FF", - "poolType": "burnMint", + "pool": { + "address": "0xc80088D32830Cdb869eBA08bb25Bb6D7B17467FF", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "wstLINK", "tokenAddress": "0xF2f7901B7bbA5799493B617B06EAd1862F771297" }, @@ -7853,8 +11197,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped stLINK", - "poolAddress": "0xF6403CF6E954a43699097322e0867C63d653C2D0", - "poolType": "lockRelease", + "pool": { + "address": "0xF6403CF6E954a43699097322e0867C63d653C2D0", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "wstLINK", "tokenAddress": "0x911D86C72155c33993d594B0Ec7E6206B4C803da" }, @@ -7862,8 +11210,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped stLINK", - "poolAddress": "0x97f40E42e4aE3BA12b5856F685136f6747Fa49a5", - "poolType": "burnMint", + "pool": { + "address": "0x97f40E42e4aE3BA12b5856F685136f6747Fa49a5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "wstLINK", "tokenAddress": "0xc271A17DB5cE6F53745A3F466077Ec816bC20a9C" } @@ -7873,8 +11225,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped stPOL", - "poolAddress": "0x481242B7846FA88fA76f2Ee73157aAa3AE2B280b", - "poolType": "burnMint", + "pool": { + "address": "0x481242B7846FA88fA76f2Ee73157aAa3AE2B280b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "wstPOL", "tokenAddress": "0x9178baB5362282a861922Ce641F4f3b7D4Bb9EF3" }, @@ -7882,8 +11238,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped stPOL", - "poolAddress": "0x553636e52059B0339592f545D25a4C0A86E3a1Bc", - "poolType": "lockRelease", + "pool": { + "address": "0x553636e52059B0339592f545D25a4C0A86E3a1Bc", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "wstPOL", "tokenAddress": "0x2091d83592D79B4De5fD2ce3D98679c32A9555e6" }, @@ -7891,8 +11251,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped stPOL", - "poolAddress": "0xb4D2C033Ea68674E56F6071B0d826D03152376dB", - "poolType": "burnMint", + "pool": { + "address": "0xb4D2C033Ea68674E56F6071B0d826D03152376dB", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "wstPOL", "tokenAddress": "0x1d0347C535C88Cf6BB72df75AED34363edB4B2AE" } @@ -7902,7 +11266,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped TAC", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WTAC", "tokenAddress": "0xB63B9f0eb4A6E6f191529D71d4D88cc8900Df2C9" } @@ -7912,7 +11280,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Tao", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WTAO", "tokenAddress": "0x5F3B70e0c089a1e3020B1990823Bc241a7bF3522" } @@ -7922,8 +11294,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wrapped xUSD", - "poolAddress": "0xa843652dF6Bda4d4B2894a28505963F595AEdBe3", - "poolType": "burnMint", + "pool": { + "address": "0xa843652dF6Bda4d4B2894a28505963F595AEdBe3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "wxUSD", "tokenAddress": "0x2d7e22Fb0fb7A7F0d1fef70ad8873A9ffDe18007" }, @@ -7931,8 +11307,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wrapped xUSD", - "poolAddress": "0xf6C3874a0a535B616d4528263B796255949D0135", - "poolType": "lockRelease", + "pool": { + "address": "0xf6C3874a0a535B616d4528263B796255949D0135", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "wxUSD", "tokenAddress": "0xB86fb1047A955C0186c77ff6263819b37B32440D" }, @@ -7940,8 +11320,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wrapped xUSD", - "poolAddress": "0x335CAd1ea3aB44fe800Da89Fc31e0071E044EF34", - "poolType": "burnMint", + "pool": { + "address": "0x335CAd1ea3aB44fe800Da89Fc31e0071E044EF34", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "wxUSD", "tokenAddress": "0x1EaE7Ca39192a2B6E3EA2E852A0D4D20bCe89d14" }, @@ -7949,8 +11333,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wrapped xUSD", - "poolAddress": "0x7211e50394Fa9c29373cf95987Fc381f35f8b8D8", - "poolType": "burnMint", + "pool": { + "address": "0x7211e50394Fa9c29373cf95987Fc381f35f8b8D8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "wxUSD", "tokenAddress": "0xAe770d24ec1580A13392E0B71067571351029203" }, @@ -7958,8 +11346,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wrapped xUSD", - "poolAddress": "0xCF4f83859845594aC0e7a9da26df5e47cf5474fd", - "poolType": "burnMint", + "pool": { + "address": "0xCF4f83859845594aC0e7a9da26df5e47cf5474fd", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "wxUSD", "tokenAddress": "0xe49465604e25cd5167005e0cEbD8Af461e833b83" }, @@ -7967,8 +11359,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wrapped xUSD", - "poolAddress": "0xe9bFB4fe6E403985c5f2b968f883A9590Aac54aC", - "poolType": "burnMint", + "pool": { + "address": "0xe9bFB4fe6E403985c5f2b968f883A9590Aac54aC", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "wxUSD", "tokenAddress": "0xAe770d24ec1580A13392E0B71067571351029203" }, @@ -7976,8 +11372,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Wrapped xUSD", - "poolAddress": "0x04c5046A1f4E3fFf094c26dFCAA75eF293932f18", - "poolType": "burnMint", + "pool": { + "address": "0x04c5046A1f4E3fFf094c26dFCAA75eF293932f18", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "wxUSD", "tokenAddress": "0x29A0dc4f509873673B7682B60598d393A1e591b7" } @@ -7987,7 +11387,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Wemix", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WWEMIX", "tokenAddress": "0x7D72b22a74A216Af4a002a1095C8C707d6eC1C5f" } @@ -7997,7 +11401,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped XDAI", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WXDAI", "tokenAddress": "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d" } @@ -8007,7 +11415,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped XDC", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WXDC", "tokenAddress": "0x951857744785E80e2De051c32EE7b25f9c458C42" } @@ -8017,7 +11429,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped XPL", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WXPL", "tokenAddress": "0x6100E367285b01F48D07953803A2d8dCA5D19873" } @@ -8027,7 +11443,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped XTZ", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WXTZ", "tokenAddress": "0xc9B53AB2679f573e480d01e0f49e2B5CFB7a3EAb" } @@ -8037,7 +11457,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped zkCRO", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "wzkCRO", "tokenAddress": "0xC1bF55EE54E16229d9b369a5502Bfe5fC9F20b6d" } @@ -8047,8 +11471,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xGold", - "poolAddress": "0xe199E1C5201CCDd3792ed902aD3f610Ce5629B59", - "poolType": "burnMint", + "pool": { + "address": "0xe199E1C5201CCDd3792ed902aD3f610Ce5629B59", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "xGold", "tokenAddress": "0x281A83ee4819068C40937A066d801aAD7C6e0400" }, @@ -8056,8 +11484,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xGold", - "poolAddress": "0x055860f40533c4d9E7CD38105F4c0d1EB0593072", - "poolType": "burnMint", + "pool": { + "address": "0x055860f40533c4d9E7CD38105F4c0d1EB0593072", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "xGold", "tokenAddress": "0x5D84B92A34635e5C21b7885fB29D6a4B60287ab7" }, @@ -8065,8 +11497,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xGold", - "poolAddress": "0x2110679A2155534b7674349273741a537495C50C", - "poolType": "burnMint", + "pool": { + "address": "0x2110679A2155534b7674349273741a537495C50C", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "xGold", "tokenAddress": "0x3FA41d2b29c69F8DA6E2D0bFc4f83C62D6582750" }, @@ -8074,8 +11510,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xGold", - "poolAddress": "0x5B806bA13B8B66F83339A63496C2f914BDd4Eb13", - "poolType": "burnMint", + "pool": { + "address": "0x5B806bA13B8B66F83339A63496C2f914BDd4Eb13", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "xGold", "tokenAddress": "0x74FC58Ba6FE27771589Be4b405D88Ab1521CD143" }, @@ -8083,8 +11523,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xGold", - "poolAddress": "0x55585FFBd94471925252C13ade6A81604C781C5D", - "poolType": "burnMint", + "pool": { + "address": "0x55585FFBd94471925252C13ade6A81604C781C5D", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "xGold", "tokenAddress": "0x5E75a1aD7b10523f7ed98C1C7CA0b4A79B1bBDee" }, @@ -8092,8 +11536,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xGold", - "poolAddress": "0x9EC2F7DBEB9dC7fc72F8476D8a5770E89e13D385", - "poolType": "burnMint", + "pool": { + "address": "0x9EC2F7DBEB9dC7fc72F8476D8a5770E89e13D385", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xGold", "tokenAddress": "0xDCFdCa64194945a44F092F8eD000245146aFcDd6" } @@ -8103,8 +11551,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Dexlab", - "poolAddress": "0xbf5d2a9e48C51c5945A7975c2b294A8A3e5330f2", - "poolType": "burnMint", + "pool": { + "address": "0xbf5d2a9e48C51c5945A7975c2b294A8A3e5330f2", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "XLAB", "tokenAddress": "0x5BA9bfFFB868859064C33D4f995A0828b2B1d2d3" }, @@ -8112,8 +11564,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Dexlab", - "poolAddress": "2F9v1hYeB247wJzBgjsz8zYAQUhFSPDzr1PDs6srMGtU", - "poolType": "lockRelease", + "pool": { + "address": "2F9v1hYeB247wJzBgjsz8zYAQUhFSPDzr1PDs6srMGtU", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "XLAB", "tokenAddress": "XLnpFRQ3rSWupCRjuQfx74mgVoT3ezVJKE1CogRZxhH" } @@ -8123,8 +11579,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Constellation ETH", - "poolAddress": "0x2d009c84770a3981613Ce5d1eD8F8a67BEc7411e", - "poolType": "burnMint", + "pool": { + "address": "0x2d009c84770a3981613Ce5d1eD8F8a67BEc7411e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "xrETH", "tokenAddress": "0x4d26b028D8C255794671fd120a94231A80A2E2C9" }, @@ -8132,8 +11592,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Constellation ETH", - "poolAddress": "0xf50B3be14ed2cF2CfE9aC239b763088E2463C11f", - "poolType": "burnMint", + "pool": { + "address": "0xf50B3be14ed2cF2CfE9aC239b763088E2463C11f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xrETH", "tokenAddress": "0xaD09085191216a94FA1Fd2A790E48e734602a869" }, @@ -8141,8 +11605,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Constellation ETH", - "poolAddress": "0xEDe803B34B30C8De6a128DE57B855263Cd8C55bc", - "poolType": "lockRelease", + "pool": { + "address": "0xEDe803B34B30C8De6a128DE57B855263Cd8C55bc", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "xrETH", "tokenAddress": "0xBB22d59B73D7a6F3A8a83A214BECc67Eb3b511fE" } @@ -8152,8 +11620,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Constellation RPL", - "poolAddress": "0x1dBD6224Cf535F624FcB41C4Ad8c065f10BDF3E3", - "poolType": "burnMint", + "pool": { + "address": "0x1dBD6224Cf535F624FcB41C4Ad8c065f10BDF3E3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xRPL", "tokenAddress": "0xd3Bb9E4e9aE431888873d3E51b3c03dA909e868A" }, @@ -8161,8 +11633,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Constellation RPL", - "poolAddress": "0xDdEDeb125315ba7b6539A6C18478ccf8b59ACEaE", - "poolType": "burnMint", + "pool": { + "address": "0xDdEDeb125315ba7b6539A6C18478ccf8b59ACEaE", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xRPL", "tokenAddress": "0x2775DeeB4FaDCc486562CAa777dE70AD6CCD82c6" }, @@ -8170,8 +11646,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Constellation RPL", - "poolAddress": "0x8d9F0185c49752d626ef0c318B24Bba83931D639", - "poolType": "lockRelease", + "pool": { + "address": "0x8d9F0185c49752d626ef0c318B24Bba83931D639", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "xRPL", "tokenAddress": "0x1DB1Afd9552eeB28e2e36597082440598B7F1320" } @@ -8181,8 +11661,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSILO", - "poolAddress": "0x902CD33780288CD0Bfff42AE174511d378DfE728", - "poolType": "burnMint", + "pool": { + "address": "0x902CD33780288CD0Bfff42AE174511d378DfE728", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSILO", "tokenAddress": "0xbB4287da728532C78bAF246B12A10be3ace2Dc70" }, @@ -8190,8 +11674,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSILO", - "poolAddress": "0x9D1cDE77b0720D78aBBD03EdF9abF7D5E0EE4b3A", - "poolType": "burnMint", + "pool": { + "address": "0x9D1cDE77b0720D78aBBD03EdF9abF7D5E0EE4b3A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSILO", "tokenAddress": "0xf3775f959bc64923BD809085299dBC984D3e6C8A" }, @@ -8199,8 +11687,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSILO", - "poolAddress": "0xC201a236258Ec170dE5255A9507bb4f70c7caf31", - "poolType": "burnMint", + "pool": { + "address": "0xC201a236258Ec170dE5255A9507bb4f70c7caf31", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "xSILO", "tokenAddress": "0xdd4c6FD31Ccf66E250790643947675153c221A91" }, @@ -8208,8 +11700,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSILO", - "poolAddress": "0x4F91b984B03B09Fdd60f9ed02279020eF930B2B0", - "poolType": "lockRelease", + "pool": { + "address": "0x4F91b984B03B09Fdd60f9ed02279020eF930B2B0", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "xSILO", "tokenAddress": "0x4451765739b2D7BCe5f8BC95Beaf966c45E1Dcc9" } @@ -8219,8 +11715,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0x2AB9cD10aC8077a554511FbcBCB0c94D833e0cC5", - "poolType": "burnMint", + "pool": { + "address": "0x2AB9cD10aC8077a554511FbcBCB0c94D833e0cC5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSolvBTC", "tokenAddress": "0xCC0966D8418d412c599A6421b760a847eB169A8c" }, @@ -8228,8 +11728,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0x3539F2E214d8BC7E611056383323aC6D1b01943c", - "poolType": "burnMint", + "pool": { + "address": "0x3539F2E214d8BC7E611056383323aC6D1b01943c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSolvBTC", "tokenAddress": "0xCC0966D8418d412c599A6421b760a847eB169A8c" }, @@ -8237,8 +11741,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0x3f2Be15aEA9F68f63ADE10440C6fE00753300b68", - "poolType": "burnMint", + "pool": { + "address": "0x3f2Be15aEA9F68f63ADE10440C6fE00753300b68", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "xSolvBTC", "tokenAddress": "0xCC0966D8418d412c599A6421b760a847eB169A8c" }, @@ -8246,8 +11754,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0xf0314c4B42cd6fCA8772bDE359E0A7d3b5E70f88", - "poolType": "burnMint", + "pool": { + "address": "0xf0314c4B42cd6fCA8772bDE359E0A7d3b5E70f88", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "xSolvBTC", "tokenAddress": "0x1346b618dC92810EC74163e4c27004c921D446a5" }, @@ -8255,8 +11767,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0x0Cd252108EF0CE50f95F75045a97C72A0A8d3118", - "poolType": "burnMint", + "pool": { + "address": "0x0Cd252108EF0CE50f95F75045a97C72A0A8d3118", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSolvBTC", "tokenAddress": "0x346c574C56e1A4aAa8dc88Cda8F7EB12b39947aB" }, @@ -8264,8 +11780,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0x1b019366e7fD47425c7E3D07C18D52D77c0B72bf", - "poolType": "burnMint", + "pool": { + "address": "0x1b019366e7fD47425c7E3D07C18D52D77c0B72bf", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSolvBTC", "tokenAddress": "0xC26C9099BD3789107888c35bb41178079B282561" }, @@ -8273,8 +11793,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0xdb9E8DF31cE12817DdD1C4d2c3acef038580f586", - "poolType": "burnMint", + "pool": { + "address": "0xdb9E8DF31cE12817DdD1C4d2c3acef038580f586", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSolvBTC", "tokenAddress": "0xc99F5c922DAE05B6e2ff83463ce705eF7C91F077" }, @@ -8282,8 +11806,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0xd25987B0712FA66D05aA2F7A35bA4B01fB60D22E", - "poolType": "burnMint", + "pool": { + "address": "0xd25987B0712FA66D05aA2F7A35bA4B01fB60D22E", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSolvBTC", "tokenAddress": "0xCC0966D8418d412c599A6421b760a847eB169A8c" }, @@ -8291,8 +11819,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0xDed2A972feB2AA8FE531D8C4E290C12FFE6Be9D6", - "poolType": "burnMint", + "pool": { + "address": "0xDed2A972feB2AA8FE531D8C4E290C12FFE6Be9D6", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "xSolvBTC", "tokenAddress": "0xCC0966D8418d412c599A6421b760a847eB169A8c" }, @@ -8300,8 +11832,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0x97810368dE6F7213Cf54f2918A267cEa25449F81", - "poolType": "burnMint", + "pool": { + "address": "0x97810368dE6F7213Cf54f2918A267cEa25449F81", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSolvBTC", "tokenAddress": "0x2878295D69Aa3BDcf9004FCf362F0959992D801c" }, @@ -8309,8 +11845,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0xb5829e1f8078860969950852546B947f37855ef1", - "poolType": "burnMint", + "pool": { + "address": "0xb5829e1f8078860969950852546B947f37855ef1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "xSolvBTC", "tokenAddress": "0xc99F5c922DAE05B6e2ff83463ce705eF7C91F077" }, @@ -8318,8 +11858,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0x99bb52AAF045F63F74d0a3FbE6Cf3e7B23aeD212", - "poolType": "burnMint", + "pool": { + "address": "0x99bb52AAF045F63F74d0a3FbE6Cf3e7B23aeD212", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSolvBTC", "tokenAddress": "0xd9D920AA40f578ab794426F5C90F6C731D159DEf" }, @@ -8327,8 +11871,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0x44F2B4dE683f5225704376699fD1eF3E2769107b", - "poolType": "burnMint", + "pool": { + "address": "0x44F2B4dE683f5225704376699fD1eF3E2769107b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSolvBTC", "tokenAddress": "0xc99F5c922DAE05B6e2ff83463ce705eF7C91F077" }, @@ -8336,8 +11884,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0x8A76fe7fA6da27f85a626c5C53730B38D13603d7", - "poolType": "burnMint", + "pool": { + "address": "0x8A76fe7fA6da27f85a626c5C53730B38D13603d7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "xSolvBTC", "tokenAddress": "0xc99F5c922DAE05B6e2ff83463ce705eF7C91F077" }, @@ -8345,8 +11897,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0xd2bdD1E01fd2F8d7d42b209c111c7b32158b5a42", - "poolType": "burnMint", + "pool": { + "address": "0xd2bdD1E01fd2F8d7d42b209c111c7b32158b5a42", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "xSolvBTC", "tokenAddress": "0xCC0966D8418d412c599A6421b760a847eB169A8c" }, @@ -8354,8 +11910,12 @@ "allowListEnabled": false, "decimals": 8, "name": "xSolvBTC", - "poolAddress": "JBxSefWbahYApU5DVsqXcHugDVGFNUaaZgWh3u7wESVn", - "poolType": "burnMint", + "pool": { + "address": "JBxSefWbahYApU5DVsqXcHugDVGFNUaaZgWh3u7wESVn", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "xSolvBTC", "tokenAddress": "SoLvAiHLF7LGEaiTN5KGZt1bNnraoWTi5mjcvRoDAX4" }, @@ -8363,8 +11923,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0xEf53137aF78Afc63b312f0af64fe3c24804d2441", - "poolType": "burnMint", + "pool": { + "address": "0xEf53137aF78Afc63b312f0af64fe3c24804d2441", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSolvBTC", "tokenAddress": "0xCC0966D8418d412c599A6421b760a847eB169A8c" }, @@ -8372,8 +11936,12 @@ "allowListEnabled": false, "decimals": 18, "name": "xSolvBTC", - "poolAddress": "0x2B4d8FAD49A3276853560A9cAFaa59392a99cDbD", - "poolType": "burnMint", + "pool": { + "address": "0x2B4d8FAD49A3276853560A9cAFaa59392a99cDbD", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "xSolvBTC", "tokenAddress": "0xCC0966D8418d412c599A6421b760a847eB169A8c" } @@ -8383,8 +11951,12 @@ "allowListEnabled": false, "decimals": 18, "name": "XSwap", - "poolAddress": "0x4d87CBff8187C4B3E00FDF534cb310724536EA4c", - "poolType": "burnMint", + "pool": { + "address": "0x4d87CBff8187C4B3E00FDF534cb310724536EA4c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "XSWAP", "tokenAddress": "0x8Fe815417913a93Ea99049FC0718ee1647A2a07c" }, @@ -8392,8 +11964,12 @@ "allowListEnabled": false, "decimals": 18, "name": "XSwap", - "poolAddress": "0x916D7d960B119bb6c4AbE381f7677eCEed866d44", - "poolType": "burnMint", + "pool": { + "address": "0x916D7d960B119bb6c4AbE381f7677eCEed866d44", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "XSWAP", "tokenAddress": "0x8Fe815417913a93Ea99049FC0718ee1647A2a07c" } @@ -8403,8 +11979,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Real Estate Panama Fund", - "poolAddress": "0x38b771383823A442fF3943706d6541A253298c8e", - "poolType": "burnMint", + "pool": { + "address": "0x38b771383823A442fF3943706d6541A253298c8e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "XTFBRICK1", "tokenAddress": "0x8d944193Cdeb7c4767fB1B3c43Fb9E1E1Df3158A" }, @@ -8412,8 +11992,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Real Estate Panama Fund", - "poolAddress": "0x07f49dC315E6F567a824Db364E834E3391E976a8", - "poolType": "burnMint", + "pool": { + "address": "0x07f49dC315E6F567a824Db364E834E3391E976a8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "XTFBRICK1", "tokenAddress": "0x268Cf1A0d1723eff452a2df8208172F8768Aa001" }, @@ -8421,8 +12005,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Real Estate Panama Fund", - "poolAddress": "0x71cC4E6858bA934Da2F6F825807118160FADFDA8", - "poolType": "lockRelease", + "pool": { + "address": "0x71cC4E6858bA934Da2F6F825807118160FADFDA8", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "XTFBRICK1", "tokenAddress": "0x2D7f7da70F8c36A2ef47BAbbc4D0be4B4274F72D" } @@ -8432,8 +12020,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Avenida CLO Bond Fund", - "poolAddress": "0xDc274b09d624EE22079F187E8dFf11Bf599cd2A1", - "poolType": "burnMint", + "pool": { + "address": "0xDc274b09d624EE22079F187E8dFf11Bf599cd2A1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "XTFCLOBOND", "tokenAddress": "0x9E1B4B2e870bD894e7457D18bA620E0cf3e37F90" }, @@ -8441,8 +12033,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Avenida CLO Bond Fund", - "poolAddress": "0x8680bf9D1d132DF66d9CeDcB0a0bA068cD94998A", - "poolType": "burnMint", + "pool": { + "address": "0x8680bf9D1d132DF66d9CeDcB0a0bA068cD94998A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "XTFCLOBOND", "tokenAddress": "0xD012151eA9352f477895e0a4f88Efe15f0e8855a" }, @@ -8450,8 +12046,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Avenida CLO Bond Fund", - "poolAddress": "0x8C66197BDbeAc351590F93447A1CD4186553970E", - "poolType": "lockRelease", + "pool": { + "address": "0x8C66197BDbeAc351590F93447A1CD4186553970E", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "XTFCLOBOND", "tokenAddress": "0xe5097376a585565038D2CF05D2Eb04e9Db1902AD" } @@ -8461,8 +12061,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Yield BTC.B", - "poolAddress": "0xC78210649aF8A450C0f6E98107a0b614a3198359", - "poolType": "burnMint", + "pool": { + "address": "0xC78210649aF8A450C0f6E98107a0b614a3198359", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "YBTC.B", "tokenAddress": "0x2cd3CdB3bd68Eea0d3BE81DA707bC0c8743D7335" }, @@ -8470,8 +12074,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Yield BTC.B", - "poolAddress": "0xfed13D0c40790220fbdE712987079Eda1Ed75C51", - "poolType": "lockRelease", + "pool": { + "address": "0xfed13D0c40790220fbdE712987079Eda1Ed75C51", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "YBTC.B", "tokenAddress": "0x2cd3CdB3bd68Eea0d3BE81DA707bC0c8743D7335" }, @@ -8479,8 +12087,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Yield BTC.B", - "poolAddress": "0x448eEF4A0EF5171F9B9C973017C9621C914591Ad", - "poolType": "burnMint", + "pool": { + "address": "0x448eEF4A0EF5171F9B9C973017C9621C914591Ad", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "YBTC.B", "tokenAddress": "0x2cd3CdB3bd68Eea0d3BE81DA707bC0c8743D7335" }, @@ -8488,8 +12100,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Yield BTC.B", - "poolAddress": "0x5416050533Bc83533Fc7e7BC50A651DC7C762D07", - "poolType": "burnMint", + "pool": { + "address": "0x5416050533Bc83533Fc7e7BC50A651DC7C762D07", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "YBTC.B", "tokenAddress": "0x2cd3CdB3bd68Eea0d3BE81DA707bC0c8743D7335" }, @@ -8497,8 +12113,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Yield BTC.B", - "poolAddress": "0x9aCd2ffD56E278a560Cc4E12dCA2B7D2B3359Ac2", - "poolType": "burnMint", + "pool": { + "address": "0x9aCd2ffD56E278a560Cc4E12dCA2B7D2B3359Ac2", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "YBTC.B", "tokenAddress": "0x2cd3CdB3bd68Eea0d3BE81DA707bC0c8743D7335" }, @@ -8506,8 +12126,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Yield BTC.B", - "poolAddress": "0x5416050533Bc83533Fc7e7BC50A651DC7C762D07", - "poolType": "burnMint", + "pool": { + "address": "0x5416050533Bc83533Fc7e7BC50A651DC7C762D07", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "YBTC.B", "tokenAddress": "0x2cd3CdB3bd68Eea0d3BE81DA707bC0c8743D7335" }, @@ -8515,8 +12139,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Yield BTC.B", - "poolAddress": "0xe96cC12AA0E2e545621bcbE1E035D91a7871fE8f", - "poolType": "burnMint", + "pool": { + "address": "0xe96cC12AA0E2e545621bcbE1E035D91a7871fE8f", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "YBTC.B", "tokenAddress": "0x2cd3CdB3bd68Eea0d3BE81DA707bC0c8743D7335" }, @@ -8524,8 +12152,12 @@ "allowListEnabled": false, "decimals": 8, "name": "Yield BTC.B", - "poolAddress": "FV7RjzzPxaVXEtkR9NsPREHBEzPoiVvQBtzQY97PGe3Z", - "poolType": "burnMint", + "pool": { + "address": "FV7RjzzPxaVXEtkR9NsPREHBEzPoiVvQBtzQY97PGe3Z", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "YBTC.B", "tokenAddress": "3VcKofugG1SPJmjuiEZCJL5mk1JkyqGZ19ByeMWXVWfK" } @@ -8535,8 +12167,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Yield Guild Games Token", - "poolAddress": "0x799A356069Ca6D91BBE5d0407De625A969874aE4", - "poolType": "lockRelease", + "pool": { + "address": "0x799A356069Ca6D91BBE5d0407De625A969874aE4", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "YGG", "tokenAddress": "0x25f8087EAD173b73D6e8B84329989A8eEA16CF73" }, @@ -8544,8 +12180,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Yield Guild Games Token", - "poolAddress": "0x2b200Ca34f70d39464A0881BC45fC5fb858b3d5F", - "poolType": "burnMint", + "pool": { + "address": "0x2b200Ca34f70d39464A0881BC45fC5fb858b3d5F", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "YGG", "tokenAddress": "0x1c306872bC82525d72Bf3562E8F0aA3f8F26e857" } @@ -8555,8 +12195,12 @@ "allowListEnabled": false, "decimals": 6, "name": "yesnoerror", - "poolAddress": "0xd8F5e7FAc317c638d2Fe4d07ab3f436ca6b5e5c7", - "poolType": "burnMint", + "pool": { + "address": "0xd8F5e7FAc317c638d2Fe4d07ab3f436ca6b5e5c7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "YNE", "tokenAddress": "0xE2f9db0186b13668AeC9fe0e15dbD13004ed8d6f" }, @@ -8564,8 +12208,12 @@ "allowListEnabled": false, "decimals": 6, "name": "yesnoerror", - "poolAddress": "AyxbrQHM1sPx17HKWP1x13E8PBFxpvMQiMERvoG4ub53", - "poolType": "lockRelease", + "pool": { + "address": "AyxbrQHM1sPx17HKWP1x13E8PBFxpvMQiMERvoG4ub53", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "YNE", "tokenAddress": "7D1iYWfhw2cr9yBZBFE6nZaaSUvXHqG5FizFFEZwpump" } @@ -8575,8 +12223,12 @@ "allowListEnabled": false, "decimals": 8, "name": "zBTC", - "poolAddress": "0x7B58df98a12F54813fDec73B5791642Fa35a52a4", - "poolType": "burnMint", + "pool": { + "address": "0x7B58df98a12F54813fDec73B5791642Fa35a52a4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "zBTC", "tokenAddress": "0x7F544C3a1a16059dd3bbc23AA3BC5c4f5B6969D0" }, @@ -8584,8 +12236,12 @@ "allowListEnabled": false, "decimals": 8, "name": "zBTC", - "poolAddress": "0xe3f4B78cdd20f6B8AE8644064656d3E2bF08c4B8", - "poolType": "burnMint", + "pool": { + "address": "0xe3f4B78cdd20f6B8AE8644064656d3E2bF08c4B8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "zBTC", "tokenAddress": "0x24eCd41CE6646ADa857995A682e1a5c42732cAbc" }, @@ -8593,8 +12249,12 @@ "allowListEnabled": false, "decimals": 8, "name": "zBTC", - "poolAddress": "9EvWTQvZafNxEgpt6snY2sTFT7hARk4tU5QtdRPqoisX", - "poolType": "lockRelease", + "pool": { + "address": "9EvWTQvZafNxEgpt6snY2sTFT7hARk4tU5QtdRPqoisX", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "zBTC", "tokenAddress": "zBTCug3er3tLyffELcvDNrKkCymbPWysGcWihESYfLg" }, @@ -8602,8 +12262,12 @@ "allowListEnabled": false, "decimals": 8, "name": "zBTC", - "poolAddress": "0x66d78C6AF776350F89DA8D63b66008122236ab3e", - "poolType": "burnMint", + "pool": { + "address": "0x66d78C6AF776350F89DA8D63b66008122236ab3e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "zBTC", "tokenAddress": "0x006A22D3120eaD503F0654Be855BCDfbba5Ced72" } @@ -8613,8 +12277,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zentry", - "poolAddress": "0x55c47DE8bCfA02B3989f2B6F9542900E3A2EC6c3", - "poolType": "lockRelease", + "pool": { + "address": "0x55c47DE8bCfA02B3989f2B6F9542900E3A2EC6c3", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "ZENT", "tokenAddress": "0xdBB7a34Bf10169d6d2D0d02A6cbb436cF4381BFa" }, @@ -8622,8 +12290,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zentry", - "poolAddress": "0x52fEd5115D8B7397C09eb4ce2f0a99739891D6B8", - "poolType": "burnMint", + "pool": { + "address": "0x52fEd5115D8B7397C09eb4ce2f0a99739891D6B8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "ZENT", "tokenAddress": "0x9f28c9C2dA4A833cbFaAacbf7eB62267334d7149" } @@ -8633,8 +12305,12 @@ "allowListEnabled": false, "decimals": 6, "name": "ZeUSD", - "poolAddress": "0x04c4032CBCdFDa3c676FA86B5F4b61edE6c8286b", - "poolType": "burnMint", + "pool": { + "address": "0x04c4032CBCdFDa3c676FA86B5F4b61edE6c8286b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "ZeUSD", "tokenAddress": "0x7DC9748DA8E762e569F9269f48F69A1a9F8Ea761" }, @@ -8642,8 +12318,12 @@ "allowListEnabled": false, "decimals": 6, "name": "ZeUSD", - "poolAddress": "0x99874400820c354eE07bC8b165C605632BdCeae3", - "poolType": "lockRelease", + "pool": { + "address": "0x99874400820c354eE07bC8b165C605632BdCeae3", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "ZeUSD", "tokenAddress": "0x7DC9748DA8E762e569F9269f48F69A1a9F8Ea761" } @@ -8653,8 +12333,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zunami Token", - "poolAddress": "0x090D3978b8CaF2832b3CDB0d9d5D34EA0c6Cbd99", - "poolType": "burnMint", + "pool": { + "address": "0x090D3978b8CaF2832b3CDB0d9d5D34EA0c6Cbd99", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "ZUN", "tokenAddress": "0x346E74Dc9935a9b02Eb34fB84658a66010fA056D" }, @@ -8662,8 +12346,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zunami Token", - "poolAddress": "0xBFCFF67cc8a236B25Fc043a4a2b8Bf5B122AdC44", - "poolType": "burnMint", + "pool": { + "address": "0xBFCFF67cc8a236B25Fc043a4a2b8Bf5B122AdC44", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "ZUN", "tokenAddress": "0x1db0Fc8933f545648b54A9eE4326209a9A259643" }, @@ -8671,8 +12359,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zunami Token", - "poolAddress": "0xa01bBE327951B2e441Ed38638927098A272e0F5C", - "poolType": "burnMint", + "pool": { + "address": "0xa01bBE327951B2e441Ed38638927098A272e0F5C", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "ZUN", "tokenAddress": "0x25193034153AfB4251a8E02a8Db0DeaeF4C876F6" }, @@ -8680,8 +12372,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zunami Token", - "poolAddress": "0x9c79223e8ce037c39b534891b41b3f306a8FE192", - "poolType": "lockRelease", + "pool": { + "address": "0x9c79223e8ce037c39b534891b41b3f306a8FE192", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "ZUN", "tokenAddress": "0x6b5204B0Be36771253Cc38e88012E02B752f0f36" } @@ -8691,8 +12387,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zunami Omni ETH", - "poolAddress": "0x07d7A985832369eF32F0491aA4CD44fFA9dD4200", - "poolType": "burnMint", + "pool": { + "address": "0x07d7A985832369eF32F0491aA4CD44fFA9dD4200", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "zunETH", "tokenAddress": "0xC9eE652953D8069c5eD37bbB3F8142c6243EFDA0" }, @@ -8700,8 +12400,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zunami Omni ETH", - "poolAddress": "0x9C764e7db0962d5528Bd043109E52c477bafe5db", - "poolType": "burnMint", + "pool": { + "address": "0x9C764e7db0962d5528Bd043109E52c477bafe5db", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "zunETH", "tokenAddress": "0x24CB2B89844604C57350776D81e14765D03b91dE" }, @@ -8709,8 +12413,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zunami Omni ETH", - "poolAddress": "0xC381C7CffD07Fa22f871ae9Ec1025Cee86693B3b", - "poolType": "burnMint", + "pool": { + "address": "0xC381C7CffD07Fa22f871ae9Ec1025Cee86693B3b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "zunETH", "tokenAddress": "0x2d691C2492e056ADCAE7cA317569af25910fC4cb" }, @@ -8718,8 +12426,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zunami ETH", - "poolAddress": "0xe4832022873C69E14731fd9436eb7FB9538Ae86F", - "poolType": "lockRelease", + "pool": { + "address": "0xe4832022873C69E14731fd9436eb7FB9538Ae86F", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.1" + }, "symbol": "zunETH", "tokenAddress": "0xc2e660C62F72c2ad35AcE6DB78a616215E2F2222" } @@ -8729,8 +12441,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zunami Omni USD", - "poolAddress": "0x68b49DC715214A2D138B0d73A2fC82a87dC8F1C0", - "poolType": "burnMint", + "pool": { + "address": "0x68b49DC715214A2D138B0d73A2fC82a87dC8F1C0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "zunUSD", "tokenAddress": "0xBfEB8B6813491bb4fB823b8f451b62eF535420D1" }, @@ -8738,8 +12454,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zunami Omni USD", - "poolAddress": "0x5800177Ab2cEFd1f7704A4e7eA8A309D98072fCb", - "poolType": "burnMint", + "pool": { + "address": "0x5800177Ab2cEFd1f7704A4e7eA8A309D98072fCb", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "zunUSD", "tokenAddress": "0xD5B9dDB04f20eA773C9b56607250149B26049B1F" }, @@ -8747,8 +12467,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zunami Omni USD", - "poolAddress": "0xD4DC5f4573FE1E39a33C4e4aF8292b925B2E81Fd", - "poolType": "burnMint", + "pool": { + "address": "0xD4DC5f4573FE1E39a33C4e4aF8292b925B2E81Fd", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "zunUSD", "tokenAddress": "0xdC30b3bdE2734A0Bc55AF01B38943ef04aaCB423" }, @@ -8756,8 +12480,12 @@ "allowListEnabled": false, "decimals": 18, "name": "Zunami USD", - "poolAddress": "0x45af366C76a8C8f18806A8C404FE3E3bbA4F8AA3", - "poolType": "lockRelease", + "pool": { + "address": "0x45af366C76a8C8f18806A8C404FE3E3bbA4F8AA3", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "zunUSD", "tokenAddress": "0x8C0D76C9B18779665475F3E212D9Ca1Ed6A1A0e6" } diff --git a/src/config/data/ccip/v1_2_0/testnet/lanes.json b/src/config/data/ccip/v1_2_0/testnet/lanes.json index 567cbe4b92e..381172eb4e1 100644 --- a/src/config/data/ccip/v1_2_0/testnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/testnet/lanes.json @@ -23,22 +23,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "apechain-testnet-curtis": { @@ -52,22 +37,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "aptos-testnet": { @@ -81,22 +51,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia": { "offRamp": { @@ -108,22 +63,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -135,22 +75,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -162,22 +87,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-optimism-1": { "offRamp": { @@ -189,22 +99,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ink-testnet-sepolia": { "offRamp": { @@ -227,22 +122,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "xdai-testnet-chiado": { "offRamp": { @@ -278,36 +158,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia": { "offRamp": { @@ -319,50 +170,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM", "USDC"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -374,36 +182,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -415,36 +194,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-optimism-1": { "offRamp": { @@ -456,36 +206,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "monad-testnet": { "offRamp": { @@ -508,36 +229,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "polygon-testnet-tatara": { "offRamp": { @@ -571,22 +263,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "solana-devnet": { "offRamp": { @@ -609,36 +286,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "xdai-testnet-chiado": { "offRamp": { @@ -650,36 +298,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] } }, "berachain-testnet-bartio": { @@ -778,22 +397,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -831,22 +435,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "bitcoin-testnet-sepolia-bob-1": { @@ -860,22 +449,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "bsc-testnet": { @@ -889,22 +463,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "avalanche-fuji-testnet": { "offRamp": { @@ -916,36 +475,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "bitcoin-testnet-bitlayer-1": { "offRamp": { @@ -979,36 +509,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -1020,36 +521,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-blast-1": { "offRamp": { @@ -1105,36 +577,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "solana-devnet": { "offRamp": { @@ -1146,22 +589,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "sonic-testnet-blaze": { "offRamp": { @@ -1184,36 +612,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "xdai-testnet-chiado": { "offRamp": { @@ -1225,36 +624,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] } }, "celo-testnet-alfajores": { @@ -1268,36 +638,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -1346,22 +687,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "cronos-zkevm-testnet-sepolia": { @@ -1476,22 +802,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "sonic-testnet-blaze": { "offRamp": { @@ -1516,22 +827,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "ethereum-testnet-holesky-taiko-1": { @@ -1545,22 +841,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "ethereum-testnet-hoodi-morph": { @@ -1574,22 +855,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "ethereum-testnet-sepolia": { @@ -1614,22 +880,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "apechain-testnet-curtis": { "offRamp": { @@ -1641,22 +892,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "aptos-testnet": { "offRamp": { @@ -1668,22 +904,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "avalanche-fuji-testnet": { "offRamp": { @@ -1695,50 +916,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM", "USDC"] }, "berachain-testnet-bartio": { "offRamp": { @@ -1794,22 +972,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "bitcoin-testnet-merlin": { "offRamp": { @@ -1832,22 +995,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "bitcoin-testnet-sepolia-bob-1": { "offRamp": { @@ -1859,22 +1007,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "bsc-testnet": { "offRamp": { @@ -1886,36 +1019,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "celo-testnet-alfajores": { "offRamp": { @@ -1927,36 +1031,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "core-testnet": { "offRamp": { @@ -1979,22 +1054,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "cronos-zkevm-testnet-sepolia": { "offRamp": { @@ -2017,22 +1077,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-holesky-taiko-1": { "offRamp": { @@ -2044,22 +1089,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-hoodi-morph": { "offRamp": { @@ -2071,22 +1101,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-andromeda-1": { "offRamp": { @@ -2098,36 +1113,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -2139,64 +1125,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM", "USDC", "syrupUSDC"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -2208,64 +1137,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM", "USDC", "syrupUSDC"] }, "ethereum-testnet-sepolia-blast-1": { "offRamp": { @@ -2277,36 +1149,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-corn-1": { "offRamp": { @@ -2329,22 +1172,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-lens-1": { "offRamp": { @@ -2367,22 +1195,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-LnM"] }, "ethereum-testnet-sepolia-lisk-1": { "offRamp": { @@ -2394,22 +1207,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-mantle-1": { "offRamp": { @@ -2421,50 +1219,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "syrupUSDT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM", "syrupUSDT"] }, "ethereum-testnet-sepolia-mode-1": { "offRamp": { @@ -2476,36 +1231,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-optimism-1": { "offRamp": { @@ -2517,50 +1243,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM", "USDC"] }, "ethereum-testnet-sepolia-polygon-zkevm-1": { "offRamp": { @@ -2572,22 +1255,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-LnM"] }, "ethereum-testnet-sepolia-scroll-1": { "offRamp": { @@ -2599,22 +1267,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-LnM"] }, "ethereum-testnet-sepolia-soneium-1": { "offRamp": { @@ -2637,36 +1290,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "USDC"] }, "ethereum-testnet-sepolia-worldchain-1": { "offRamp": { @@ -2678,22 +1302,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-xlayer-1": { "offRamp": { @@ -2705,22 +1314,7 @@ "enforceOutOfOrder": true, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-LnM"] }, "ethereum-testnet-sepolia-zksync-1": { "offRamp": { @@ -2732,36 +1326,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "etherlink-testnet": { "offRamp": { @@ -2784,22 +1349,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "hemi-testnet-sepolia": { "offRamp": { @@ -2822,22 +1372,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "janction-testnet-sepolia": { "offRamp": { @@ -2860,22 +1395,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "kaia-testnet-kairos": { "offRamp": { @@ -2909,22 +1429,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "metal-testnet": { "offRamp": { @@ -2936,22 +1441,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "mind-testnet": { "offRamp": { @@ -2974,22 +1464,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "monad-testnet": { "offRamp": { @@ -3034,22 +1509,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "syrupUSDT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["syrupUSDT"] }, "plume-testnet-sepolia": { "offRamp": { @@ -3061,22 +1521,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "polkadot-testnet-astar-shibuya": { "offRamp": { @@ -3088,36 +1533,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "167000000000000000000", - "isEnabled": true, - "rate": "100000000000000000000" - }, - "out": { - "capacity": "167000000000000000000", - "isEnabled": true, - "rate": "100000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "polygon-testnet-amoy": { "offRamp": { @@ -3129,50 +1545,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM", "USDC"] }, "polygon-testnet-tatara": { "offRamp": { @@ -3195,36 +1568,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "sei-testnet-atlantic": { "offRamp": { @@ -3236,22 +1580,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "shibarium-testnet-puppynet": { "offRamp": { @@ -3263,22 +1592,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "solana-devnet": { "offRamp": { @@ -3290,50 +1604,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "USDC", "syrupUSDC"] }, "sonic-testnet-blaze": { "offRamp": { @@ -3345,22 +1616,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "superseed-testnet": { "offRamp": { @@ -3383,22 +1639,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "treasure-testnet-topaz": { "offRamp": { @@ -3421,36 +1662,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "167000000000000000000", - "isEnabled": true, - "rate": "100000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "xdai-testnet-chiado": { "offRamp": { @@ -3462,36 +1674,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "xdc-testnet": { "offRamp": { @@ -3503,22 +1686,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "zora-testnet": { "offRamp": { @@ -3543,36 +1711,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -3597,22 +1736,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "avalanche-fuji-testnet": { "offRamp": { @@ -3624,36 +1748,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "bitcoin-testnet-bsquared-1": { "offRamp": { @@ -3687,64 +1782,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM", "USDC", "syrupUSDC"] }, "ethereum-testnet-sepolia-andromeda-1": { "offRamp": { @@ -3767,36 +1805,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-hashkey-1": { "offRamp": { @@ -3819,36 +1828,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-soneium-1": { "offRamp": { @@ -3893,22 +1873,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "solana-devnet": { "offRamp": { @@ -3920,22 +1885,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "treasure-testnet-topaz": { "offRamp": { @@ -3958,36 +1908,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "xdai-testnet-chiado": { "offRamp": { @@ -3999,36 +1920,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] } }, "ethereum-testnet-sepolia-base-1": { @@ -4042,22 +1934,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "avalanche-fuji-testnet": { "offRamp": { @@ -4069,36 +1946,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "bsc-testnet": { "offRamp": { @@ -4110,36 +1958,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "celo-testnet-alfajores": { "offRamp": { @@ -4173,64 +1992,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM", "USDC", "syrupUSDC"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -4242,36 +2004,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-hashkey-1": { "offRamp": { @@ -4294,36 +2027,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-optimism-1": { "offRamp": { @@ -4335,36 +2039,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ink-testnet-sepolia": { "offRamp": { @@ -4431,22 +2106,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "solana-devnet": { "offRamp": { @@ -4458,22 +2118,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "sonic-testnet-blaze": { "offRamp": { @@ -4507,36 +2152,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] } }, "ethereum-testnet-sepolia-blast-1": { @@ -4561,36 +2177,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] } }, "ethereum-testnet-sepolia-corn-1": { @@ -4628,22 +2215,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -4690,22 +2262,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-LnM"] } }, "ethereum-testnet-sepolia-lens-1": { @@ -4743,22 +2300,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-LnM"] }, "ethereum-testnet-sepolia-optimism-1": { "offRamp": { @@ -4794,22 +2336,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "ethereum-testnet-sepolia-mantle-1": { @@ -4834,50 +2361,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "syrupUSDT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM", "syrupUSDT"] } }, "ethereum-testnet-sepolia-mode-1": { @@ -4891,36 +2375,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -4932,36 +2387,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] } }, "ethereum-testnet-sepolia-optimism-1": { @@ -4975,22 +2401,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "avalanche-fuji-testnet": { "offRamp": { @@ -5002,36 +2413,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "celo-testnet-alfajores": { "offRamp": { @@ -5054,50 +2436,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM", "USDC"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -5109,36 +2448,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -5150,36 +2460,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-hashkey-1": { "offRamp": { @@ -5224,36 +2505,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "shibarium-testnet-puppynet": { "offRamp": { @@ -5265,22 +2517,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "solana-devnet": { "offRamp": { @@ -5292,36 +2529,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "USDC"] }, "wemix-testnet": { "offRamp": { @@ -5333,36 +2541,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "xdai-testnet-chiado": { "offRamp": { @@ -5374,36 +2553,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] } }, "ethereum-testnet-sepolia-polygon-zkevm-1": { @@ -5417,22 +2567,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-LnM"] } }, "ethereum-testnet-sepolia-scroll-1": { @@ -5457,22 +2592,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-LnM"] } }, "ethereum-testnet-sepolia-soneium-1": { @@ -5521,36 +2641,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "USDC"] }, "solana-devnet": { "offRamp": { @@ -5562,22 +2653,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDC"] }, "sonic-testnet-blaze": { "offRamp": { @@ -5602,22 +2678,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "solana-devnet": { "offRamp": { @@ -5642,22 +2703,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-LnM"] } }, "ethereum-testnet-sepolia-zksync-1": { @@ -5671,36 +2717,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] } }, "etherlink-testnet": { @@ -5727,22 +2744,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "hemi-testnet-sepolia": { @@ -5802,22 +2804,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -5877,22 +2864,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "polygon-testnet-amoy": { "offRamp": { @@ -5943,22 +2915,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -6005,22 +2962,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "mind-testnet": { @@ -6047,22 +2989,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "monad-testnet": { @@ -6203,22 +3130,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "syrupUSDT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["syrupUSDT"] }, "ink-testnet-sepolia": { "offRamp": { @@ -6265,22 +3177,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "polkadot-testnet-astar-shibuya": { @@ -6294,36 +3191,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "167000000000000000000", - "isEnabled": true, - "rate": "100000000000000000000" - }, - "out": { - "capacity": "167000000000000000000", - "isEnabled": true, - "rate": "100000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-soneium-1": { "offRamp": { @@ -6348,36 +3216,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "bsc-testnet": { "offRamp": { @@ -6389,36 +3228,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-holesky": { "offRamp": { @@ -6441,50 +3251,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM", "USDC"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -6518,36 +3285,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "jovay-testnet": { "offRamp": { @@ -6581,22 +3319,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDC"] }, "wemix-testnet": { "offRamp": { @@ -6608,36 +3331,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "xdai-testnet-chiado": { "offRamp": { @@ -6649,36 +3343,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] } }, "polygon-testnet-tatara": { @@ -6703,22 +3368,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia": { "offRamp": { @@ -6765,36 +3415,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -6830,22 +3451,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "solana-devnet": { "offRamp": { @@ -6870,22 +3476,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia": { "offRamp": { @@ -6897,22 +3488,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -6924,22 +3500,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -6951,22 +3512,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-optimism-1": { "offRamp": { @@ -6978,22 +3524,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "solana-devnet": { "offRamp": { @@ -7040,22 +3571,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000", - "isEnabled": true, - "rate": "167000000000" - }, - "out": { - "capacity": "100000000000000", - "isEnabled": true, - "rate": "167000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia": { "offRamp": { @@ -7067,50 +3583,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000", - "isEnabled": true, - "rate": "167000000000" - }, - "out": { - "capacity": "100000000000000", - "isEnabled": true, - "rate": "167000000000" - } - } - }, - "syrupUSDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "USDC", "syrupUSDC"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -7122,22 +3595,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000", - "isEnabled": true, - "rate": "167000000000" - }, - "out": { - "capacity": "100000000000000", - "isEnabled": true, - "rate": "167000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -7149,22 +3607,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000", - "isEnabled": true, - "rate": "167000000000" - }, - "out": { - "capacity": "100000000000000", - "isEnabled": true, - "rate": "167000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-optimism-1": { "offRamp": { @@ -7176,36 +3619,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000", - "isEnabled": true, - "rate": "167000000000" - }, - "out": { - "capacity": "100000000000000", - "isEnabled": true, - "rate": "167000000000" - } - } - }, - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "USDC"] }, "ethereum-testnet-sepolia-unichain-1": { "offRamp": { @@ -7217,22 +3631,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDC"] }, "ethereum-testnet-sepolia-worldchain-1": { "offRamp": { @@ -7288,22 +3687,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "USDC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["USDC"] }, "polygon-testnet-tatara": { "offRamp": { @@ -7348,22 +3732,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000", - "isEnabled": true, - "rate": "167000000000" - }, - "out": { - "capacity": "100000000000000", - "isEnabled": true, - "rate": "167000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "sonic-testnet-blaze": { @@ -7377,22 +3746,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "bsc-testnet": { "offRamp": { @@ -7426,22 +3780,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -7508,22 +3847,7 @@ "enforceOutOfOrder": true, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "superseed-testnet": { @@ -7550,22 +3874,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "treasure-testnet-topaz": { @@ -7603,36 +3912,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "bsc-testnet": { "offRamp": { @@ -7644,36 +3924,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia": { "offRamp": { @@ -7685,36 +3936,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -7726,36 +3948,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -7778,22 +3971,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-LnM"] }, "ethereum-testnet-sepolia-optimism-1": { "offRamp": { @@ -7805,36 +3983,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "polygon-testnet-amoy": { "offRamp": { @@ -7846,36 +3995,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] } }, "xdai-testnet-chiado": { @@ -7900,36 +4020,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "bsc-testnet": { "offRamp": { @@ -7941,36 +4032,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia": { "offRamp": { @@ -7982,36 +4044,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-arbitrum-1": { "offRamp": { @@ -8023,36 +4056,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-base-1": { "offRamp": { @@ -8064,36 +4068,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "ethereum-testnet-sepolia-optimism-1": { "offRamp": { @@ -8105,36 +4080,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] }, "plasma-testnet": { "offRamp": { @@ -8157,36 +4103,7 @@ "enforceOutOfOrder": false, "version": "1.5.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - }, - "CCIP-LnM": { - "rateLimiterConfig": { - "in": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - }, - "out": { - "capacity": "100000000000000000000000", - "isEnabled": true, - "rate": "167000000000000000000" - } - } - } - } + "supportedTokens": ["CCIP-BnM", "CCIP-LnM"] } }, "xdc-testnet": { @@ -8200,22 +4117,7 @@ "enforceOutOfOrder": false, "version": "1.6.0" }, - "supportedTokens": { - "CCIP-BnM": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - } - } + "supportedTokens": ["CCIP-BnM"] } }, "zora-testnet": { diff --git a/src/config/data/ccip/v1_2_0/testnet/tokens.json b/src/config/data/ccip/v1_2_0/testnet/tokens.json index 3f0963c8f72..21d9fb96e86 100644 --- a/src/config/data/ccip/v1_2_0/testnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/testnet/tokens.json @@ -4,7 +4,11 @@ "allowListEnabled": false, "decimals": 8, "name": "Aptos Coin", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "APT", "tokenAddress": "0x000000000000000000000000000000000000000000000000000000000000000A" } @@ -14,8 +18,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xAA1Bbe60dE447706e8E676edB6dbFfe8Cf7BB69a", - "poolType": "burnMint", + "pool": { + "address": "0xAA1Bbe60dE447706e8E676edB6dbFfe8Cf7BB69a", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x596b8A0A2A63E5B4b2c0e201c4C27078642c8509" }, @@ -23,8 +31,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x812E0EaB33c1A34Ff651bfBD63Cd3A8AcD63b2F5", - "poolType": "burnMint", + "pool": { + "address": "0x812E0EaB33c1A34Ff651bfBD63Cd3A8AcD63b2F5", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xF48cae4B1F4EB3a1682600D4F3aFA166db5B162E" }, @@ -32,8 +44,12 @@ "allowListEnabled": false, "decimals": 8, "name": "CCIP-BnM", - "poolAddress": "0x65ad4cb3142cab5100a4eeed34e2005cbb1fcae42fc688e3c96b0c33ae16e6b9", - "poolType": "burnMint", + "pool": { + "address": "0x65ad4cb3142cab5100a4eeed34e2005cbb1fcae42fc688e3c96b0c33ae16e6b9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xa680c9935c7ea489676fa0e01f1ff8a97fadf0cb35e1e06ba1ba32ecd882fc9a" }, @@ -41,8 +57,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x10e3A37ff21c20CD802fdAF0204e2Ff04e5485ee", - "poolType": "burnMint", + "pool": { + "address": "0x10e3A37ff21c20CD802fdAF0204e2Ff04e5485ee", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4" }, @@ -50,8 +70,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x05D5c0CAA8ab3f4Fb8627956ed027039e854f16A", - "poolType": "burnMint", + "pool": { + "address": "0x05D5c0CAA8ab3f4Fb8627956ed027039e854f16A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x0643fD73C261eC4B369C3a8C5c0eC8c57485E32d" }, @@ -59,8 +83,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x71Da9f1fbc06f0C3364fA066C4aa8280886Ca79e", - "poolType": "burnMint", + "pool": { + "address": "0x71Da9f1fbc06f0C3364fA066C4aa8280886Ca79e", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xEc9c9E6A862BA7aee87731110a01A2f087EC7ECc" }, @@ -68,8 +96,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xE5AA8132cC86c2618a55723A3418EA7ED5FFf074", - "poolType": "burnMint", + "pool": { + "address": "0xE5AA8132cC86c2618a55723A3418EA7ED5FFf074", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x3B7d0d0CeC08eBF8dad58aCCa4719791378b2329" }, @@ -77,8 +109,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x9F49971B7c86E258f25f5A2E1fe740c0e1B903F1", - "poolType": "burnMint", + "pool": { + "address": "0x9F49971B7c86E258f25f5A2E1fe740c0e1B903F1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xbFA2ACd33ED6EEc0ed3Cc06bF1ac38d22b36B9e9" }, @@ -86,8 +122,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x0833975C065e821C84bE70C4935916579b5a0731", - "poolType": "burnMint", + "pool": { + "address": "0x0833975C065e821C84bE70C4935916579b5a0731", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x7e503dd1dAF90117A1b79953321043d9E6815C72" }, @@ -95,8 +135,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xe6fAb999cA267205AB4c55D4a0319794A0d0C082", - "poolType": "burnMint", + "pool": { + "address": "0xe6fAb999cA267205AB4c55D4a0319794A0d0C082", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x028E1B6f424c5A96E4bD5e1bbaB8b3C9088e5D39" }, @@ -104,8 +148,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xcF8830447D5D7A02f0f5e0406C29FA3B7E27EB57", - "poolType": "burnMint", + "pool": { + "address": "0xcF8830447D5D7A02f0f5e0406C29FA3B7E27EB57", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xdd578844095DB1837A96c353F8f237f6cDC79bED" }, @@ -113,8 +161,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xd959A5B20e0CD198eE16300977079E4b7742e3f1", - "poolType": "burnMint", + "pool": { + "address": "0xd959A5B20e0CD198eE16300977079E4b7742e3f1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x6122841A203d34Cd3087c3C19d04d101F6FaF8e8" }, @@ -122,8 +174,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xe3C755bE5409ACb76944B6Fee83413f080503885", - "poolType": "burnMint", + "pool": { + "address": "0xe3C755bE5409ACb76944B6Fee83413f080503885", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x54B50385e417469dbdb697f40651e8864664D992" }, @@ -131,8 +187,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x693926456C8b210f56E29Bc5b4514B32A5224c88", - "poolType": "burnMint", + "pool": { + "address": "0x693926456C8b210f56E29Bc5b4514B32A5224c88", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x69521081Fd90669b59b1Cb3F67a2229D36a7De00" }, @@ -140,8 +200,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x4CcbDd6CF18800360161E4D2A519A2047176bDF0", - "poolType": "burnMint", + "pool": { + "address": "0x4CcbDd6CF18800360161E4D2A519A2047176bDF0", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05" }, @@ -149,8 +213,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x01Fc8b86A16279F3f9302B20949Bd3Aba9AC7D9a", - "poolType": "burnMint", + "pool": { + "address": "0x01Fc8b86A16279F3f9302B20949Bd3Aba9AC7D9a", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x20Aa09AAb761e2E600d65c6929A9fd1E59821D3f" }, @@ -158,8 +226,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x4d27Ff41AeC442562215a2CE1407cE252807890c", - "poolType": "burnMint", + "pool": { + "address": "0x4d27Ff41AeC442562215a2CE1407cE252807890c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xA8C0c11bf64AF62CDCA6f93D3769B88BdD7cb93D" }, @@ -167,8 +239,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x3C12a7dA5234d1080C46baABC05efB8Fde00816b", - "poolType": "burnMint", + "pool": { + "address": "0x3C12a7dA5234d1080C46baABC05efB8Fde00816b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x88A2d74F47a237a62e7A51cdDa67270CE381555e" }, @@ -176,8 +252,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x8D7Db7B563606DbDA8e5FD57d0BAdcAE6914212E", - "poolType": "burnMint", + "pool": { + "address": "0x8D7Db7B563606DbDA8e5FD57d0BAdcAE6914212E", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x8D122C3e8ce9C8B62b87d3551bDfD8C259Bb0771" }, @@ -185,8 +265,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xedFb4A5171A34024F5908627CE186a14d01AeF4A", - "poolType": "burnMint", + "pool": { + "address": "0xedFb4A5171A34024F5908627CE186a14d01AeF4A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xB0F91Ce2ECAa3555D4b1fD4489bD9a207a7844f0" }, @@ -194,8 +278,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x5027F0B1a3ac0c531750B96f419573B426A37eE3", - "poolType": "burnMint", + "pool": { + "address": "0x5027F0B1a3ac0c531750B96f419573B426A37eE3", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x03B2F16FC12010d2e35055092055674645C38378" }, @@ -203,8 +291,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xCa0d36eC52dA4b466f2bAd1A97C6130775870b78", - "poolType": "burnMint", + "pool": { + "address": "0xCa0d36eC52dA4b466f2bAd1A97C6130775870b78", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xEA8cA8AE1c54faB8D185FC1fd7C2d70Bee8a417e" }, @@ -212,8 +304,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x7ECBE3416d92E8d79C8e5d8EB8Aad5DdEdAa0237", - "poolType": "burnMint", + "pool": { + "address": "0x7ECBE3416d92E8d79C8e5d8EB8Aad5DdEdAa0237", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xB9d4e1141E67ECFedC8A8139b5229b7FF2BF16F5" }, @@ -221,8 +317,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x95A7B37D1958D25eD1758edc930B47e5616b7226", - "poolType": "burnMint", + "pool": { + "address": "0x95A7B37D1958D25eD1758edc930B47e5616b7226", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x8aF4204e30565DF93352fE8E1De78925F6664dA7" }, @@ -230,8 +330,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x08389B66018D77fbe1d48CA21D127E804f8a6a2C", - "poolType": "burnMint", + "pool": { + "address": "0x08389B66018D77fbe1d48CA21D127E804f8a6a2C", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x6122841A203d34Cd3087c3C19d04d101F6FaF8e8" }, @@ -239,8 +343,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xb92d527977768075926D3f6C134D3700f39AF788", - "poolType": "burnMint", + "pool": { + "address": "0xb92d527977768075926D3f6C134D3700f39AF788", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x8fdE0C794fDA5a7A303Ce216f79B9695a7714EcB" }, @@ -248,8 +356,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x979f90eC3444e7E6E8567EF26998C6328Ca637E2", - "poolType": "burnMint", + "pool": { + "address": "0x979f90eC3444e7E6E8567EF26998C6328Ca637E2", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xFf6d0c1518A8104611f482eb2801CaF4f13c9dEb" }, @@ -257,8 +369,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xd3870F30fe8730A0760C02C24b2de36Ad97FAa18", - "poolType": "burnMint", + "pool": { + "address": "0xd3870F30fe8730A0760C02C24b2de36Ad97FAa18", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x01Ac06943d2B8327a7845235Ef034741eC1Da352" }, @@ -266,8 +382,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x4B07cd55bbD45C9df160C54C62c3933c26594C6A", - "poolType": "burnMint", + "pool": { + "address": "0x4B07cd55bbD45C9df160C54C62c3933c26594C6A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x414dbe1d58dd9BA7C84f7Fc0e4f82bc858675d37" }, @@ -275,8 +395,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x2bF249E1796D5F3a293dFB0B084f52bF5D3f35CB", - "poolType": "burnMint", + "pool": { + "address": "0x2bF249E1796D5F3a293dFB0B084f52bF5D3f35CB", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xB45B9eb94F25683B47e5AFb0f74A05a58be86311" }, @@ -284,8 +408,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xefE6Aa4551184612ABe166ccEe032e0eda748e9b", - "poolType": "burnMint", + "pool": { + "address": "0xefE6Aa4551184612ABe166ccEe032e0eda748e9b", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x62325603b3550CbF763cb47F9Fe081dD977e728a" }, @@ -293,8 +421,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x996EfAb6011896Be832969D91E9bc1b3983cfdA1", - "poolType": "burnMint", + "pool": { + "address": "0x996EfAb6011896Be832969D91E9bc1b3983cfdA1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xbD6F12f358D8ee3b35B0AD612450a186bA866B72" }, @@ -302,8 +434,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x0643fD73C261eC4B369C3a8C5c0eC8c57485E32d", - "poolType": "burnMint", + "pool": { + "address": "0x0643fD73C261eC4B369C3a8C5c0eC8c57485E32d", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x56408DC41E35d3E8E92A16bc94787438df9387a1" }, @@ -311,8 +447,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x8D7Db7B563606DbDA8e5FD57d0BAdcAE6914212E", - "poolType": "burnMint", + "pool": { + "address": "0x8D7Db7B563606DbDA8e5FD57d0BAdcAE6914212E", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x225fAc4130595d1C7dabbE61A8bA9B051440b76c" }, @@ -320,8 +460,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x812cF48d7e39107f19f580104eCCf7C4F6c162EE", - "poolType": "burnMint", + "pool": { + "address": "0x812cF48d7e39107f19f580104eCCf7C4F6c162EE", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xc49ec0eB4beb48B8Da4cceC51AA9A5bD0D0A4c43" }, @@ -329,8 +473,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x4122fe199B6e489a89f54c67245Be33bf602935F", - "poolType": "burnMint", + "pool": { + "address": "0x4122fe199B6e489a89f54c67245Be33bf602935F", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xcab0EF91Bee323d1A617c0a027eE753aFd6997E4" }, @@ -338,8 +486,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x9116547A104C4Bb2531EacdC5A6695019eea5387", - "poolType": "burnMint", + "pool": { + "address": "0x9116547A104C4Bb2531EacdC5A6695019eea5387", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xc3B04ce056D8E44AA43BE1e23D554ef2AA3a9f58" }, @@ -347,8 +499,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x15A542b074B1ec3a52F2B3eC91efc15ECf6f24dC", - "poolType": "burnMint", + "pool": { + "address": "0x15A542b074B1ec3a52F2B3eC91efc15ECf6f24dC", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x88DD2416699Bad3AeC58f535BC66F7f62DE2B2EC" }, @@ -356,8 +512,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x5B0340e56135eA391ceb64f1B5df65BD838B6365", - "poolType": "burnMint", + "pool": { + "address": "0x5B0340e56135eA391ceb64f1B5df65BD838B6365", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x271F22d029c6edFc9469faE189C4F43E457F257C" }, @@ -365,8 +525,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x694f112E941472c8806b853Db714c29387396FBb", - "poolType": "burnMint", + "pool": { + "address": "0x694f112E941472c8806b853Db714c29387396FBb", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x81249b4bD91A8706eE67a2f422DB82258D4947ad" }, @@ -374,8 +538,12 @@ "allowListEnabled": false, "decimals": 9, "name": "CCIP-BnM", - "poolAddress": "BqGg42v35Ghuigi4smWU9KKQTUnQb5ATocDbJikHjocS", - "poolType": "burnMint", + "pool": { + "address": "BqGg42v35Ghuigi4smWU9KKQTUnQb5ATocDbJikHjocS", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "3PjyGzj1jGVgHSKS4VR1Hr1memm63PmN8L9rtPDKwzZ6" }, @@ -383,8 +551,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xB31e0A1A02bce6a8386C812f1dD80572f6f3a717", - "poolType": "burnMint", + "pool": { + "address": "0xB31e0A1A02bce6a8386C812f1dD80572f6f3a717", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x230c46b9a7c8929A80863bDe89082B372a4c7A99" }, @@ -392,8 +564,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x82087E24B4C5f0a1fc8A3Feef10657420A5690C4", - "poolType": "burnMint", + "pool": { + "address": "0x82087E24B4C5f0a1fc8A3Feef10657420A5690C4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x4Bc8740F54eC7CD6738f19ff00438bFE3DCbceB3" }, @@ -401,8 +577,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xD2c13079256523607EA273422f41956F9205653c", - "poolType": "burnMint", + "pool": { + "address": "0xD2c13079256523607EA273422f41956F9205653c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xF4E4057FbBc86915F4b2d63EEFFe641C03294ffc" }, @@ -410,8 +590,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0xA3Ab1330b7275402A38e02Bd22F237CD6B2c68Fb", - "poolType": "burnMint", + "pool": { + "address": "0xA3Ab1330b7275402A38e02Bd22F237CD6B2c68Fb", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "CCIP-BnM", "tokenAddress": "0xA189971a2c5AcA0DFC5Ee7a2C44a2Ae27b3CF389" }, @@ -419,8 +603,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-BnM", - "poolAddress": "0x61876F0429726D7777B46f663e1C9ab75d08Fc56", - "poolType": "burnMint", + "pool": { + "address": "0x61876F0429726D7777B46f663e1C9ab75d08Fc56", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "CCIP-BnM", "tokenAddress": "0x1350D63CAEc50778A132e1Ab85D43a3B50FD61dD" } @@ -430,8 +618,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x8e35eB0dfb39Ec5F84254C3f863986a913171E0B", - "poolType": "burnMint", + "pool": { + "address": "0x8e35eB0dfb39Ec5F84254C3f863986a913171E0B", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x70F5c5C40b873EA597776DA2C21929A8282A3b35" }, @@ -439,8 +631,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0xc3b32Cc1e0207648d174d38AfD659332D4d11341", - "poolType": "burnMint", + "pool": { + "address": "0xc3b32Cc1e0207648d174d38AfD659332D4d11341", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x79a4Fc27f69323660f5Bfc12dEe21c3cC14f5901" }, @@ -448,8 +644,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x049627974516Eb171FD91EdE659a291e17836eD7", - "poolType": "burnMint", + "pool": { + "address": "0x049627974516Eb171FD91EdE659a291e17836eD7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x7F4e739D40E58BBd59dAD388171d18e37B26326f" }, @@ -457,8 +657,12 @@ "allowListEnabled": false, "decimals": 18, "name": "CCIP-LnM", - "poolAddress": "0x658FdaC59a197D5166151640b7a673F7dF1Ba324", - "poolType": "lockRelease", + "pool": { + "address": "0x658FdaC59a197D5166151640b7a673F7dF1Ba324", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "CCIP-LnM", "tokenAddress": "0x466D489b6d36E7E3b824ef491C225F5830E81cC1" }, @@ -466,8 +670,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0xC64011eD08A2263F87AE8eF05b7d41EfC91f4AFD", - "poolType": "burnMint", + "pool": { + "address": "0xC64011eD08A2263F87AE8eF05b7d41EfC91f4AFD", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x705b364CadE0e515577F2646529e3A417473a155" }, @@ -475,8 +683,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x056B16D54bCAea1C14036Bb78Fe8338d892F0262", - "poolType": "burnMint", + "pool": { + "address": "0x056B16D54bCAea1C14036Bb78Fe8338d892F0262", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x139E99f0ab4084E14e6bb7DacA289a91a2d92927" }, @@ -484,8 +696,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0xB8937715574FC00a88408582C8406653a16495D7", - "poolType": "burnMint", + "pool": { + "address": "0xB8937715574FC00a88408582C8406653a16495D7", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0xA98FA8A008371b9408195e52734b1768c0d1Cb5c" }, @@ -493,8 +709,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x4bd6F0785Cbe5200EBc98c1496e29C279E18ABDe", - "poolType": "burnMint", + "pool": { + "address": "0x4bd6F0785Cbe5200EBc98c1496e29C279E18ABDe", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x35347A2fC1f2a4c5Eae03339040d0b83b09e6FDA" }, @@ -502,8 +722,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0xa77c73A8b6239377B2648Af55d2B4501aCB1A46A", - "poolType": "burnMint", + "pool": { + "address": "0xa77c73A8b6239377B2648Af55d2B4501aCB1A46A", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x835fcBB6770E1246CfCf52F83cDcec3177d0bb6b" }, @@ -511,8 +735,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0xcDD99Ac87b8e5B0E39f47a024f7189a74c1128E4", - "poolType": "burnMint", + "pool": { + "address": "0xcDD99Ac87b8e5B0E39f47a024f7189a74c1128E4", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0xA7EA79b9E466e8D2a440128867ed399bC78f4aaE" }, @@ -520,8 +748,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x2979C66FaBb41f67451F0BcB2A668382f92959a1", - "poolType": "burnMint", + "pool": { + "address": "0x2979C66FaBb41f67451F0BcB2A668382f92959a1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0xCdeE7708A96479f6D029741144f458B7FA807A6C" }, @@ -529,8 +761,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x31C110BaffaADc5a0eC9738cD8C6670123C1926c", - "poolType": "burnMint", + "pool": { + "address": "0x31C110BaffaADc5a0eC9738cD8C6670123C1926c", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x86f9Eed8EAD1534D87d23FbAB247D764fC725D49" }, @@ -538,8 +774,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x69B5126A10582063B17fa3b614C5Ac6b0f1D23Ba", - "poolType": "burnMint", + "pool": { + "address": "0x69B5126A10582063B17fa3b614C5Ac6b0f1D23Ba", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x044a6B4b561af69D2319A2f4be5Ec327a6975D0a" }, @@ -547,8 +787,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x036bf900C4690961ad5AE8f104547824C76583c1", - "poolType": "burnMint", + "pool": { + "address": "0x036bf900C4690961ad5AE8f104547824C76583c1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0xA4C9e2108ca478DE0B91c7D9Ba034bbc93C22Ecc" }, @@ -556,8 +800,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x08aa3aeB96bd89D0228f2d3373A5cEE453F7a304", - "poolType": "burnMint", + "pool": { + "address": "0x08aa3aeB96bd89D0228f2d3373A5cEE453F7a304", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x0298e204F9131d45EEb436D693f32C6eA1190622" }, @@ -565,8 +813,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x48d73fcEc510aCED85E7aC288A896AB614C73Af2", - "poolType": "burnMint", + "pool": { + "address": "0x48d73fcEc510aCED85E7aC288A896AB614C73Af2", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0xd70f29744f03F10b7EC2443Bd294B7E62D654c5b" }, @@ -574,8 +826,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x06f1097Ec4376964fE32153F72ea39CA35679992", - "poolType": "burnMint", + "pool": { + "address": "0x06f1097Ec4376964fE32153F72ea39CA35679992", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "LnM", "tokenAddress": "0xBf8eA19505ab7Eb266aeD435B11bd56321BFB5c5" }, @@ -583,8 +839,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x2B758a239f6B8Fb422d069B1b04A7b8c2A60209D", - "poolType": "burnMint", + "pool": { + "address": "0x2B758a239f6B8Fb422d069B1b04A7b8c2A60209D", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0xB9d4e1141E67ECFedC8A8139b5229b7FF2BF16F5" }, @@ -592,8 +852,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0xb15799a06A69cf4E825F3b0F3082903E09E0Ecc1", - "poolType": "burnMint", + "pool": { + "address": "0xb15799a06A69cf4E825F3b0F3082903E09E0Ecc1", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.0" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x3d357fb52253e86c8Ee0f80F5FfE438fD9503FF2" }, @@ -601,8 +865,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0x17a9049600902Ba429B3A5761d02A9C4E052eE40", - "poolType": "burnMint", + "pool": { + "address": "0x17a9049600902Ba429B3A5761d02A9C4E052eE40", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x04B1F917a3ba69Fa252564414DdAFc82fA1B5178" }, @@ -610,8 +878,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0xC212AD0E6EBE962a3626509A0efE363380c30F46", - "poolType": "burnMint", + "pool": { + "address": "0xC212AD0E6EBE962a3626509A0efE363380c30F46", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0xcb342aE3D65E3fEDF8F912B0432e2B8F88514d5D" }, @@ -619,8 +891,12 @@ "allowListEnabled": false, "decimals": 18, "name": "clCCIP-LnM", - "poolAddress": "0xe036d1B13B108f1f5DFF25EB2e66538a8DcC07c9", - "poolType": "burnMint", + "pool": { + "address": "0xe036d1B13B108f1f5DFF25EB2e66538a8DcC07c9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "clCCIP-LnM", "tokenAddress": "0x30DeCD269277b8094c00B0bacC3aCaF3fF4Da7fB" } @@ -630,7 +906,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Frax Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "frxETH", "tokenAddress": "0xFC00000000000000000000000000000000000006" } @@ -640,7 +920,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xd211Bd4ff8fd68C16016C5c7a66b6e10F6227C49" }, @@ -648,7 +932,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x6641415a61bCe80D97a715054d1334360Ab833Eb" }, @@ -656,7 +944,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xa787B3E0471b718bBfEaA59B502fd0C4EBd7b74E" }, @@ -664,7 +956,11 @@ "allowListEnabled": false, "decimals": 8, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x3d5d565c271d6b9c52f1a963f2b7bddad3453b0de2ace5e254b8db6549cc335e" }, @@ -672,7 +968,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846" }, @@ -680,7 +980,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x52CEEed7d3f8c6618e4aaD6c6e555320d0D83271" }, @@ -688,7 +992,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x56E16E648c51609A14Eb14B99BAB771Bee797045" }, @@ -696,7 +1004,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x2A5bACb2440BC17D53B7b9Be73512dDf92265e48" }, @@ -704,7 +1016,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x7311DED199CC28D80E58e81e8589aa160199FCD2" }, @@ -712,7 +1028,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x436a1907D9e6a65E6db73015F08f9C66F6B63E45" }, @@ -720,7 +1040,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xB904d5b9a1e74F6576fFF550EeE75Eaa68e2dd50" }, @@ -728,7 +1052,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x39dD98CcCC3a51b2c0007e23517488e363581264" }, @@ -736,7 +1064,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xcd2AfB2933391E35e8682cbaaF75d9CA7339b183" }, @@ -744,7 +1076,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06" }, @@ -752,7 +1088,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x32E08557B14FaD8908025619797221281D439071" }, @@ -760,7 +1100,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x6C475841d1D7871940E93579E5DBaE01634e17aA" }, @@ -768,7 +1112,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x2896e619Fa7c831A7E52b87EffF4d671bEc6B262" }, @@ -776,7 +1124,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xB96217A159cB11Bc51E87c8CAe46C7dF8826A827" }, @@ -784,7 +1136,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x685cE6742351ae9b618F383883D6d1e0c5A31B4B" }, @@ -792,7 +1148,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xb192c5Fb8e33694F0CFD4357806a63dc59feEBEF" }, @@ -800,7 +1160,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x01fcdEedbA59bc68b0914D92277678dAB6827e2c" }, @@ -808,7 +1172,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xe5e3a4fF1773d043a387b16Ceb3c91cC49bAFD54" }, @@ -816,7 +1184,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x779877A7B0D9E8603169DdbD7836e478b4624789" }, @@ -824,7 +1196,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x9870D6a0e05F867EAAe696e106741843F7fD116D" }, @@ -832,7 +1208,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xb1D4538B4571d411F07960EF2838Ce337FE1E80E" }, @@ -840,7 +1220,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xE4aB69C077896252FAFBD49EFD26B5D171A32410" }, @@ -848,7 +1232,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x02c359ebf98fc8BF793F970F9B8302bb373BdF32" }, @@ -856,7 +1244,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x996EfAb6011896Be832969D91E9bc1b3983cfdA1" }, @@ -864,7 +1256,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x8418c4d7e8e17ab90232DC72150730E6c4b84F57" }, @@ -872,7 +1268,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xa75cCA5b404ec6F4BB6EC4853D177FE7057085c8" }, @@ -880,7 +1280,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x7f1b9eE544f9ff9bB521Ab79c205d79C55250a36" }, @@ -888,7 +1292,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xF64E6E064a71B45514691D397ad4204972cD6508" }, @@ -896,7 +1304,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x6641415a61bCe80D97a715054d1334360Ab833Eb" }, @@ -904,7 +1316,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x22bdEdEa0beBdD7CfFC95bA53826E55afFE9DE04" }, @@ -912,7 +1328,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x925a4bfE64AE2bFAC8a02b35F78e60C29743755d" }, @@ -920,7 +1340,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xE4aB69C077896252FAFBD49EFD26B5D171A32410" }, @@ -928,7 +1352,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x5576815a38A3706f37bf815b261cCc7cCA77e975" }, @@ -936,7 +1364,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x231d45b53C905c3d6201318156BDC725c9c3B9B1" }, @@ -944,7 +1376,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x7ea13478Ea3961A0e8b538cb05a9DF0477c79Cd2" }, @@ -952,7 +1388,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xda40816f278Cd049c137F6612822D181065EBfB4" }, @@ -960,7 +1400,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xC82Ea35634BcE95C394B6BC00626f827bB0F4801" }, @@ -968,7 +1412,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x724593f6FCb0De4E6902d4C55D7C74DaA2AF0E55" }, @@ -976,7 +1424,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x23A1aFD896c8c8876AF46aDc38521f4432658d1e" }, @@ -984,7 +1436,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xE02E6E94d4a5E215F308bDd564a1B6f13AA56950" }, @@ -992,7 +1448,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x90a386d59b9A6a4795a011e8f032Fc21ED6FEFb6" }, @@ -1000,7 +1460,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x5246409a2e09134824c4E709602205B176491e57" }, @@ -1008,7 +1472,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x3423C922911956b1Ccbc2b5d4f38216a6f4299b4" }, @@ -1016,7 +1484,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x7311DED199CC28D80E58e81e8589aa160199FCD2" }, @@ -1024,7 +1496,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xd3e461C55676B10634a5F81b747c324B85686Dd1" }, @@ -1032,7 +1508,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xAF3243f975afe2269Da8Ffa835CA3A8F8B6A5A36" }, @@ -1040,7 +1520,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x4d03398C2588D92B220578dAEde29814E41c8033" }, @@ -1048,7 +1532,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xe5e3a4fF1773d043a387b16Ceb3c91cC49bAFD54" }, @@ -1056,7 +1544,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x7ECBE3416d92E8d79C8e5d8EB8Aad5DdEdAa0237" }, @@ -1064,7 +1556,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xE0352dEd874c3E72d922CE533E136385fBE4a9B4" }, @@ -1072,7 +1568,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x7ECBE3416d92E8d79C8e5d8EB8Aad5DdEdAa0237" }, @@ -1080,7 +1580,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x6fE981Dbd557f81ff66836af0932cba535Cbc343" }, @@ -1088,7 +1592,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x7F85bAC57B5D4b81F866F495c30AB8C8c453f6FD" }, @@ -1096,7 +1604,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x2f79e049f552E600D5d8118923278Aa0fCD67179" }, @@ -1104,7 +1616,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xe5e3a4fF1773d043a387b16Ceb3c91cC49bAFD54" }, @@ -1112,7 +1628,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xB97e3665AEAF96BDD6b300B2e0C93C662104A068" }, @@ -1120,7 +1640,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xe74037112db8807B3B4B3895F5790e5bc1866a29" }, @@ -1128,7 +1652,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x0Fd9e8d3aF1aaee056EB9e802c3A762a667b1904" }, @@ -1136,7 +1664,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x29261B6Fb93097885bEB714ee253Da63A52dFc46" }, @@ -1144,7 +1676,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x5bB50A6888ee6a67E22afFDFD9513be7740F1c15" }, @@ -1152,7 +1688,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xA9d21ed8260DE08fF39DC5e7B65806d4e1CB817B" }, @@ -1160,7 +1700,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0x44637eEfD71A090990f89faEC7022fc74B2969aD" }, @@ -1168,7 +1712,11 @@ "allowListEnabled": false, "decimals": 9, "name": "Chainlink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "LinkhB3afbBKb2EQQu7s7umdZceV3wcvAUJhQAfQ23L" }, @@ -1176,7 +1724,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0xd8C1eEE32341240A62eC8BC9988320bcC13c8580" }, @@ -1184,7 +1736,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xA3063eE34d9B4E407DF0E153c9bE679680e3A956" }, @@ -1192,7 +1748,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xe5e3a4fF1773d043a387b16Ceb3c91cC49bAFD54" }, @@ -1200,7 +1760,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0x0FE9fAAF3e26f756443fd8f92F6711989a8e0fF5" }, @@ -1208,7 +1772,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "LINK", "tokenAddress": "0x3580c7A817cCD41f7e02143BFa411D4EeAE78093" }, @@ -1216,7 +1784,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xDCA67FD8324990792C0bfaE95903B8A64097754F" }, @@ -1224,7 +1796,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "LINK", "tokenAddress": "0xe5e3a4fF1773d043a387b16Ceb3c91cC49bAFD54" }, @@ -1232,7 +1808,11 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "LINK", "tokenAddress": "0xBEDDEB2DF8904cdBCFB6Bf29b91d122D5Ae4eb7e" } @@ -1242,7 +1822,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped A0GI", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WA0GI", "tokenAddress": "0x1Cd0690fF9a693f5EF2dD976660a8dAFc81A109c" } @@ -1252,8 +1836,12 @@ "allowListEnabled": false, "decimals": 6, "name": "S-USDCircle", - "poolAddress": "0x98C80d0235Eaae38200720Ae86e2D6a62b3B19c9", - "poolType": "lockRelease", + "pool": { + "address": "0x98C80d0235Eaae38200720Ae86e2D6a62b3B19c9", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.5.0" + }, "symbol": "syrupUSDCircle", "tokenAddress": "0xb1206B74F612F478c12A647D12E7e822AF5D8244" }, @@ -1261,8 +1849,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDC", - "poolAddress": "0xB2F73a7540A000b383e8a9ffb3BdEECc4709Dc4D", - "poolType": "burnMint", + "pool": { + "address": "0xB2F73a7540A000b383e8a9ffb3BdEECc4709Dc4D", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "syrupUSDC", "tokenAddress": "0xbc9A4b299741CBf2A8eD5D2078A426027C31B2A3" }, @@ -1270,8 +1862,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDC", - "poolAddress": "0xB6bD6e3e56a8E28CCbE44b6442cA8b586B964Af8", - "poolType": "burnMint", + "pool": { + "address": "0xB6bD6e3e56a8E28CCbE44b6442cA8b586B964Af8", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "syrupUSDC", "tokenAddress": "0x183F67cE6CCCeaBB5D79c69C2d92e78111736B62" }, @@ -1279,8 +1875,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDC", - "poolAddress": "B3rp2RHbuZeDeSSZLXww3EbaMr1TVtn9kF2a2FAobnxi", - "poolType": "burnMint", + "pool": { + "address": "B3rp2RHbuZeDeSSZLXww3EbaMr1TVtn9kF2a2FAobnxi", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "syrupUSDC", "tokenAddress": "95Er6pcK2agiTa2Jctp1BBnQtuDfX1d78XSTZKWZyXKk" } @@ -1290,8 +1890,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDT Demo", - "poolAddress": "0x83703f6601eDF05Bf9A30F03ba1F1B195BFdDEe9", - "poolType": "lockRelease", + "pool": { + "address": "0x83703f6601eDF05Bf9A30F03ba1F1B195BFdDEe9", + "rawType": "LockRelease", + "type": "lockRelease", + "version": "1.6.1" + }, "symbol": "syrupUSDT", "tokenAddress": "0x7679CBe9aE66298114AC6dAC73487B63ac023c0b" }, @@ -1299,8 +1903,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDT", - "poolAddress": "0x4F213c8374c4F223eB85d8770Fc76eAd5163FC23", - "poolType": "burnMint", + "pool": { + "address": "0x4F213c8374c4F223eB85d8770Fc76eAd5163FC23", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.5.1" + }, "symbol": "syrupUSDT", "tokenAddress": "0x1495CB0831108160405c8F453E1B8e155DbFbEdC" }, @@ -1308,8 +1916,12 @@ "allowListEnabled": false, "decimals": 6, "name": "Syrup USDT", - "poolAddress": "0x9F367a290B4Cc64d0F85B3783d332256b26143B9", - "poolType": "burnMint", + "pool": { + "address": "0x9F367a290B4Cc64d0F85B3783d332256b26143B9", + "rawType": "BurnMint", + "type": "burnMint", + "version": "1.6.1" + }, "symbol": "syrupUSDT", "tokenAddress": "0x2282DA461850d900ba7E777b6D4161a415860931" } @@ -1319,8 +1931,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USDC", - "poolAddress": "0x2f79e049f552E600D5d8118923278Aa0fCD67179", - "poolType": "usdc", + "pool": { + "address": "0x2f79e049f552E600D5d8118923278Aa0fCD67179", + "rawType": "Usdc", + "type": "usdc", + "version": "1.5.1" + }, "symbol": "USDC", "tokenAddress": "0x5425890298aed601595a70AB815c96711a31Bc65" }, @@ -1328,8 +1944,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USDC", - "poolAddress": "0x02eef4b366225362180d704C917c50f6c46af9e0", - "poolType": "usdc", + "pool": { + "address": "0x02eef4b366225362180d704C917c50f6c46af9e0", + "rawType": "Usdc", + "type": "usdc", + "version": "1.5.0" + }, "symbol": "USDC", "tokenAddress": "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238" }, @@ -1337,8 +1957,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD Coin", - "poolAddress": "0xeA2912f446Ff28663D2E5A971da751A84E409292", - "poolType": "usdc", + "pool": { + "address": "0xeA2912f446Ff28663D2E5A971da751A84E409292", + "rawType": "Usdc", + "type": "usdc", + "version": "1.5.0" + }, "symbol": "USDC", "tokenAddress": "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d" }, @@ -1346,8 +1970,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USDC", - "poolAddress": "0x63d023db6e9b2a838Cf4cc54903d2C2D825A2967", - "poolType": "usdc", + "pool": { + "address": "0x63d023db6e9b2a838Cf4cc54903d2C2D825A2967", + "rawType": "Usdc", + "type": "usdc", + "version": "1.6.1" + }, "symbol": "USDC", "tokenAddress": "0x036CbD53842c5426634e7929541eC2318f3dCF7e" }, @@ -1355,8 +1983,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USDC", - "poolAddress": "0x8E9066E66bF1B8A4eAF2344589De9ff82CE47C2d", - "poolType": "usdc", + "pool": { + "address": "0x8E9066E66bF1B8A4eAF2344589De9ff82CE47C2d", + "rawType": "Usdc", + "type": "usdc", + "version": "1.5.0" + }, "symbol": "USDC", "tokenAddress": "0x5fd84259d66Cd46123540766Be93DFE6D43130D7" }, @@ -1364,8 +1996,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USDC", - "poolAddress": "0xB45B9eb94F25683B47e5AFb0f74A05a58be86311", - "poolType": "usdc", + "pool": { + "address": "0xB45B9eb94F25683B47e5AFb0f74A05a58be86311", + "rawType": "Usdc", + "type": "usdc", + "version": "1.6.1" + }, "symbol": "USDC", "tokenAddress": "0x31d0220469e10c4E71834a79b1f276d740d3768F" }, @@ -1373,8 +2009,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USDC", - "poolAddress": "0x4F213c8374c4F223eB85d8770Fc76eAd5163FC23", - "poolType": "usdc", + "pool": { + "address": "0x4F213c8374c4F223eB85d8770Fc76eAd5163FC23", + "rawType": "Usdc", + "type": "usdc", + "version": "1.6.1" + }, "symbol": "USDC", "tokenAddress": "0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582" }, @@ -1382,8 +2022,12 @@ "allowListEnabled": false, "decimals": 6, "name": "USD Coin", - "poolAddress": "7hCNZAWQNSq49CCA1KtjLuZbK5cWguRSVVsJcMa3C5zL", - "poolType": "usdc", + "pool": { + "address": "7hCNZAWQNSq49CCA1KtjLuZbK5cWguRSVVsJcMa3C5zL", + "rawType": "Usdc", + "type": "usdc", + "version": "1.5.1" + }, "symbol": "USDC", "tokenAddress": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU" } @@ -1393,7 +2037,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped ApeCoin", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WAPE", "tokenAddress": "0x1762A2B15f63ca4E1165A9385cB40412CF545aC3" } @@ -1403,7 +2051,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped AVAX", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WAVAX", "tokenAddress": "0xd00ae08403B9bbb9124bB305C09058E32C39A48c" } @@ -1413,7 +2065,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Bera", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WBERA", "tokenAddress": "0x7507c1dc16935B82698e4C63f2746A2fCf994dF8" } @@ -1423,7 +2079,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped BNB", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WBNB", "tokenAddress": "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd" } @@ -1433,7 +2093,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Shibarium Wrapped BONE", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WBONE", "tokenAddress": "0x41c3F37587EBcD46C0F85eF43E38BcfE1E70Ab56" } @@ -1443,7 +2107,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped BTC", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WBTC", "tokenAddress": "0x3e57d6946f893314324C975AA9CEBBdF3232967E" }, @@ -1451,7 +2119,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped BTC TOKEN", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WBTC", "tokenAddress": "0x233631132FD56c8f86D1FC97F0b82420a8d20af3" }, @@ -1459,7 +2131,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1467,7 +2143,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Bitcoin", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WBTC", "tokenAddress": "0x1A6357313BA1B6bc92e7325A9BAf241Ca3e493dD" } @@ -1477,7 +2157,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Bitcorn", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WBTCN", "tokenAddress": "0xda5dDd7270381A7C2717aD10D1c0ecB19e3CDFb2" } @@ -1487,7 +2171,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Celo", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WCELO", "tokenAddress": "0x99604d0e2EfE7ABFb58BdE565b5330Bb46Ab3Dca" } @@ -1497,7 +2185,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped CORE", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WCORE", "tokenAddress": "0x7Ce5fCfFd1296d870b3578809B31D8CA8bF5aC3d" } @@ -1507,7 +2199,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped CRO", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WCRO", "tokenAddress": "0x5C50653Ada833D649a718ba4D1Fb9e2EE49c202d" } @@ -1517,7 +2213,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x9EDCde0257F2386Ce177C3a7FCdd97787F0D841d" }, @@ -1525,7 +2225,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1533,7 +2237,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1541,7 +2249,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x94373a4919B3240D86eA41593D5eBa789FEF3848" }, @@ -1549,7 +2261,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0xae2C46ddb314B9Ba743C6dEE4878F151881333D9" }, @@ -1557,7 +2273,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x5300000000000000000000000000000000000011" }, @@ -1565,7 +2285,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x097D90c9d3E0B50Ca60e1ae45F6A81010f9FB534" }, @@ -1573,7 +2297,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0xE591bf0A0CF924A0674d7792db046B23CEbF5f34" }, @@ -1581,7 +2309,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1589,7 +2321,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000023" }, @@ -1597,7 +2333,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000001" }, @@ -1605,7 +2345,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x06565ed324Ee9fb4DB0FF80B7eDbE4Cb007555a3" }, @@ -1613,7 +2357,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1621,7 +2369,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1629,7 +2381,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1637,7 +2393,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x1CE28d5C81B229c77C5651feB49c4C489f8c52C4" }, @@ -1645,7 +2405,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x5300000000000000000000000000000000000004" }, @@ -1653,7 +2417,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1661,7 +2429,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1669,7 +2441,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1677,7 +2453,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x4317b2eCD41851173175005783322D29E9bAee9E" }, @@ -1685,7 +2465,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x0C8aFD1b58aa2A5bAd2414B861D8A7fF898eDC3A" }, @@ -1693,7 +2477,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1701,7 +2489,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1709,7 +2501,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0xFe06d41BA962A74209845f938c387b363a931505" }, @@ -1717,7 +2513,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0xa787B3E0471b718bBfEaA59B502fd0C4EBd7b74E" }, @@ -1725,7 +2525,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x85Be6b6ff4e61C3bEB0Fb73a2A9dC3A80e279c86" }, @@ -1733,7 +2537,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1741,7 +2549,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x12e3b49DF7dD40792EFbB1B3eAB1295951Bad5EE" }, @@ -1749,7 +2561,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1757,7 +2573,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0xc2e1B8e9a765A19315cD9BbbD84a1BB6DC3FC335" }, @@ -1765,7 +2585,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1773,7 +2597,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, @@ -1781,7 +2609,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" } @@ -1791,7 +2623,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Frax Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "wfrxETH", "tokenAddress": "0xFC00000000000000000000000000000000000006" } @@ -1801,7 +2637,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped GAS v10", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WGAS10", "tokenAddress": "0x1CE16390FD09040486221e912B87551E4e44Ab17" } @@ -1811,7 +2651,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Grass", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WGRASS", "tokenAddress": "0xeee5a340Cdc9c179Db25dea45AcfD5FE8d4d3eB8" } @@ -1821,7 +2665,11 @@ "allowListEnabled": false, "decimals": 8, "name": "Wrapped HBAR", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WHBAR", "tokenAddress": "0xb1F616b8134F602c3Bb465fB5b5e6565cCAd37Ed" } @@ -1831,7 +2679,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Hashkey", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WHSK", "tokenAddress": "0x2896e619Fa7c831A7E52b87EffF4d671bEc6B262" } @@ -1841,7 +2693,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WETH", "tokenAddress": "0xF04fcEC93DEB6191B704a0ec5d0FFF2A8B2c39be" } @@ -1851,7 +2707,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped MAGIC", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WMAGIC", "tokenAddress": "0x095ded714d42cBD5fb2E84A0FfbFb140E38dC9E1" } @@ -1861,7 +2721,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Metis", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WMETIS", "tokenAddress": "0x5c48e07062aC4E2Cf4b9A768a711Aef18e8fbdA0" } @@ -1871,7 +2735,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Mantle", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WMNT", "tokenAddress": "0x19f5557E23e9914A18239990f6C70D68FDF0deD5" } @@ -1881,7 +2749,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Monad", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WMON", "tokenAddress": "0x760AfE86e5de5fa0Ee542fc7B7B713e1c5425701" } @@ -1891,7 +2763,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped OKB", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WOKB", "tokenAddress": "0xa7b9C3a116b20bEDDdBE4d90ff97157f67F0bD97" } @@ -1901,7 +2777,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Pharos", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WPHRS", "tokenAddress": "0x838800b758277CC111B2d48Ab01e5E164f8E9471" } @@ -1911,7 +2791,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Plume", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WPLUME", "tokenAddress": "0xC1FD14775c8665B31c7154074f537338774351EB" } @@ -1921,7 +2805,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Polygon Ecosystem Token", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WPOL", "tokenAddress": "0x360ad4f9a9A8EFe9A8DCB5f461c4Cc1047E1Dcf9" } @@ -1931,7 +2819,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped RBTC", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WRBTC", "tokenAddress": "0x09B6Ca5E4496238a1F176aEA6bB607db96C2286E" } @@ -1941,7 +2833,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ron", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WRON", "tokenAddress": "0xA959726154953bAe111746E265E6d754F48570E6" } @@ -1951,7 +2847,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped S", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WS", "tokenAddress": "0x917FE4b784d1895187Df169aeCc687C03ba12662" } @@ -1961,7 +2861,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Shibuya", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.1" + }, "symbol": "WSBY", "tokenAddress": "0xbd5F3751856E11f3e80dBdA567Ef91Eb7e874791" } @@ -1971,7 +2875,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped SEI", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WSEI", "tokenAddress": "0x3921eA6Cf927BE80211Bb57f19830700285b0AdA" } @@ -1981,7 +2889,11 @@ "allowListEnabled": false, "decimals": 9, "name": "Wrapped Solana", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WSOL", "tokenAddress": "So11111111111111111111111111111111111111112" } @@ -1991,7 +2903,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped TAC", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WTAC", "tokenAddress": "0xCf61405b7525F09f4E7501fc831fE7cbCc823d4c" } @@ -2001,7 +2917,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped BNB", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WBNB", "tokenAddress": "0x4200000000000000000000000000000000000006" } @@ -2011,7 +2931,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Wemix", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WWEMIX", "tokenAddress": "0xbE3686643c05f00eC46e73da594c78098F7a9Ae7" } @@ -2021,7 +2945,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped XDAI", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WXDAI", "tokenAddress": "0x18c8a7ec7897177E4529065a7E7B0878358B3BfF" } @@ -2031,7 +2959,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped XDC", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "WXDC", "tokenAddress": "0x56408DC41E35d3E8E92A16bc94787438df9387a1" } @@ -2041,7 +2973,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped XPL", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WXPL", "tokenAddress": "0x6100E367285b01F48D07953803A2d8dCA5D19873" } @@ -2051,7 +2987,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped XTZ", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.5.0" + }, "symbol": "WXTZ", "tokenAddress": "0xB1Ea698633d57705e93b0E40c1077d46CD6A51d8" } @@ -2061,7 +3001,11 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped zkCRO", - "poolType": "feeTokenOnly", + "pool": { + "rawType": "FeeTokenOnly", + "type": "feeTokenOnly", + "version": "1.6.1" + }, "symbol": "wzkCRO", "tokenAddress": "0xeD73b53197189BE3Ff978069cf30eBc28a8B5837" } diff --git a/src/lib/ccip/services/lane-data.ts b/src/lib/ccip/services/lane-data.ts index a61316bc506..41c2b97442e 100644 --- a/src/lib/ccip/services/lane-data.ts +++ b/src/lib/ccip/services/lane-data.ts @@ -4,11 +4,17 @@ import { LaneFilterType, LaneConfigError, LaneServiceResponse, + LaneDetailServiceResponse, + LaneDetailWithRateLimits, + SupportedTokensServiceResponse, ChainInfo, ChainInfoInternal, OutputKeyType, ChainType, ChainFamily, + LaneInputKeyType, + TokenRateLimits, + RateLimitsData, } from "~/lib/ccip/types/index.ts" import { loadReferenceData, Version } from "@config/data/ccip/index.ts" import type { LaneConfig, ChainConfig } from "@config/data/ccip/types.ts" @@ -21,6 +27,10 @@ import { directoryToSupportedChain, } from "../../../features/utils/index.ts" +// Import rate limits mock data +import rateLimitsMainnet from "~/__mocks__/rate-limits-mainnet.json" with { type: "json" } +import rateLimitsTestnet from "~/__mocks__/rate-limits-testnet.json" with { type: "json" } + export const prerender = false /** @@ -353,13 +363,12 @@ export class LaneDataService { * Extracts supported token keys from lane configuration */ private extractSupportedTokens(laneConfig: LaneConfig): string[] { - if (!laneConfig.supportedTokens) { + if (!laneConfig.supportedTokens || !Array.isArray(laneConfig.supportedTokens)) { return [] } - // Extract token keys from supportedTokens object - // lanes.json structure: "supportedTokens": { "LINK": {...}, "CCIP-BnM": {...} } - return Object.keys(laneConfig.supportedTokens) + // lanes.json structure: "supportedTokens": ["LINK", "CCIP-BnM", ...] + return laneConfig.supportedTokens } /** @@ -389,4 +398,359 @@ export class LaneDataService { 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<LaneDetailServiceResponse> { + 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<string, ChainConfig> + ) + const destinationInternalId = this.resolveToInternalId( + destinationIdentifier, + inputKeyType, + chainsReferenceData as Record<string, ChainConfig> + ) + + 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<string, LaneConfig> | undefined + if (!sourceLanes) { + return { data: null } + } + + const laneConfig = sourceLanes[destinationInternalId] + if (!laneConfig) { + return { data: null } + } + + // Resolve chain info + const sourceChain = this.resolveChainInfo(sourceInternalId, chainsReferenceData) + const destChain = this.resolveChainInfo(destinationInternalId, chainsReferenceData) + + if (!sourceChain || !destChain) { + return { data: null } + } + + // Build lane details with rate limits + const laneDetails = this.buildLaneDetailsWithRateLimits( + sourceChain, + destChain, + laneConfig, + sourceInternalId, + destinationInternalId, + environment + ) + + logger.info({ + message: "Lane details with rate limits retrieved", + requestId: this.requestId, + sourceInternalId, + destinationInternalId, + tokenCount: Object.keys(laneDetails.supportedTokens).length, + }) + + return { data: laneDetails } + } catch (error) { + logger.error({ + message: "Failed to get lane details", + requestId: this.requestId, + error: error instanceof Error ? error.message : "Unknown error", + }) + return { data: null } + } + } + + /** + * Resolves a chain identifier to its internal ID + * + * @param identifier - Chain identifier (chainId, selector, or internalId) + * @param inputKeyType - Type of identifier + * @param chainsReferenceData - Chain configuration data + * @returns Internal ID or null if not found + */ + resolveToInternalId( + identifier: string, + inputKeyType: LaneInputKeyType, + chainsReferenceData: Record<string, ChainConfig> + ): string | null { + // If already an internalId, return it directly + if (inputKeyType === "internalId") { + return chainsReferenceData[identifier] ? identifier : null + } + + // Search through chains to find matching chainId or selector + for (const [internalId, chainConfig] of Object.entries(chainsReferenceData)) { + if (inputKeyType === "chainId") { + // Try to match by numeric chain ID + try { + const supportedChain = directoryToSupportedChain(internalId) + const chainId = getChainId(supportedChain) + if (chainId && chainId.toString() === identifier) { + return internalId + } + } catch { + // Skip chains that can't be resolved + } + } else if (inputKeyType === "selector") { + // Match by selector + if (chainConfig.chainSelector === identifier) { + return internalId + } + } + } + + return null + } + + /** + * Loads rate limits data for the specified environment + */ + private loadRateLimitsData(environment: Environment): RateLimitsData { + return environment === "mainnet" + ? (rateLimitsMainnet as unknown as RateLimitsData) + : (rateLimitsTestnet as unknown as RateLimitsData) + } + + /** + * Builds lane details with rate limits included in supportedTokens + */ + private buildLaneDetailsWithRateLimits( + sourceChain: ChainInfoInternal, + destChain: ChainInfoInternal, + laneConfig: LaneConfig, + sourceInternalId: string, + destinationInternalId: string, + environment: Environment + ): LaneDetailWithRateLimits { + // Convert internal chain info to public interface + const publicSourceChain: ChainInfo = { + chainId: sourceChain.chainId, + displayName: sourceChain.displayName, + selector: sourceChain.selector, + internalId: sourceChain.internalId, + } + + const publicDestChain: ChainInfo = { + chainId: destChain.chainId, + displayName: destChain.displayName, + selector: destChain.selector, + internalId: destChain.internalId, + } + + // Extract supported token symbols + const tokenSymbols = this.extractSupportedTokens(laneConfig) + + // Load rate limits data + const rateLimitsData = this.loadRateLimitsData(environment) + + // Build supportedTokens with rate limits + const supportedTokensWithRateLimits: Record<string, TokenRateLimits> = {} + + for (const tokenSymbol of tokenSymbols) { + const tokenData = rateLimitsData[tokenSymbol] + if (tokenData) { + const sourceData = tokenData[sourceInternalId] + if (sourceData?.remote) { + const destData = sourceData.remote[destinationInternalId] + if (destData) { + supportedTokensWithRateLimits[tokenSymbol] = { + standard: destData.standard, + custom: destData.custom, + } + } else { + // Token exists but no rate limits for this lane - use null for unavailable + supportedTokensWithRateLimits[tokenSymbol] = { + standard: null, + custom: null, + } + } + } else { + // Token exists but no data for source chain + supportedTokensWithRateLimits[tokenSymbol] = { + standard: null, + custom: null, + } + } + } else { + // Token not found in rate limits data + supportedTokensWithRateLimits[tokenSymbol] = { + standard: null, + custom: null, + } + } + } + + return { + sourceChain: publicSourceChain, + destinationChain: publicDestChain, + onRamp: { + address: laneConfig.onRamp.address, + version: normalizeVersion(laneConfig.onRamp.version), + enforceOutOfOrder: laneConfig.onRamp.enforceOutOfOrder, + }, + offRamp: { + address: laneConfig.offRamp.address, + version: normalizeVersion(laneConfig.offRamp.version), + }, + supportedTokens: supportedTokensWithRateLimits, + } + } + + /** + * Retrieves only supported tokens with rate limits for a specific lane + * + * @param environment - Network environment (mainnet/testnet) + * @param sourceIdentifier - Source chain identifier (chainId, selector, or internalId) + * @param destinationIdentifier - Destination chain identifier + * @param inputKeyType - Type of identifier used (chainId, selector, internalId) + * @returns Supported tokens with rate limits or null if lane not found + */ + async getSupportedTokensWithRateLimits( + environment: Environment, + sourceIdentifier: string, + destinationIdentifier: string, + inputKeyType: LaneInputKeyType + ): Promise<SupportedTokensServiceResponse> { + 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<string, ChainConfig> + ) + const destinationInternalId = this.resolveToInternalId( + destinationIdentifier, + inputKeyType, + chainsReferenceData as Record<string, ChainConfig> + ) + + 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<string, LaneConfig> | undefined + if (!sourceLanes) { + return { data: null, tokenCount: 0 } + } + + const laneConfig = sourceLanes[destinationInternalId] + if (!laneConfig) { + return { data: null, tokenCount: 0 } + } + + // Extract supported token symbols + const tokenSymbols = this.extractSupportedTokens(laneConfig) + + // Load rate limits data + const rateLimitsData = this.loadRateLimitsData(environment) + + // Build supportedTokens with rate limits + const supportedTokensWithRateLimits: Record<string, TokenRateLimits> = {} + + for (const tokenSymbol of tokenSymbols) { + const tokenData = rateLimitsData[tokenSymbol] + if (tokenData) { + const sourceData = tokenData[sourceInternalId] + if (sourceData?.remote) { + const destData = sourceData.remote[destinationInternalId] + if (destData) { + supportedTokensWithRateLimits[tokenSymbol] = { + standard: destData.standard, + custom: destData.custom, + } + } else { + supportedTokensWithRateLimits[tokenSymbol] = { standard: null, custom: null } + } + } else { + supportedTokensWithRateLimits[tokenSymbol] = { standard: null, custom: null } + } + } else { + supportedTokensWithRateLimits[tokenSymbol] = { standard: null, custom: null } + } + } + + const tokenCount = Object.keys(supportedTokensWithRateLimits).length + + logger.info({ + message: "Supported tokens with rate limits retrieved", + requestId: this.requestId, + sourceInternalId, + destinationInternalId, + tokenCount, + }) + + return { data: supportedTokensWithRateLimits, tokenCount } + } catch (error) { + logger.error({ + message: "Failed to get supported tokens with rate limits", + requestId: this.requestId, + error: error instanceof Error ? error.message : "Unknown error", + }) + return { data: null, tokenCount: 0 } + } + } } diff --git a/src/lib/ccip/services/rate-limits-data.ts b/src/lib/ccip/services/rate-limits-data.ts new file mode 100644 index 00000000000..cce168ac68e --- /dev/null +++ b/src/lib/ccip/services/rate-limits-data.ts @@ -0,0 +1,352 @@ +import { + Environment, + RateLimitsFilterType, + RateLimitsServiceResponse, + RateLimitsData, + TokenRateLimits, + RateLimiterConfig, + RateLimiterEntry, + RateLimiterDirections, + isRateLimiterUnavailable, + LaneRateLimitsFilterType, + LaneInputKeyType, +} from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "./lane-data.ts" +import { loadReferenceData, Version } from "@config/data/ccip/index.ts" +import type { ChainConfig } from "@config/data/ccip/types.ts" +import { logger } from "@lib/logging/index.js" + +// Import the mock data files +import rateLimitsMainnet from "~/__mocks__/rate-limits-mainnet.json" with { type: "json" } +import rateLimitsTestnet from "~/__mocks__/rate-limits-testnet.json" with { type: "json" } + +export const prerender = false + +/** + * Service class for handling CCIP rate limits data operations + * Provides functionality to filter and retrieve rate limiter configurations + */ +export class RateLimitsDataService { + private readonly requestId: string + + /** + * Creates a new instance of RateLimitsDataService + */ + constructor() { + this.requestId = crypto.randomUUID() + + logger.debug({ + message: "RateLimitsDataService initialized", + requestId: this.requestId, + }) + } + + /** + * Retrieves rate limits data for a specific lane, optionally filtered by tokens, direction, and rate type + * + * @param environment - Network environment (mainnet/testnet) + * @param filters - Filter parameters including source/destination chains, tokens, direction, and rate type + * @returns Filtered rate limits data with metadata + */ + async getFilteredRateLimits( + environment: Environment, + filters: RateLimitsFilterType + ): Promise<RateLimitsServiceResponse> { + logger.debug({ + message: "Processing rate limits request", + requestId: this.requestId, + environment, + filters, + }) + + try { + // Load the appropriate rate limits data based on environment + const rateLimitsData = this.loadRateLimitsData(environment) + + // Extract rate limits for the specified lane + const result = this.extractLaneRateLimits(rateLimitsData, filters) + + const tokenCount = Object.keys(result).length + + logger.info({ + message: "Rate limits data retrieved successfully", + requestId: this.requestId, + tokenCount, + sourceChain: filters.sourceInternalId, + destinationChain: filters.destinationInternalId, + }) + + return { + data: result, + metadata: { + tokenCount, + }, + } + } catch (error) { + logger.error({ + message: "Failed to process rate limits data", + requestId: this.requestId, + error: error instanceof Error ? error.message : "Unknown error", + }) + + throw error + } + } + + /** + * Loads rate limits data for the specified environment + */ + private loadRateLimitsData(environment: Environment): RateLimitsData { + logger.debug({ + message: "Loading rate limits data", + requestId: this.requestId, + environment, + }) + + if (environment === Environment.Mainnet) { + return rateLimitsMainnet as RateLimitsData + } + return rateLimitsTestnet as RateLimitsData + } + + /** + * Extracts rate limits for a specific lane from the token-centric data structure + * + * @param rateLimitsData - Full rate limits data (token -> source -> { minBlockConfirmation?, remote: { dest -> ... } }) + * @param filters - Filter parameters + * @returns Token-centric rate limits for the specified lane + */ + private extractLaneRateLimits( + rateLimitsData: RateLimitsData, + filters: RateLimitsFilterType + ): Record<string, TokenRateLimits> { + const { sourceInternalId, destinationInternalId, tokens, direction, rateType } = filters + const result: Record<string, TokenRateLimits> = {} + + // Parse token filter if provided + const tokenFilter = tokens + ? tokens + .split(",") + .map((t) => t.trim()) + .filter((t) => t.length > 0) + : null + + // Iterate through all tokens in the data + for (const [tokenSymbol, sourceChains] of Object.entries(rateLimitsData)) { + // Skip if token filter is provided and this token is not in the filter + if (tokenFilter && !tokenFilter.includes(tokenSymbol)) { + continue + } + + // Check if this token has data for the requested source chain + const sourceChainData = sourceChains[sourceInternalId] + if (!sourceChainData) { + continue + } + + // Check if destination exists in remote + const laneRateLimits = sourceChainData.remote[destinationInternalId] + if (!laneRateLimits) { + continue + } + + // Apply filters for direction and rate type + const filteredLimits = this.applyFilters(laneRateLimits, direction, rateType) + + if (filteredLimits) { + result[tokenSymbol] = filteredLimits + } + } + + logger.debug({ + message: "Lane rate limits extracted", + requestId: this.requestId, + sourceChain: sourceInternalId, + destinationChain: destinationInternalId, + tokenCount: Object.keys(result).length, + filteredTokens: tokenFilter, + direction, + rateType, + }) + + return result + } + + /** + * Applies direction and rate type filters to rate limits + * + * @param rateLimits - Original rate limits with standard and custom entries + * @param direction - Optional direction filter ("in" or "out") + * @param rateType - Optional rate type filter ("standard" or "custom") + * @returns Filtered rate limits or null if no data matches + */ + private applyFilters( + rateLimits: TokenRateLimits, + direction?: "in" | "out", + rateType?: "standard" | "custom" + ): TokenRateLimits | null { + // Apply direction filter to both standard and custom entries + const filteredStandard = this.applyDirectionFilter(rateLimits.standard, direction) + const filteredCustom = this.applyDirectionFilter(rateLimits.custom, direction) + + // If rate type filter is specified, return only that type + if (rateType === "standard") { + if (!filteredStandard) { + return null + } + return { + standard: filteredStandard, + custom: null, // Indicate custom was filtered out + } + } + + if (rateType === "custom") { + if (!filteredCustom) { + return null + } + return { + standard: null, // Indicate standard was filtered out + custom: filteredCustom, + } + } + + // No rate type filter, return both (if either has data) + if (!filteredStandard && !filteredCustom) { + return null + } + + return { + standard: filteredStandard ?? null, + custom: filteredCustom ?? null, + } + } + + /** + * Applies direction filter to a rate limiter entry + * + * @param entry - Rate limiter entry (directions or unavailable) + * @param direction - Optional direction filter ("in" or "out") + * @returns Filtered entry or null if no data matches + */ + private applyDirectionFilter(entry: RateLimiterEntry, direction?: "in" | "out"): RateLimiterEntry | null { + // If entry is unavailable, return it as-is + if (isRateLimiterUnavailable(entry)) { + return entry + } + + // If no direction filter, return the full entry + if (!direction) { + return entry + } + + // Filter to specific direction + const directionsEntry = entry as RateLimiterDirections + const filteredConfig = directionsEntry[direction] + if (!filteredConfig) { + return null + } + + // Return only the requested direction + return { + [direction]: filteredConfig, + } as RateLimiterDirections + } + + /** + * Validates that a rate limiter config exists and has valid structure + */ + private isValidRateLimiterConfig(config: unknown): config is RateLimiterConfig { + if (!config || typeof config !== "object") { + return false + } + + const c = config as Record<string, unknown> + 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<RateLimitsServiceResponse> { + 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<string, ChainConfig> + ) + const destinationInternalId = laneDataService.resolveToInternalId( + destinationIdentifier, + inputKeyType, + chainsReferenceData as Record<string, ChainConfig> + ) + + 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/token-data.ts b/src/lib/ccip/services/token-data.ts index ed76fc93c2b..f8f1a70fd41 100644 --- a/src/lib/ccip/services/token-data.ts +++ b/src/lib/ccip/services/token-data.ts @@ -6,6 +6,13 @@ import { TokenChainData, TokenDataResponse, TokenServiceResponse, + TokenDetailChainData, + TokenDetailDataResponse, + TokenDetailServiceResponse, + TokenFinalityData, + TokenFinalityDataResponse, + TokenFinalityServiceResponse, + RateLimitsData, } from "~/lib/ccip/types/index.ts" import { Version } from "@config/data/ccip/types.ts" import { SupportedChain } from "@config/index.ts" @@ -15,6 +22,10 @@ import { logger } from "@lib/logging/index.js" import { getChainId, getChainTypeAndFamily, getTitle } from "../../../features/utils/index.ts" import { getSelectorEntry } from "@config/data/ccip/selectors.ts" +// Import rate limits mock data for custom finality info +import rateLimitsMainnet from "~/__mocks__/rate-limits-mainnet.json" with { type: "json" } +import rateLimitsTestnet from "~/__mocks__/rate-limits-testnet.json" with { type: "json" } + export const prerender = false /** @@ -99,11 +110,11 @@ export class TokenDataService { Object.entries(tokenData).forEach(([chainId, chainData]) => { try { - // Only process chains where poolAddress exists - if (!chainData.poolAddress) { + // Only process chains where pool.address exists + if (!chainData.pool?.address) { this.skippedTokensCount++ logger.warn({ - message: "Chain missing poolAddress - skipping only this chain", + message: "Chain missing pool.address - skipping only this chain", requestId: this.requestId, tokenCanonicalId, chainId, @@ -176,8 +187,12 @@ export class TokenDataService { decimals: chainData.decimals, destinations, name: chainData.name || "", - poolAddress: chainData.poolAddress, - poolType: chainData.poolType, + pool: { + address: chainData.pool.address || "", + rawType: chainData.pool.rawType, + type: chainData.pool.type, + version: chainData.pool.version, + }, symbol: chainData.symbol, tokenAddress: chainData.tokenAddress, }, @@ -361,4 +376,224 @@ export class TokenDataService { metadata, } } + + /** + * Retrieves detailed token information for a specific token, including custom finality data + * + * @param environment - Network environment (mainnet/testnet) + * @param tokenCanonicalSymbol - Canonical symbol for the token + * @param outputKey - Format to use for displaying chain information + * @returns Token details with custom finality information for each chain + */ + public async getTokenWithFinality( + environment: Environment, + tokenCanonicalSymbol: string, + outputKey: OutputKeyType = "chainId" + ): Promise<TokenDetailServiceResponse | null> { + logger.info({ + message: "Getting token with finality data", + requestId: this.requestId, + environment, + tokenCanonicalSymbol, + outputKey, + }) + + // Get base token data using existing method + const tokenData = await this.processTokenData(environment, tokenCanonicalSymbol, outputKey) + + if (!tokenData) { + logger.warn({ + message: "Token not found", + requestId: this.requestId, + tokenCanonicalSymbol, + }) + return null + } + + // Load rate limits data for finality info + const rateLimitsData = this.loadRateLimitsData(environment) + + // Get token's rate limits by internal ID + const tokenRateLimits = rateLimitsData[tokenCanonicalSymbol] + + // Merge token data with custom finality information + const result: TokenDetailDataResponse = {} + + for (const [chainKey, chainData] of Object.entries(tokenData)) { + // Look up minBlockConfirmation using internal ID + // We need to map the chainKey back to internal ID for rate limits lookup + const internalId = this.getInternalIdFromChainKey(chainData.chainId, chainData.chainName, outputKey) + + let minBlockConfirmation: number | null = null + let hasCustomFinality: boolean | null = null + + if (tokenRateLimits && internalId && tokenRateLimits[internalId]) { + minBlockConfirmation = tokenRateLimits[internalId].minBlockConfirmation + + // Derive hasCustomFinality from minBlockConfirmation + if (minBlockConfirmation === null) { + hasCustomFinality = null // Unavailable + } else if (minBlockConfirmation > 0) { + hasCustomFinality = true + } else { + hasCustomFinality = false + } + } + + const detailChainData: TokenDetailChainData = { + ...chainData, + hasCustomFinality, + minBlockConfirmation, + } + + result[chainKey] = detailChainData + } + + logger.info({ + message: "Token with finality data retrieved", + requestId: this.requestId, + tokenCanonicalSymbol, + chainCount: Object.keys(result).length, + }) + + return { + data: result, + metadata: { + chainCount: Object.keys(result).length, + }, + } + } + + /** + * Loads rate limits data for the specified environment + */ + private loadRateLimitsData(environment: Environment): RateLimitsData { + if (environment === Environment.Mainnet) { + return rateLimitsMainnet as RateLimitsData + } + return rateLimitsTestnet as RateLimitsData + } + + /** + * Gets the internal ID for a chain based on chainId/chainName + * This is needed to look up rate limits data which uses internal IDs as keys + */ + private getInternalIdFromChainKey( + chainId: number | string, + chainName: string, + outputKey: OutputKeyType + ): string | null { + try { + // If outputKey is internalId, the chainName might already be the internal ID + // We need to look up the selector entry by chainId + const numericChainId = typeof chainId === "string" ? parseInt(chainId, 10) : chainId + + if (isNaN(numericChainId)) { + // chainId is not numeric, might be a non-EVM chain identifier + // Try to find by name pattern + return null + } + + // Get selector entry which has the internal name + const selectorEntry = getSelectorEntry(numericChainId, "evm") + if (selectorEntry) { + return selectorEntry.name + } + + return null + } catch { + logger.debug({ + message: "Could not resolve internal ID for chain", + requestId: this.requestId, + chainId, + chainName, + }) + return null + } + } + + /** + * Retrieves only finality data for a specific token (lightweight endpoint) + * + * @param environment - Network environment (mainnet/testnet) + * @param tokenCanonicalSymbol - Canonical symbol for the token + * @param outputKey - Format to use for displaying chain information + * @returns Finality information (hasCustomFinality, minBlockConfirmation) for each chain + */ + public async getTokenFinality( + environment: Environment, + tokenCanonicalSymbol: string, + outputKey: OutputKeyType = "chainId" + ): Promise<TokenFinalityServiceResponse | null> { + logger.info({ + message: "Getting token finality data", + requestId: this.requestId, + environment, + tokenCanonicalSymbol, + outputKey, + }) + + // Get base token data to know which chains the token exists on + const tokenData = await this.processTokenData(environment, tokenCanonicalSymbol, outputKey) + + if (!tokenData) { + logger.warn({ + message: "Token not found", + requestId: this.requestId, + tokenCanonicalSymbol, + }) + return null + } + + // Load rate limits data for finality info + const rateLimitsData = this.loadRateLimitsData(environment) + + // Get token's rate limits by internal ID + const tokenRateLimits = rateLimitsData[tokenCanonicalSymbol] + + // Extract only finality data for each chain + const result: TokenFinalityDataResponse = {} + + for (const [chainKey, chainData] of Object.entries(tokenData)) { + // Look up minBlockConfirmation using internal ID + const internalId = this.getInternalIdFromChainKey(chainData.chainId, chainData.chainName, outputKey) + + let minBlockConfirmation: number | null = null + let hasCustomFinality: boolean | null = null + + if (tokenRateLimits && internalId && tokenRateLimits[internalId]) { + minBlockConfirmation = tokenRateLimits[internalId].minBlockConfirmation + + // Derive hasCustomFinality from minBlockConfirmation + if (minBlockConfirmation === null) { + hasCustomFinality = null // Unavailable + } else if (minBlockConfirmation > 0) { + hasCustomFinality = true + } else { + hasCustomFinality = false + } + } + + const finalityData: TokenFinalityData = { + hasCustomFinality, + minBlockConfirmation, + } + + result[chainKey] = finalityData + } + + logger.info({ + message: "Token finality data retrieved", + requestId: this.requestId, + tokenCanonicalSymbol, + chainCount: Object.keys(result).length, + }) + + return { + data: result, + metadata: { + chainCount: Object.keys(result).length, + }, + } + } } diff --git a/src/lib/ccip/types/index.ts b/src/lib/ccip/types/index.ts index f2a74d933ff..9ffcbac54ef 100644 --- a/src/lib/ccip/types/index.ts +++ b/src/lib/ccip/types/index.ts @@ -102,14 +102,20 @@ export type TokenMetadata = { validTokenCount: number } +export type TokenPool = { + address: string + rawType: string + type: string + version: string +} + export type TokenChainData = { chainId: number | string chainName: string decimals: number destinations: string[] name: string - poolAddress: string - poolType: string + pool: TokenPool symbol: string tokenAddress: string } @@ -140,6 +146,91 @@ export interface TokenFilterType { chain_id?: string } +// Token Detail API Types (for /tokens/{tokenCanonicalSymbol} endpoint) + +/** + * Extended token chain data with custom finality information + */ +export interface TokenDetailChainData extends TokenChainData { + /** Whether custom finality is enabled (derived from minBlockConfirmation > 0) */ + hasCustomFinality: boolean | null + /** Minimum block confirmations required, null if unavailable */ + minBlockConfirmation: number | null +} + +/** + * Token detail response data structure + */ +export type TokenDetailDataResponse = { + [chainKey: string]: TokenDetailChainData +} + +/** + * Metadata for token detail API responses + */ +export interface TokenDetailMetadata { + environment: Environment + timestamp: string + requestId: string + tokenSymbol: string + chainCount: number +} + +/** + * Token detail API response format + */ +export interface TokenDetailApiResponse { + metadata: TokenDetailMetadata + data: TokenDetailDataResponse +} + +/** + * Token detail service response (internal) + */ +export interface TokenDetailServiceResponse { + data: TokenDetailDataResponse + metadata: { + chainCount: number + } +} + +// Token Finality API Types (for /tokens/{tokenCanonicalSymbol}/finality endpoint) + +/** + * Finality data for a token on a specific chain + */ +export interface TokenFinalityData { + /** Whether custom finality is enabled (derived from minBlockConfirmation > 0) */ + hasCustomFinality: boolean | null + /** Minimum block confirmations required, null if unavailable */ + minBlockConfirmation: number | null +} + +/** + * Token finality response data structure + */ +export type TokenFinalityDataResponse = { + [chainKey: string]: TokenFinalityData +} + +/** + * Token finality API response format + */ +export interface TokenFinalityApiResponse { + metadata: TokenDetailMetadata + data: TokenFinalityDataResponse +} + +/** + * Token finality service response (internal) + */ +export interface TokenFinalityServiceResponse { + data: TokenFinalityDataResponse + metadata: { + chainCount: number + } +} + // Lane Data API Types export type LaneConfigError = { @@ -217,6 +308,202 @@ export interface LaneFilterType { 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) + */ +export interface RateLimiterDirections { + in?: RateLimiterConfig + out?: RateLimiterConfig +} + +/** + * Rate limiter entry can be directions data or null (unavailable) + */ +export type RateLimiterEntry = RateLimiterDirections | null + +/** + * Rate limits for a single token on a lane with both standard and custom (FTF) limits + */ +export interface TokenRateLimits { + standard: RateLimiterEntry + custom: RateLimiterEntry +} + +/** + * Lane details with rate limits included in supportedTokens + * Used for single lane detail endpoints that merge rate limits + */ +export interface LaneDetailWithRateLimits { + sourceChain: ChainInfo + destinationChain: ChainInfo + onRamp: { + address: string + version: string + enforceOutOfOrder?: boolean + } + offRamp: { + address: string + version: string + } + supportedTokens: Record<string, TokenRateLimits> +} + +/** + * 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<string, TokenRateLimits> +} + +/** + * Supported tokens service response (internal) + */ +export interface SupportedTokensServiceResponse { + data: Record<string, TokenRateLimits> | null + tokenCount: number +} + +/** + * Type guard to check if a RateLimiterEntry is unavailable (null) + */ +export function isRateLimiterUnavailable(entry: RateLimiterEntry): entry is null { + return entry === null +} + +/** + * Metadata for rate limits API responses + */ +export interface RateLimitsMetadata { + environment: Environment + timestamp: string + requestId: string + sourceChain: string + destinationChain: string + tokenCount: number +} + +/** + * Filter parameters for rate limits queries (query-based - deprecated) + */ +export interface RateLimitsFilterType { + sourceInternalId: string + destinationInternalId: string + tokens?: string + direction?: "in" | "out" + rateType?: "standard" | "custom" +} + +/** + * Filter parameters for lane rate limits queries (path-based) + * Source and destination come from URL path parameters + */ +export interface LaneRateLimitsFilterType { + tokens?: string + direction?: "in" | "out" + rateType?: "standard" | "custom" +} + +/** + * Direction type for rate limits + */ +export type RateLimitsDirection = "in" | "out" + +/** + * Rate type for rate limits (standard or custom/FTF) + */ +export type RateLimitsType = "standard" | "custom" + +/** + * Source chain rate limits data with minBlockConfirmation and remote destinations + */ +export interface SourceChainRateLimitsData { + minBlockConfirmation: number | null + remote: Record<string, TokenRateLimits> +} + +/** + * Rate limits data structure in the mock JSON files + * Token -> SourceChain -> { minBlockConfirmation?, remote: { DestChain -> { standard, custom } } } + */ +export type RateLimitsData = Record<string, Record<string, SourceChainRateLimitsData>> + +/** + * Rate limits API response format + */ +export interface RateLimitsApiResponse { + metadata: RateLimitsMetadata + data: Record<string, TokenRateLimits> +} + +/** + * Rate limits service response (internal) + */ +export interface RateLimitsServiceResponse { + data: Record<string, TokenRateLimits> + metadata: { + tokenCount: number + } +} + // Faucet API Types export type { FaucetChainConfig, diff --git a/src/lib/ccip/utils.ts b/src/lib/ccip/utils.ts index 4496319a028..c3ce117762d 100644 --- a/src/lib/ccip/utils.ts +++ b/src/lib/ccip/utils.ts @@ -4,8 +4,16 @@ import { ChainsConfig, Environment, loadReferenceData, Version } from "@config/d import { SupportedChain } from "@config/index.ts" import { directoryToSupportedChain } from "@features/utils/index.ts" import { v4 as uuidv4 } from "uuid" -import type { TokenMetadata, ChainType, OutputKeyType } from "./types/index.ts" -import { jsonHeaders, commonHeaders as sharedCommonHeaders } from "@lib/api/cacheHeaders.js" +import type { + TokenMetadata, + ChainType, + OutputKeyType, + RateLimitsMetadata, + RateLimitsFilterType, + RateLimitsDirection, + RateLimitsType, +} from "./types/index.ts" +import { commonHeaders } from "@lib/api/cacheHeaders.ts" export const prerender = false @@ -14,18 +22,6 @@ export type { ChainsConfig, Version } export { Environment } export type { SelectorsConfig } from "@config/data/ccip/selectors.ts" -/** - * Common HTTP headers used across all API responses - * @deprecated Use sharedCommonHeaders from @lib/api/cacheHeaders.js instead - */ -export const commonHeaders = sharedCommonHeaders - -/** - * Extended headers for successful responses with caching directives - * @deprecated Use jsonHeaders from @lib/api/cacheHeaders.js instead - */ -export const successHeaders = jsonHeaders - /** * Custom error class for CCIP-specific errors */ @@ -220,6 +216,90 @@ export const createTokenMetadata = (environment: Environment): TokenMetadata => } } +/** + * Creates rate-limits-specific metadata object + * @param environment - Current network environment + * @param sourceChain - Source chain internal ID + * @param destinationChain - Destination chain internal ID + * @param tokenCount - Number of tokens in the response + * @returns Metadata object for rate limits API response + */ +export const createRateLimitsMetadata = ( + environment: Environment, + sourceChain: string, + destinationChain: string, + tokenCount: number +): RateLimitsMetadata => { + return { + environment, + timestamp: new Date().toISOString(), + requestId: crypto.randomUUID(), + sourceChain, + destinationChain, + tokenCount, + } +} + +/** + * Validates rate limits filter parameters + * @param filters - Filter parameters to validate + * @throws CCIPError if required parameters are missing or invalid + */ +export const validateRateLimitsFilters = (filters: { + sourceInternalId?: string + destinationInternalId?: string + tokens?: string + direction?: string + rateType?: string +}): RateLimitsFilterType => { + // Validate required parameters + if (!filters.sourceInternalId) { + throw new CCIPError(400, "source_internal_id parameter is required") + } + if (!filters.destinationInternalId) { + throw new CCIPError(400, "destination_internal_id parameter is required") + } + + // Validate direction if provided + let direction: RateLimitsDirection | undefined + if (filters.direction) { + const normalizedDirection = filters.direction.toLowerCase() + if (!["in", "out"].includes(normalizedDirection)) { + throw new CCIPError(400, 'direction parameter must be "in" or "out"') + } + direction = normalizedDirection as RateLimitsDirection + } + + // Validate rate_type if provided + let rateType: RateLimitsType | undefined + if (filters.rateType) { + const normalizedRateType = filters.rateType.toLowerCase() + if (!["standard", "custom"].includes(normalizedRateType)) { + throw new CCIPError(400, 'rate_type parameter must be "standard" or "custom"') + } + rateType = normalizedRateType as RateLimitsType + } + + // Validate tokens if provided (must not be empty after parsing) + if (filters.tokens !== undefined && filters.tokens !== null) { + const tokenList = filters.tokens + .split(",") + .map((t) => t.trim()) + .filter((t) => t.length > 0) + if (filters.tokens.length > 0 && tokenList.length === 0) { + throw new CCIPError(400, "tokens parameter cannot be empty when provided") + } + } + + return { + sourceInternalId: filters.sourceInternalId, + destinationInternalId: filters.destinationInternalId, + tokens: filters.tokens, + direction, + rateType, + } +} + /** * Validates the environment parameter * @param environment - Environment string to validate @@ -247,7 +327,7 @@ 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 @@ -255,22 +335,22 @@ export const validateFilters = (filters: FilterType): void => { export const validateOutputKey = (outputKey?: string): "chainId" | "selector" | "internalId" => { if (!outputKey) return "chainId" if (!["chainId", "selector", "internalId"].includes(outputKey)) { - throw new CCIPError(400, "outputKey must be one of: chainId, selector, or internalId") + throw new CCIPError(400, "output_key must be one of: chainId, selector, or internalId") } return outputKey as "chainId" | "selector" | "internalId" } /** - * Validates the enrichFeeTokens parameter + * Validates the enrich_fee_tokens parameter * @param enrichFeeTokens - String value to validate * @returns Boolean indicating whether to enrich fee tokens with addresses and metadata - * @throws CCIPError if enrichFeeTokens value is invalid + * @throws CCIPError if enrich_fee_tokens value is invalid */ export const validateEnrichFeeTokens = (enrichFeeTokens?: string): boolean => { if (!enrichFeeTokens) return false const normalizedValue = enrichFeeTokens.toLowerCase() if (!["true", "false"].includes(normalizedValue)) { - throw new CCIPError(400, 'enrichFeeTokens must be "true" or "false"') + throw new CCIPError(400, 'enrich_fee_tokens must be "true" or "false"') } return normalizedValue === "true" } diff --git a/src/pages/api/ccip/v1/chains.ts b/src/pages/api/ccip/v1/chains.ts index 5f733985065..dca37833e7c 100644 --- a/src/pages/api/ccip/v1/chains.ts +++ b/src/pages/api/ccip/v1/chains.ts @@ -7,14 +7,13 @@ import { generateChainKey, createMetadata, handleApiError, - successHeaders, - commonHeaders, loadChainConfiguration, FilterType, APIErrorType, createErrorResponse, CCIPError, } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" import { logger } from "@lib/logging/index.js" import type { ChainDetails, ChainApiResponse } from "~/lib/ccip/types/index.ts" @@ -57,15 +56,15 @@ export const GET: APIRoute = async ({ request }) => { }) // Validate output key - const outputKey = validateOutputKey(params.get("outputKey") || undefined) + const outputKey = validateOutputKey(params.get("output_key") || undefined) logger.debug({ message: "Output key validated", requestId, outputKey, }) - // Validate enrichFeeTokens parameter - const enrichFeeTokens = validateEnrichFeeTokens(params.get("enrichFeeTokens") || undefined) + // Validate enrich_fee_tokens parameter + const enrichFeeTokens = validateEnrichFeeTokens(params.get("enrich_fee_tokens") || undefined) logger.debug({ message: "EnrichFeeTokens parameter validated", requestId, @@ -133,7 +132,7 @@ export const GET: APIRoute = async ({ request }) => { }) return new Response(JSON.stringify(response), { - headers: { ...commonHeaders, ...successHeaders }, + headers: jsonHeaders, }) } catch (error) { logger.error({ diff --git a/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts b/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts index 7cb73fe1999..c6d7405c9cb 100644 --- a/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts +++ b/src/pages/api/ccip/v1/drips/[chainName]/challenge.ts @@ -1,5 +1,6 @@ import type { APIRoute } from "astro" -import { APIErrorType, createErrorResponse, commonHeaders, CCIPError } from "~/lib/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 "~/lib/ccip/services/faucet-service.ts" diff --git a/src/pages/api/ccip/v1/drips/[chainName]/execute.ts b/src/pages/api/ccip/v1/drips/[chainName]/execute.ts index eed4c9a4724..23ef79769f7 100644 --- a/src/pages/api/ccip/v1/drips/[chainName]/execute.ts +++ b/src/pages/api/ccip/v1/drips/[chainName]/execute.ts @@ -1,5 +1,6 @@ import type { APIRoute } from "astro" -import { APIErrorType, createErrorResponse, commonHeaders, CCIPError } from "~/lib/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 "~/lib/ccip/services/faucet-service.ts" import { SvmDripAdapter } from "~/lib/ccip/faucet/adapters/svm-drip.ts" diff --git a/src/pages/api/ccip/v1/drips/[chainName]/index.ts b/src/pages/api/ccip/v1/drips/[chainName]/index.ts index b56a1ce31ce..323a6466fad 100644 --- a/src/pages/api/ccip/v1/drips/[chainName]/index.ts +++ b/src/pages/api/ccip/v1/drips/[chainName]/index.ts @@ -1,5 +1,6 @@ import type { APIRoute } from "astro" -import { APIErrorType, createErrorResponse, commonHeaders, CCIPError } from "~/lib/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 "~/lib/ccip/services/faucet-service.ts" diff --git a/src/pages/api/ccip/v1/lanes.ts b/src/pages/api/ccip/v1/lanes.ts index aab2b95d7c3..64788866101 100644 --- a/src/pages/api/ccip/v1/lanes.ts +++ b/src/pages/api/ccip/v1/lanes.ts @@ -3,12 +3,11 @@ import { validateEnvironment, validateOutputKey, handleApiError, - successHeaders, - commonHeaders, APIErrorType, createErrorResponse, CCIPError, } 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 "~/lib/ccip/types/index.ts" @@ -39,12 +38,12 @@ export const GET: APIRoute = async ({ request }) => { // Get filters for lanes const filters: LaneFilterType = { - sourceChainId: params.get("sourceChainId") || undefined, - destinationChainId: params.get("destinationChainId") || undefined, - sourceSelector: params.get("sourceSelector") || undefined, - destinationSelector: params.get("destinationSelector") || undefined, - sourceInternalId: params.get("sourceInternalId") || undefined, - destinationInternalId: params.get("destinationInternalId") || undefined, + sourceChainId: params.get("source_chain_id") || undefined, + destinationChainId: params.get("destination_chain_id") || undefined, + sourceSelector: params.get("source_selector") || undefined, + destinationSelector: params.get("destination_selector") || undefined, + sourceInternalId: params.get("source_internal_id") || undefined, + destinationInternalId: params.get("destination_internal_id") || undefined, version: params.get("version") || undefined, } @@ -55,7 +54,7 @@ export const GET: APIRoute = async ({ request }) => { }) // Validate output key - const outputKey = validateOutputKey(params.get("outputKey") || undefined) + const outputKey = validateOutputKey(params.get("output_key") || undefined) logger.debug({ message: "Output key validated", requestId, @@ -117,7 +116,7 @@ export const GET: APIRoute = async ({ request }) => { }) return new Response(JSON.stringify(response), { - headers: { ...commonHeaders, ...successHeaders }, + headers: jsonHeaders, }) } catch (error) { logger.error({ diff --git a/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/index.ts b/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/index.ts new file mode 100644 index 00000000000..93166516917 --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/index.ts @@ -0,0 +1,111 @@ +import type { APIRoute } from "astro" +import { validateEnvironment, handleApiError, APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { LaneDetailApiResponse, LaneDetailMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { source, destination } = params + + logger.info({ + message: "Processing CCIP lane detail request (by-chain-id)", + requestId, + url: request.url, + source, + destination, + }) + + // Validate path parameters + if (!source) { + throw new CCIPError(400, "source chain ID is required in path") + } + if (!destination) { + throw new CCIPError(400, "destination chain ID is required in path") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + const laneDataService = new LaneDataService() + const result = await laneDataService.getLaneDetails(environment, source, destination, "chainId") + + if (!result.data) { + throw new CCIPError(404, `Lane from chain '${source}' to chain '${destination}' not found`) + } + + logger.info({ + message: "Lane detail data retrieved successfully", + requestId, + source, + destination, + }) + + // Create lane detail metadata + const metadata: LaneDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + } + + const response: LaneDetailApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing lane detail request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + // Handle CCIPError specifically, preserving its status code + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + // Handle other errors + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process lane detail request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/supported-tokens.ts b/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/supported-tokens.ts new file mode 100644 index 00000000000..5cdc882b0ee --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-chain-id/[source]/[destination]/supported-tokens.ts @@ -0,0 +1,111 @@ +import type { APIRoute } from "astro" +import { validateEnvironment, handleApiError, APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { SupportedTokensApiResponse, SupportedTokensMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { source, destination } = params + + logger.info({ + message: "Processing CCIP supported tokens request (by-chain-id)", + requestId, + url: request.url, + source, + destination, + }) + + // Validate path parameters + if (!source) { + throw new CCIPError(400, "source chain ID is required in path") + } + if (!destination) { + throw new CCIPError(400, "destination chain ID is required in path") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + const laneDataService = new LaneDataService() + const result = await laneDataService.getSupportedTokensWithRateLimits(environment, source, destination, "chainId") + + if (!result.data) { + throw new CCIPError(404, `Lane from chain '${source}' to chain '${destination}' not found`) + } + + logger.info({ + message: "Supported tokens data retrieved successfully", + requestId, + source, + destination, + tokenCount: result.tokenCount, + }) + + // Create metadata + const metadata: SupportedTokensMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + tokenCount: result.tokenCount, + } + + const response: SupportedTokensApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing supported tokens request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process supported tokens request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/index.ts b/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/index.ts new file mode 100644 index 00000000000..d05d3828354 --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/index.ts @@ -0,0 +1,111 @@ +import type { APIRoute } from "astro" +import { validateEnvironment, handleApiError, APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { LaneDetailApiResponse, LaneDetailMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { source, destination } = params + + logger.info({ + message: "Processing CCIP lane detail request (by-internal-id)", + requestId, + url: request.url, + source, + destination, + }) + + // Validate path parameters + if (!source) { + throw new CCIPError(400, "source internal ID is required in path") + } + if (!destination) { + throw new CCIPError(400, "destination internal ID is required in path") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + const laneDataService = new LaneDataService() + const result = await laneDataService.getLaneDetails(environment, source, destination, "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, + }) + + // Create lane detail metadata + const metadata: LaneDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + } + + const response: LaneDetailApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing lane detail request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + // Handle CCIPError specifically, preserving its status code + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + // Handle other errors + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process lane detail request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/supported-tokens.ts b/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/supported-tokens.ts new file mode 100644 index 00000000000..da66dc7ac88 --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-internal-id/[source]/[destination]/supported-tokens.ts @@ -0,0 +1,116 @@ +import type { APIRoute } from "astro" +import { validateEnvironment, handleApiError, APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { SupportedTokensApiResponse, SupportedTokensMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { source, destination } = params + + logger.info({ + message: "Processing CCIP supported tokens request (by-internal-id)", + requestId, + url: request.url, + source, + destination, + }) + + // Validate path parameters + if (!source) { + throw new CCIPError(400, "source internal ID is required in path") + } + if (!destination) { + throw new CCIPError(400, "destination internal ID is required in path") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + const laneDataService = new LaneDataService() + const result = await laneDataService.getSupportedTokensWithRateLimits( + environment, + source, + destination, + "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, + }) + + // Create metadata + const metadata: SupportedTokensMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + tokenCount: result.tokenCount, + } + + const response: SupportedTokensApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing supported tokens request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process supported tokens request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/index.ts b/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/index.ts new file mode 100644 index 00000000000..2a39109fd82 --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/index.ts @@ -0,0 +1,111 @@ +import type { APIRoute } from "astro" +import { validateEnvironment, handleApiError, APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { LaneDetailApiResponse, LaneDetailMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { source, destination } = params + + logger.info({ + message: "Processing CCIP lane detail request (by-selector)", + requestId, + url: request.url, + source, + destination, + }) + + // Validate path parameters + if (!source) { + throw new CCIPError(400, "source selector is required in path") + } + if (!destination) { + throw new CCIPError(400, "destination selector is required in path") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + const laneDataService = new LaneDataService() + const result = await laneDataService.getLaneDetails(environment, source, destination, "selector") + + if (!result.data) { + throw new CCIPError(404, `Lane from selector '${source}' to selector '${destination}' not found`) + } + + logger.info({ + message: "Lane detail data retrieved successfully", + requestId, + source, + destination, + }) + + // Create lane detail metadata + const metadata: LaneDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + } + + const response: LaneDetailApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing lane detail request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + // Handle CCIPError specifically, preserving its status code + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + // Handle other errors + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process lane detail request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/supported-tokens.ts b/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/supported-tokens.ts new file mode 100644 index 00000000000..8b5ab782a39 --- /dev/null +++ b/src/pages/api/ccip/v1/lanes/by-selector/[source]/[destination]/supported-tokens.ts @@ -0,0 +1,111 @@ +import type { APIRoute } from "astro" +import { validateEnvironment, handleApiError, APIErrorType, createErrorResponse, CCIPError } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { SupportedTokensApiResponse, SupportedTokensMetadata } from "~/lib/ccip/types/index.ts" +import { LaneDataService } from "~/lib/ccip/services/lane-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { source, destination } = params + + logger.info({ + message: "Processing CCIP supported tokens request (by-selector)", + requestId, + url: request.url, + source, + destination, + }) + + // Validate path parameters + if (!source) { + throw new CCIPError(400, "source selector is required in path") + } + if (!destination) { + throw new CCIPError(400, "destination selector is required in path") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + const laneDataService = new LaneDataService() + const result = await laneDataService.getSupportedTokensWithRateLimits(environment, source, destination, "selector") + + if (!result.data) { + throw new CCIPError(404, `Lane from selector '${source}' to selector '${destination}' not found`) + } + + logger.info({ + message: "Supported tokens data retrieved successfully", + requestId, + source, + destination, + tokenCount: result.tokenCount, + }) + + // Create metadata + const metadata: SupportedTokensMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + sourceChain: source, + destinationChain: destination, + tokenCount: result.tokenCount, + } + + const response: SupportedTokensApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing supported tokens request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process supported tokens request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/rate-limits.ts b/src/pages/api/ccip/v1/rate-limits.ts new file mode 100644 index 00000000000..57644869eb8 --- /dev/null +++ b/src/pages/api/ccip/v1/rate-limits.ts @@ -0,0 +1,114 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateRateLimitsFilters, + createRateLimitsMetadata, + handleApiError, + APIErrorType, + createErrorResponse, + CCIPError, +} from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { RateLimitsApiResponse } from "~/lib/ccip/types/index.ts" +import { RateLimitsDataService } from "~/lib/ccip/services/rate-limits-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ request }) => { + const requestId = crypto.randomUUID() + + try { + logger.info({ + message: "Processing CCIP rate-limits request", + requestId, + url: request.url, + }) + + const url = new URL(request.url) + const params = url.searchParams + + // Validate environment + const environment = validateEnvironment(params.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + // Validate and parse rate limits filters + const filters = validateRateLimitsFilters({ + sourceInternalId: params.get("source_internal_id") || undefined, + destinationInternalId: params.get("destination_internal_id") || undefined, + tokens: params.get("tokens") || undefined, + direction: params.get("direction") || undefined, + rateType: params.get("rate_type") || undefined, + }) + + logger.debug({ + message: "Filter parameters validated", + requestId, + filters, + }) + + const rateLimitsService = new RateLimitsDataService() + const { data, metadata: serviceMetadata } = await rateLimitsService.getFilteredRateLimits(environment, filters) + + logger.info({ + message: "Rate limits data retrieved successfully", + requestId, + tokenCount: serviceMetadata.tokenCount, + sourceChain: filters.sourceInternalId, + destinationChain: filters.destinationInternalId, + }) + + // Create rate-limits-specific metadata + const metadata = createRateLimitsMetadata( + environment, + filters.sourceInternalId, + filters.destinationInternalId, + serviceMetadata.tokenCount + ) + + const response: RateLimitsApiResponse = { + metadata, + data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing rate-limits request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + // Handle CCIPError specifically, preserving its status code + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 ? APIErrorType.VALIDATION_ERROR : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + // Handle other errors + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process rate-limits request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/tokens.ts b/src/pages/api/ccip/v1/tokens.ts index 7a3fb65de0a..ad40a3a149c 100644 --- a/src/pages/api/ccip/v1/tokens.ts +++ b/src/pages/api/ccip/v1/tokens.ts @@ -4,13 +4,12 @@ import { validateOutputKey, createTokenMetadata, handleApiError, - successHeaders, - commonHeaders, APIErrorType, createErrorResponse, CCIPError, loadChainConfiguration, } from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" import { logger } from "@lib/logging/index.js" import type { TokenFilterType, TokenApiResponse } from "~/lib/ccip/types/index.ts" @@ -52,7 +51,7 @@ export const GET: APIRoute = async ({ request }) => { }) // Validate output key - we'll still use this for formatting display options - const outputKey = validateOutputKey(params.get("outputKey") || undefined) + const outputKey = validateOutputKey(params.get("output_key") || undefined) logger.debug({ message: "Output key validated", requestId, @@ -100,7 +99,7 @@ export const GET: APIRoute = async ({ request }) => { }) return new Response(JSON.stringify(response), { - headers: { ...commonHeaders, ...successHeaders }, + headers: jsonHeaders, }) } catch (error) { logger.error({ diff --git a/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol].ts b/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol].ts new file mode 100644 index 00000000000..630c2ab3419 --- /dev/null +++ b/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol].ts @@ -0,0 +1,122 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateOutputKey, + handleApiError, + APIErrorType, + createErrorResponse, + CCIPError, +} from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { TokenDetailApiResponse, TokenDetailMetadata } from "~/lib/ccip/types/index.ts" +import { TokenDataService } from "~/lib/ccip/services/token-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { tokenCanonicalSymbol } = params + + logger.info({ + message: "Processing CCIP token detail request", + requestId, + url: request.url, + tokenCanonicalSymbol, + }) + + // Validate token symbol is provided + if (!tokenCanonicalSymbol) { + throw new CCIPError(400, "tokenCanonicalSymbol parameter is required") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + // Validate output key for chain representation + const outputKey = validateOutputKey(queryParams.get("output_key") || undefined) + logger.debug({ + message: "Output key validated", + requestId, + outputKey, + }) + + const tokenDataService = new TokenDataService() + const result = await tokenDataService.getTokenWithFinality(environment, tokenCanonicalSymbol, outputKey) + + if (!result) { + throw new CCIPError(404, `Token '${tokenCanonicalSymbol}' not found`) + } + + logger.info({ + message: "Token detail data retrieved successfully", + requestId, + tokenCanonicalSymbol, + chainCount: result.metadata.chainCount, + }) + + // Create token detail metadata + const metadata: TokenDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + tokenSymbol: tokenCanonicalSymbol, + chainCount: result.metadata.chainCount, + } + + const response: TokenDetailApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing token detail request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + // Handle CCIPError specifically, preserving its status code + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + // Handle other errors + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process token detail request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol]/finality.ts b/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol]/finality.ts new file mode 100644 index 00000000000..236414283cd --- /dev/null +++ b/src/pages/api/ccip/v1/tokens/[tokenCanonicalSymbol]/finality.ts @@ -0,0 +1,122 @@ +import type { APIRoute } from "astro" +import { + validateEnvironment, + validateOutputKey, + handleApiError, + APIErrorType, + createErrorResponse, + CCIPError, +} from "~/lib/ccip/utils.ts" +import { jsonHeaders } from "@lib/api/cacheHeaders.ts" +import { logger } from "@lib/logging/index.js" + +import type { TokenFinalityApiResponse, TokenDetailMetadata } from "~/lib/ccip/types/index.ts" +import { TokenDataService } from "~/lib/ccip/services/token-data.ts" + +export const prerender = false + +export const GET: APIRoute = async ({ params, request }) => { + const requestId = crypto.randomUUID() + + try { + const { tokenCanonicalSymbol } = params + + logger.info({ + message: "Processing CCIP token finality request", + requestId, + url: request.url, + tokenCanonicalSymbol, + }) + + // Validate token symbol is provided + if (!tokenCanonicalSymbol) { + throw new CCIPError(400, "tokenCanonicalSymbol parameter is required") + } + + const url = new URL(request.url) + const queryParams = url.searchParams + + // Validate environment + const environment = validateEnvironment(queryParams.get("environment") || undefined) + logger.debug({ + message: "Environment validated", + requestId, + environment, + }) + + // Validate output key for chain representation + const outputKey = validateOutputKey(queryParams.get("output_key") || undefined) + logger.debug({ + message: "Output key validated", + requestId, + outputKey, + }) + + const tokenDataService = new TokenDataService() + const result = await tokenDataService.getTokenFinality(environment, tokenCanonicalSymbol, outputKey) + + if (!result) { + throw new CCIPError(404, `Token '${tokenCanonicalSymbol}' not found`) + } + + logger.info({ + message: "Token finality data retrieved successfully", + requestId, + tokenCanonicalSymbol, + chainCount: result.metadata.chainCount, + }) + + // Create token finality metadata + const metadata: TokenDetailMetadata = { + environment, + timestamp: new Date().toISOString(), + requestId, + tokenSymbol: tokenCanonicalSymbol, + chainCount: result.metadata.chainCount, + } + + const response: TokenFinalityApiResponse = { + metadata, + data: result.data, + } + + logger.info({ + message: "Sending successful response", + requestId, + metadata, + }) + + return new Response(JSON.stringify(response), { + headers: jsonHeaders, + }) + } catch (error) { + logger.error({ + message: "Error processing token finality request", + requestId, + error: error instanceof Error ? error.message : "Unknown error", + stack: error instanceof Error ? error.stack : undefined, + }) + + // Handle CCIPError specifically, preserving its status code + if (error instanceof CCIPError) { + return createErrorResponse( + error.statusCode === 400 + ? APIErrorType.VALIDATION_ERROR + : error.statusCode === 404 + ? APIErrorType.NOT_FOUND + : APIErrorType.SERVER_ERROR, + error.message, + error.statusCode, + {} + ) + } + + // Handle other errors + if (error instanceof Error) { + return createErrorResponse(APIErrorType.SERVER_ERROR, "Failed to process token finality request", 500, { + message: error.message, + }) + } + return handleApiError(error) + } +} diff --git a/src/scripts/ccip/detect-new-tokens.ts b/src/scripts/ccip/detect-new-tokens.ts index 85ea71ccb04..a0178595853 100644 --- a/src/scripts/ccip/detect-new-tokens.ts +++ b/src/scripts/ccip/detect-new-tokens.ts @@ -1189,13 +1189,15 @@ function buildTokenSupportMap(tokensData: TokensConfig, lanesData: LanesConfig): Object.keys(lanesData).forEach((sourceChain) => { Object.keys(lanesData[sourceChain]).forEach((destChain) => { const lane = `${sourceChain}-to-${destChain}` - const supportedTokens = lanesData[sourceChain][destChain].supportedTokens || {} + const supportedTokens = lanesData[sourceChain][destChain].supportedTokens || [] - Object.keys(supportedTokens).forEach((tokenSymbol) => { - if (tokenSupport[tokenSymbol]) { - tokenSupport[tokenSymbol].lanes.push(lane) - } - }) + if (Array.isArray(supportedTokens)) { + supportedTokens.forEach((tokenSymbol) => { + if (tokenSupport[tokenSymbol]) { + tokenSupport[tokenSymbol].lanes.push(lane) + } + }) + } }) }) diff --git a/src/scripts/ccip/generate-token-report.ts b/src/scripts/ccip/generate-token-report.ts index 471cf5b35d1..6072f03d42d 100644 --- a/src/scripts/ccip/generate-token-report.ts +++ b/src/scripts/ccip/generate-token-report.ts @@ -87,12 +87,14 @@ function buildTokenSupportMap(tokensData: TokensConfig, lanesData: LanesConfig): Object.keys(lanesData).forEach((sourceChain) => { Object.keys(lanesData[sourceChain]).forEach((destChain) => { const lane = `${sourceChain}-to-${destChain}` - const supportedTokens = lanesData[sourceChain][destChain].supportedTokens || {} - Object.keys(supportedTokens).forEach((tokenSymbol) => { - if (tokenSupport[tokenSymbol]) { - tokenSupport[tokenSymbol].lanes.push(lane) - } - }) + const supportedTokens = lanesData[sourceChain][destChain].supportedTokens || [] + if (Array.isArray(supportedTokens)) { + supportedTokens.forEach((tokenSymbol) => { + if (tokenSupport[tokenSymbol]) { + tokenSupport[tokenSymbol].lanes.push(lane) + } + }) + } }) }) diff --git a/src/workers/data-worker.ts b/src/workers/data-worker.ts index 0d1ce44e2f9..ac75689d4ba 100644 --- a/src/workers/data-worker.ts +++ b/src/workers/data-worker.ts @@ -69,7 +69,7 @@ self.onmessage = (event: MessageEvent<WorkerMessage>) => { lane.sourceNetwork.name.toLowerCase().includes(searchLower) || lane.destinationNetwork.name.toLowerCase().includes(searchLower) - const hasTokens = lane.lane.supportedTokens ? Object.keys(lane.lane.supportedTokens).length > 0 : false + const hasTokens = lane.lane.supportedTokens ? lane.lane.supportedTokens.length > 0 : false return matchesNetwork && hasTokens }) From de58f9d12cc6eb44c08a58132ac3285e5d4e6388 Mon Sep 17 00:00:00 2001 From: aelmanaa <aelmanaa@gmail.com> Date: Wed, 10 Dec 2025 18:43:57 +0100 Subject: [PATCH 045/214] rate limits mocks --- public/api/ccip/v1/openapi.json | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/public/api/ccip/v1/openapi.json b/public/api/ccip/v1/openapi.json index 23b0af9dbad..0da5508b8e0 100644 --- a/public/api/ccip/v1/openapi.json +++ b/public/api/ccip/v1/openapi.json @@ -2010,11 +2010,13 @@ "type": "object", "properties": { "hasCustomFinality": { - "type": ["boolean", "null"], + "type": "boolean", + "nullable": true, "description": "Whether custom finality is enabled (derived from minBlockConfirmation > 0). Null if data is unavailable." }, "minBlockConfirmation": { - "type": ["integer", "null"], + "type": "integer", + "nullable": true, "description": "Minimum block confirmations required. Null if data is unavailable." } } @@ -2071,11 +2073,13 @@ "description": "Finality data for a token on a specific chain", "properties": { "hasCustomFinality": { - "type": ["boolean", "null"], + "type": "boolean", + "nullable": true, "description": "Whether custom finality is enabled (derived from minBlockConfirmation > 0). Null if data is unavailable." }, "minBlockConfirmation": { - "type": ["integer", "null"], + "type": "integer", + "nullable": true, "description": "Minimum block confirmations required. Null if data is unavailable." } } From 34d00ee2e9be78be494f853991990cc3f17db556 Mon Sep 17 00:00:00 2001 From: devin distefano <devin.distefano@smartcontract.com> Date: Wed, 10 Dec 2025 09:45:55 -0800 Subject: [PATCH 046/214] Data Feeds: Table Filtering, Pagination, and URL state improvements (#3272) * add support monad smartdata feeds * fix risk categorization * improved url param handling * link cleanup * llms * llms --- reports/llms-report.json | 18 +- src/content/data-feeds/aptos/index.mdx | 2 +- src/content/data-feeds/l2-sequencer-feeds.mdx | 6 + src/content/data-feeds/llms-full.txt | 6 +- src/content/data-streams/llms-full.txt | 14 +- .../data-streams/tutorials/go-sdk-fetch.mdx | 4 +- .../data-streams/tutorials/go-sdk-stream.mdx | 2 +- .../data-streams/tutorials/rust-sdk-fetch.mdx | 2 +- .../tutorials/rust-sdk-stream.mdx | 2 +- .../data-streams/tutorials/ts-sdk-fetch.mdx | 2 +- .../data-streams/tutorials/ts-sdk-stream.mdx | 2 +- src/features/data/chains.ts | 4 +- src/features/feeds/components/FeedList.tsx | 159 ++++++++------- src/features/feeds/components/Tables.tsx | 158 ++++++++------- .../feeds/components/urlStateHelpers.ts | 86 ++++++++ .../feeds/components/useCleanUrlParams.ts | 184 ++++++++++++++++++ src/hooks/useQueryString.ts | 3 +- 17 files changed, 476 insertions(+), 178 deletions(-) create mode 100644 src/features/feeds/components/urlStateHelpers.ts create mode 100644 src/features/feeds/components/useCleanUrlParams.ts diff --git a/reports/llms-report.json b/reports/llms-report.json index ed84678ece3..4e89e780fbf 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,5 +1,5 @@ { - "startedAt": "2025-12-09T18:45:48.237Z", + "startedAt": "2025-12-09T23:41:23.311Z", "siteBase": "https://docs.chain.link", "sections": [ { @@ -15,8 +15,8 @@ "pagesProcessed": 78, "outputPath": "src/content/cre/llms-full-ts.txt", "bytes": 612048, - "prevBytes": 611515, - "deltaBytes": 533 + "prevBytes": 612048, + "deltaBytes": 0 }, { "section": "vrf", @@ -38,16 +38,16 @@ "section": "data-feeds", "pagesProcessed": 37, "outputPath": "src/content/data-feeds/llms-full.txt", - "bytes": 302350, - "prevBytes": 302350, - "deltaBytes": 0 + "bytes": 302589, + "prevBytes": 302327, + "deltaBytes": 262 }, { "section": "data-streams", "pagesProcessed": 55, "outputPath": "src/content/data-streams/llms-full.txt", - "bytes": 477217, - "prevBytes": 477217, + "bytes": 477063, + "prevBytes": 477063, "deltaBytes": 0 }, { @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-09T18:45:52.560Z" + "finishedAt": "2025-12-09T23:41:27.135Z" } diff --git a/src/content/data-feeds/aptos/index.mdx b/src/content/data-feeds/aptos/index.mdx index 332edc23eed..e01dee5a2b4 100644 --- a/src/content/data-feeds/aptos/index.mdx +++ b/src/content/data-feeds/aptos/index.mdx @@ -127,7 +127,7 @@ You now have a funded testnet account on Aptos. - The `platform` address is the `ChainlinkPlatform` package address on Aptos testnet ([`0x516e771e1b4a903afe74c27d057c65849ecc1383782f6642d7ff21425f4f9c99`](https://explorer.aptoslabs.com/object/0x516e771e1b4a903afe74c27d057c65849ecc1383782f6642d7ff21425f4f9c99/modules/packages/ChainlinkPlatform?network=testnet)). - **Note**: You can find the mainnet addresses in the [Feeds Addresses](/data-feeds/price-feeds/addresses?page=1&testnetPage=1&network=aptos) page. + **Note**: You can find the mainnet addresses in the [Feeds Addresses](/data-feeds/price-feeds/addresses?network=aptos) page. 1. Run the following command to download the compiled bytecode for the `ChainlinkPlatform` and `ChainlinkDataFeeds` packages: diff --git a/src/content/data-feeds/l2-sequencer-feeds.mdx b/src/content/data-feeds/l2-sequencer-feeds.mdx index ec74f6a9254..b3d623b4c5a 100644 --- a/src/content/data-feeds/l2-sequencer-feeds.mdx +++ b/src/content/data-feeds/l2-sequencer-feeds.mdx @@ -71,6 +71,12 @@ Soneium Mainnet: [0xaDE1b9AbB98c6A542E4B49db2588a3Ec4bF7Cdf0](https://soneium.bl <br /> +### <img src="/assets/chains/xlayer.svg" style="height: 20px; width: auto; margin-right: 8px;" />X Layer + +X Layer Mainnet: [0x45c2b8C204568A03Dc7A2E32B71D67Fe97F908A9](https://www.okx.com/web3/explorer/xlayer/address/0x45c2b8C204568A03Dc7A2E32B71D67Fe97F908A9) + +<br /> + ### <img src="/assets/chains/zksync.svg" style="height: 20px; width: auto; margin-right: 8px;" />ZKsync zkSync Mainnet: [0x0E6AC8B967393dcD3D36677c126976157F993940](https://explorer.zksync.io/address/0x0E6AC8B967393dcD3D36677c126976157F993940) diff --git a/src/content/data-feeds/llms-full.txt b/src/content/data-feeds/llms-full.txt index 9bf4a207cb3..27fb79aff39 100644 --- a/src/content/data-feeds/llms-full.txt +++ b/src/content/data-feeds/llms-full.txt @@ -560,7 +560,7 @@ You now have a funded testnet account on Aptos. - The `platform` address is the `ChainlinkPlatform` package address on Aptos testnet ([`0x516e771e1b4a903afe74c27d057c65849ecc1383782f6642d7ff21425f4f9c99`](https://explorer.aptoslabs.com/object/0x516e771e1b4a903afe74c27d057c65849ecc1383782f6642d7ff21425f4f9c99/modules/packages/ChainlinkPlatform?network=testnet)). - **Note**: You can find the mainnet addresses in the [Feeds Addresses](/data-feeds/price-feeds/addresses?page=1\&testnetPage=1\&network=aptos) page. + **Note**: You can find the mainnet addresses in the [Feeds Addresses](/data-feeds/price-feeds/addresses?network=aptos) page. 3. Run the following command to download the compiled bytecode for the `ChainlinkPlatform` and `ChainlinkDataFeeds` packages: @@ -1393,6 +1393,10 @@ Scroll Mainnet: [0x45c2b8C204568A03Dc7A2E32B71D67Fe97F908A9](https://scrollscan. Soneium Mainnet: [0xaDE1b9AbB98c6A542E4B49db2588a3Ec4bF7Cdf0](https://soneium.blockscout.com/address/0xaDE1b9AbB98c6A542E4B49db2588a3Ec4bF7Cdf0) +### <img src="/assets/chains/xlayer.svg" style="height: 20px; width: auto; margin-right: 8px;" />X Layer + +X Layer Mainnet: [0x45c2b8C204568A03Dc7A2E32B71D67Fe97F908A9](https://www.okx.com/web3/explorer/xlayer/address/0x45c2b8C204568A03Dc7A2E32B71D67Fe97F908A9) + ### <img src="/assets/chains/zksync.svg" style="height: 20px; width: auto; margin-right: 8px;" />ZKsync zkSync Mainnet: [0x0E6AC8B967393dcD3D36677c126976157F993940](https://explorer.zksync.io/address/0x0E6AC8B967393dcD3D36677c126976157F993940) diff --git a/src/content/data-streams/llms-full.txt b/src/content/data-streams/llms-full.txt index 4fe902e67dc..2ed3dd881c8 100644 --- a/src/content/data-streams/llms-full.txt +++ b/src/content/data-streams/llms-full.txt @@ -5809,7 +5809,7 @@ You'll start with the set up of your Go project, installing the SDK and pasting See the [SDK Reference](/data-streams/reference/data-streams-api/go-sdk#config-struct) page for more configuration options. -5. Read from a [testnet crypto stream](/data-streams/crypto-streams?page=1\&testnetPage=1#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: +5. Read from a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: ```bash go run single-stream.go 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 @@ -5987,7 +5987,7 @@ You'll start with the set up of your Go project, installing the SDK and pasting export API_SECRET="<YOUR_API_SECRET>" ``` -4. Read from two [testnet crypto streams](/data-streams/crypto-streams?page=1\&testnetPage=1#testnet-crypto-streams). For this example, you will read from the ETH/USD and LINK/USD Data Streams crypto streams. Run your application: +4. Read from two [testnet crypto streams](/data-streams/crypto-streams#testnet-crypto-streams). For this example, you will read from the ETH/USD and LINK/USD Data Streams crypto streams. Run your application: ```bash go run multiple-streams.go 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 0x00036fe43f87884450b4c7e093cd5ed99cac6640d8c2000e6afc02c8838d0265 @@ -6427,7 +6427,7 @@ First, you'll set up a basic Go project, installing the SDK and pasting example See the [SDK Reference](/data-streams/reference/data-streams-api/go-sdk#config-struct) page for more configuration options. -5. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams?page=1\&testnetPage=1#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: +5. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: Execute your application: @@ -6822,7 +6822,7 @@ You'll start with the set up of your Rust project, installing the SDK and pastin See the [Rust SDK Reference](/data-streams/reference/data-streams-api/rust-sdk#configuration-reference) page for more configuration options. -3. Read from a [testnet crypto stream](/data-streams/crypto-streams?page=1\&testnetPage=1#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: +3. Read from a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: ```bash cargo run -- 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 @@ -7189,7 +7189,7 @@ In this tutorial, you'll learn how to use the [Data Streams SDK](/data-streams/r See the [Rust SDK Reference](/data-streams/reference/data-streams-api/rust-sdk#configuration-reference) page for more configuration options. -3. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams?page=1\&testnetPage=1#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: +3. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: ```bash cargo run -- 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 @@ -8487,7 +8487,7 @@ You'll start with the set up of your TypeScript project, installing the SDK and The TypeScript SDK automatically detects the report version based on the provided feed ID. </Aside> -3. Read from a [testnet crypto stream](/data-streams/crypto-streams?page=1\&testnetPage=1#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: +3. Read from a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: ```bash npx tsx singleStream.ts 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 @@ -9020,7 +9020,7 @@ First, you'll set up a basic TypeScript project, installing the SDK and pasting accordingly. </Aside> -3. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams?page=1\&testnetPage=1#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: +3. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: ```bash npx tsx stream.ts 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 diff --git a/src/content/data-streams/tutorials/go-sdk-fetch.mdx b/src/content/data-streams/tutorials/go-sdk-fetch.mdx index 7a3163b8207..6d2d62cfdbb 100644 --- a/src/content/data-streams/tutorials/go-sdk-fetch.mdx +++ b/src/content/data-streams/tutorials/go-sdk-fetch.mdx @@ -224,7 +224,7 @@ You'll start with the set up of your Go project, installing the SDK and pasting See the [SDK Reference](/data-streams/reference/data-streams-api/go-sdk#config-struct) page for more configuration options. -1. Read from a [testnet crypto stream](/data-streams/crypto-streams?page=1&testnetPage=1#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: +1. Read from a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: ```bash go run single-stream.go 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 @@ -404,7 +404,7 @@ You'll start with the set up of your Go project, installing the SDK and pasting export API_SECRET="<YOUR_API_SECRET>" ``` -1. Read from two [testnet crypto streams](/data-streams/crypto-streams?page=1&testnetPage=1#testnet-crypto-streams). For this example, you will read from the ETH/USD and LINK/USD Data Streams crypto streams. Run your application: +1. Read from two [testnet crypto streams](/data-streams/crypto-streams#testnet-crypto-streams). For this example, you will read from the ETH/USD and LINK/USD Data Streams crypto streams. Run your application: ```bash go run multiple-streams.go 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 0x00036fe43f87884450b4c7e093cd5ed99cac6640d8c2000e6afc02c8838d0265 diff --git a/src/content/data-streams/tutorials/go-sdk-stream.mdx b/src/content/data-streams/tutorials/go-sdk-stream.mdx index d861dd07326..a1793c02a5e 100644 --- a/src/content/data-streams/tutorials/go-sdk-stream.mdx +++ b/src/content/data-streams/tutorials/go-sdk-stream.mdx @@ -231,7 +231,7 @@ First, you'll set up a basic Go project, installing the SDK and pasting example See the [SDK Reference](/data-streams/reference/data-streams-api/go-sdk#config-struct) page for more configuration options. -1. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams?page=1&testnetPage=1#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: +1. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: Execute your application: diff --git a/src/content/data-streams/tutorials/rust-sdk-fetch.mdx b/src/content/data-streams/tutorials/rust-sdk-fetch.mdx index 2c5d5a6684d..ecea498a89d 100644 --- a/src/content/data-streams/tutorials/rust-sdk-fetch.mdx +++ b/src/content/data-streams/tutorials/rust-sdk-fetch.mdx @@ -181,7 +181,7 @@ You'll start with the set up of your Rust project, installing the SDK and pastin See the [Rust SDK Reference](/data-streams/reference/data-streams-api/rust-sdk#configuration-reference) page for more configuration options. -1. Read from a [testnet crypto stream](/data-streams/crypto-streams?page=1&testnetPage=1#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: +1. Read from a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: ```bash cargo run -- 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 diff --git a/src/content/data-streams/tutorials/rust-sdk-stream.mdx b/src/content/data-streams/tutorials/rust-sdk-stream.mdx index 47fef9f173d..74a7afd8cff 100644 --- a/src/content/data-streams/tutorials/rust-sdk-stream.mdx +++ b/src/content/data-streams/tutorials/rust-sdk-stream.mdx @@ -235,7 +235,7 @@ In this tutorial, you'll learn how to use the [Data Streams SDK](/data-streams/r See the [Rust SDK Reference](/data-streams/reference/data-streams-api/rust-sdk#configuration-reference) page for more configuration options. -1. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams?page=1&testnetPage=1#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: +1. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: ```bash cargo run -- 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 diff --git a/src/content/data-streams/tutorials/ts-sdk-fetch.mdx b/src/content/data-streams/tutorials/ts-sdk-fetch.mdx index 2947743de21..fa0e31a7191 100644 --- a/src/content/data-streams/tutorials/ts-sdk-fetch.mdx +++ b/src/content/data-streams/tutorials/ts-sdk-fetch.mdx @@ -164,7 +164,7 @@ You'll start with the set up of your TypeScript project, installing the SDK and The TypeScript SDK automatically detects the report version based on the provided feed ID. </Aside> -1. Read from a [testnet crypto stream](/data-streams/crypto-streams?page=1&testnetPage=1#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: +1. Read from a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, reading from the `ETH/USD` crypto stream: ```bash npx tsx singleStream.ts 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 diff --git a/src/content/data-streams/tutorials/ts-sdk-stream.mdx b/src/content/data-streams/tutorials/ts-sdk-stream.mdx index 61ef2c1b33b..0563400dc22 100644 --- a/src/content/data-streams/tutorials/ts-sdk-stream.mdx +++ b/src/content/data-streams/tutorials/ts-sdk-stream.mdx @@ -237,7 +237,7 @@ First, you'll set up a basic TypeScript project, installing the SDK and pasting accordingly. </Aside> -1. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams?page=1&testnetPage=1#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: +1. Subscribe to a [testnet crypto stream](/data-streams/crypto-streams#testnet-crypto-streams). The below example executes the application, subscribing to the `ETH/USD` crypto stream: ```bash npx tsx stream.ts 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 diff --git a/src/features/data/chains.ts b/src/features/data/chains.ts index 04c36dd89e3..ae28c769084 100644 --- a/src/features/data/chains.ts +++ b/src/features/data/chains.ts @@ -458,8 +458,8 @@ export const CHAINS: Chain[] = [ title: "Monad Data Feeds", label: "Monad", img: "/assets/chains/monad.svg", - networkStatusUrl: "", - tags: ["default"], + networkStatusUrl: "https://monadvision.com/", + tags: ["default", "smartData"], supportedFeatures: ["feeds"], networks: [ { diff --git a/src/features/feeds/components/FeedList.tsx b/src/features/feeds/components/FeedList.tsx index d7877e861d2..43d809409b1 100644 --- a/src/features/feeds/components/FeedList.tsx +++ b/src/features/feeds/components/FeedList.tsx @@ -13,9 +13,9 @@ 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" @@ -260,10 +260,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<boolean>(false) @@ -283,10 +289,26 @@ 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 [rwaSchemaFilterParam, setRwaSchemaFilterParam] = useQueryString("schema") @@ -313,16 +335,26 @@ export const FeedList = ({ }) } const closeAllDropdowns = () => setOpenDropdownId(null) - const paginate = (pageNumber) => setCurrentPage(String(pageNumber)) + 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 lastAddr = Number(currentPage) * addrPerPage + 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 [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 testnetLastAddr = Number(testnetCurrentPage) * testnetAddrPerPage + const testnetPageNum = Number(testnetCurrentPage) || 1 + const testnetLastAddr = testnetPageNum * testnetAddrPerPage const testnetFirstAddr = testnetLastAddr - testnetAddrPerPage // Dynamic feed categories loaded from Supabase @@ -500,56 +532,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 +597,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<HTMLDivElement>) => { useEffect(() => { @@ -1082,7 +1108,7 @@ export const FeedList = ({ lastAddr={lastAddr} firstAddr={firstAddr} addrPerPage={addrPerPage} - currentPage={Number(currentPage)} + currentPage={currentPageNum} paginate={paginate} searchValue={typeof searchValue === "string" ? searchValue : ""} /> @@ -1201,7 +1227,7 @@ export const FeedList = ({ firstAddr={testnetFirstAddr} lastAddr={testnetLastAddr} addrPerPage={testnetAddrPerPage} - currentPage={Number(testnetCurrentPage)} + currentPage={testnetPageNum} paginate={testnetPaginate} searchValue={typeof testnetSearchValue === "string" ? testnetSearchValue : ""} /> @@ -1294,7 +1320,7 @@ export const FeedList = ({ lastAddr={lastAddr} firstAddr={firstAddr} addrPerPage={addrPerPage} - currentPage={Number(currentPage)} + currentPage={currentPageNum} paginate={paginate} searchValue={typeof searchValue === "string" ? searchValue : ""} /> @@ -1485,7 +1511,7 @@ export const FeedList = ({ type="checkbox" style="width:15px;height:15px;display:inline;margin-right:8px;" checked={showExtraDetails} - onChange={() => setShowExtraDetails((old) => !old)} + onChange={() => setShowExtraDetails(!showExtraDetails)} /> Show more details </label> @@ -1512,10 +1538,7 @@ export const FeedList = ({ type="checkbox" style="width:15px;height:15px;display:inline;margin-right:8px;" checked={showOnlySVR} - onChange={() => { - setShowOnlySVR((old) => !old) - setCurrentPage("1") - }} + onChange={() => setShowOnlySVR(!showOnlySVR)} /> Show Smart Value Recapture (SVR) feeds </label> @@ -1540,7 +1563,7 @@ export const FeedList = ({ lastAddr={lastAddr} firstAddr={firstAddr} addrPerPage={addrPerPage} - currentPage={Number(currentPage)} + currentPage={currentPageNum} paginate={paginate} searchValue={typeof searchValue === "string" ? searchValue : ""} /> @@ -1647,7 +1670,7 @@ export const FeedList = ({ type="checkbox" style="width:15px;height:15px;display:inline;margin-right:8px;" checked={showExtraDetails} - onChange={() => setShowExtraDetails((old) => !old)} + onChange={() => setShowExtraDetails(!showExtraDetails)} /> Show more details </label> @@ -1717,7 +1740,7 @@ export const FeedList = ({ firstAddr={testnetFirstAddr} lastAddr={testnetLastAddr} addrPerPage={testnetAddrPerPage} - currentPage={Number(testnetCurrentPage)} + currentPage={testnetPageNum} paginate={testnetPaginate} searchValue={typeof testnetSearchValue === "string" ? testnetSearchValue : ""} /> diff --git a/src/features/feeds/components/Tables.tsx b/src/features/feeds/components/Tables.tsx index 80637922f72..a32e992f987 100644 --- a/src/features/feeds/components/Tables.tsx +++ b/src/features/feeds/components/Tables.tsx @@ -193,19 +193,9 @@ const DefaultTHead = ({ } const DefaultTr = ({ network, metadata, showExtraDetails, batchedCategoryData, dataFeedType }) => { - // Risk categorization logic - 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 // US Government Macroeconomic Data logic const isUSGovernmentMacroeconomicData = dataFeedType === "usGovernmentMacroeconomicData" @@ -409,19 +399,9 @@ const SmartDataTr = ({ network, metadata, showExtraDetails, batchedCategoryData // Only show MVR badge if explicitly flagged as MVR const finalIsMVRFeed = isMVRFlagSet && hasDecoding - // Resolve final category from batch (fallback to metadata) - const contractAddress = metadata.contractAddress || metadata.proxyAddress - const networkIdentifier = getNetworkIdentifier(network) - let finalTier = - contractAddress && batchedCategoryData?.size - ? (getFeedCategoryFromBatch(batchedCategoryData, contractAddress, networkIdentifier, metadata.feedCategory) - ?.final ?? metadata.feedCategory) - : metadata.feedCategory - - // Override with deprecating category if feed has shutdown date - if (metadata.docs?.shutdownDate) { - finalTier = "deprecating" - } + // Use the pre-computed finalCategory from enriched metadata + // (already includes deprecating status and Supabase risk tier) + const finalTier = metadata.finalCategory || metadata.feedCategory return ( <tr> @@ -1121,35 +1101,41 @@ 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 - } + // 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" } + } + + // 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 + + if (supabaseCategory) { + finalCategory = supabaseCategory } + } - if (batchCategory === "hidden") return false + return { ...metadata, finalCategory } + }) + + const filteredMetadata = enrichedMetadata + .sort((a, b) => (a.name.toUpperCase() < b.name.toUpperCase() ? -1 : 1)) + .filter((metadata) => { + // Filter out hidden feeds (from Supabase) + if (metadata.finalCategory === "hidden") return false if (showOnlySVR && !metadata.secondaryProxyAddress) { return false } @@ -1181,9 +1167,10 @@ export const MainnetTable = ({ return included } + // Filter by final category (Supabase risk tier takes precedence over RDD) return ( selectedFeedCategories.length === 0 || - selectedFeedCategories.map((cat) => cat.toLowerCase()).includes(metadata.feedCategory?.toLowerCase()) + selectedFeedCategories.map((cat) => cat.toLowerCase()).includes(metadata.finalCategory?.toLowerCase()) ) }) .filter( @@ -1339,35 +1326,41 @@ 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 - } + // 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" } + } + + // 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 + + if (supabaseCategory) { + finalCategory = supabaseCategory } + } + + return { ...metadata, finalCategory } + }) - if (batchCategory === "hidden") return false + const filteredMetadata = enrichedMetadata + .sort((a, b) => (a.name.toUpperCase() < b.name.toUpperCase() ? -1 : 1)) + .filter((metadata) => { + // Filter out hidden feeds (from Supabase) + if (metadata.finalCategory === "hidden") return false // Use shared visibility logic with filters return isFeedVisible(metadata, dataFeedType as any, undefined, { showOnlyDEXFeeds, @@ -1389,9 +1382,10 @@ export const TestnetTable = ({ return included } + // Filter by final category (Supabase risk tier takes precedence over RDD) return ( selectedFeedCategories.length === 0 || - selectedFeedCategories.map((cat) => cat.toLowerCase()).includes(metadata.feedCategory?.toLowerCase()) + selectedFeedCategories.map((cat) => cat.toLowerCase()).includes(metadata.finalCategory?.toLowerCase()) ) }) .filter( diff --git a/src/features/feeds/components/urlStateHelpers.ts b/src/features/feeds/components/urlStateHelpers.ts new file mode 100644 index 00000000000..4203e37b79b --- /dev/null +++ b/src/features/feeds/components/urlStateHelpers.ts @@ -0,0 +1,86 @@ +/** + * URL state management helpers for feed tables + * Clean up empty and default values from URLs + */ + +/** + * Update URL with only non-empty, non-default values + * Removes clutter like search=&page=1 + */ +export function updateUrlClean(updates: Record<string, string | number | boolean | undefined>) { + 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<FeedUrlParams> = { + 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<FeedUrlParams>, 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<FeedUrlParams>, clearRelated = false) => { + if (typeof window === "undefined") return + + const current = parseUrlParams(initialNetwork) + let newParams: Partial<FeedUrlParams> + + 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<FeedUrlParams> = {} + 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/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) From 3a4721e1ff8cddc862a4b4ea7268135be8c51254 Mon Sep 17 00:00:00 2001 From: aelmanaa <aelmanaa@gmail.com> Date: Wed, 10 Dec 2025 18:58:11 +0100 Subject: [PATCH 047/214] rate limits mocks --- public/api/ccip/v1/openapi.json | 20 ++++---- src/lib/ccip/services/lane-data.ts | 49 ++++++++++++------- src/lib/ccip/services/token-data.ts | 14 +++--- src/lib/ccip/types/index.ts | 4 +- src/lib/ccip/utils.ts | 12 ++--- src/pages/api/ccip/v1/chains.ts | 4 +- .../[source]/[destination]/index.ts | 2 +- .../[destination]/supported-tokens.ts | 2 +- .../[source]/[destination]/index.ts | 2 +- .../[destination]/supported-tokens.ts | 2 +- 10 files changed, 63 insertions(+), 48 deletions(-) diff --git a/public/api/ccip/v1/openapi.json b/public/api/ccip/v1/openapi.json index 0da5508b8e0..0be05a9bff9 100644 --- a/public/api/ccip/v1/openapi.json +++ b/public/api/ccip/v1/openapi.json @@ -87,8 +87,8 @@ "in": "query", "schema": { "type": "string", - "enum": ["chainId", "selector", "internalId"], - "default": "chainId" + "enum": ["chain_id", "selector", "internal_id"], + "default": "chain_id" }, "description": "Key to use for organizing the response data" }, @@ -274,8 +274,8 @@ "in": "query", "schema": { "type": "string", - "enum": ["chainId", "selector", "internalId"], - "default": "chainId" + "enum": ["chain_id", "selector", "internal_id"], + "default": "chain_id" }, "description": "Key to use for organizing the response data" } @@ -393,8 +393,8 @@ "in": "query", "schema": { "type": "string", - "enum": ["chainId", "selector", "internalId"], - "default": "chainId" + "enum": ["chain_id", "selector", "internal_id"], + "default": "chain_id" }, "description": "Key to use for organizing the response data by chain" } @@ -548,8 +548,8 @@ "in": "query", "schema": { "type": "string", - "enum": ["chainId", "selector", "internalId"], - "default": "chainId" + "enum": ["chain_id", "selector", "internal_id"], + "default": "chain_id" }, "description": "Key to use for organizing the response data by chain" } @@ -715,8 +715,8 @@ "in": "query", "schema": { "type": "string", - "enum": ["chainId", "selector", "internalId"], - "default": "chainId" + "enum": ["chain_id", "selector", "internal_id"], + "default": "chain_id" }, "description": "Key format to use for organizing the lane keys in the response" } diff --git a/src/lib/ccip/services/lane-data.ts b/src/lib/ccip/services/lane-data.ts index 41c2b97442e..fa3211c3646 100644 --- a/src/lib/ccip/services/lane-data.ts +++ b/src/lib/ccip/services/lane-data.ts @@ -252,18 +252,18 @@ export class LaneDataService { filters: LaneFilterType ): boolean { // Check source chain filters - if (filters.sourceChainId && !this.matchesChainFilter(sourceChain, filters.sourceChainId, "chainId")) { + if (filters.sourceChainId && !this.matchesChainFilter(sourceChain, filters.sourceChainId, "chain_id")) { return false } if (filters.sourceSelector && !this.matchesChainFilter(sourceChain, filters.sourceSelector, "selector")) { return false } - if (filters.sourceInternalId && !this.matchesChainFilter(sourceChain, filters.sourceInternalId, "internalId")) { + if (filters.sourceInternalId && !this.matchesChainFilter(sourceChain, filters.sourceInternalId, "internal_id")) { return false } // Check destination chain filters - if (filters.destinationChainId && !this.matchesChainFilter(destChain, filters.destinationChainId, "chainId")) { + if (filters.destinationChainId && !this.matchesChainFilter(destChain, filters.destinationChainId, "chain_id")) { return false } if (filters.destinationSelector && !this.matchesChainFilter(destChain, filters.destinationSelector, "selector")) { @@ -271,7 +271,7 @@ export class LaneDataService { } if ( filters.destinationInternalId && - !this.matchesChainFilter(destChain, filters.destinationInternalId, "internalId") + !this.matchesChainFilter(destChain, filters.destinationInternalId, "internal_id") ) { return false } @@ -285,14 +285,21 @@ export class LaneDataService { private matchesChainFilter( chain: ChainInfoInternal, filterValue: string, - filterType: "chainId" | "selector" | "internalId" + filterType: "chain_id" | "selector" | "internal_id" ): boolean { const filterValues = filterValue.split(",").map((v) => v.trim()) - const chainValue = chain[filterType].toString() + // Map snake_case filter types to camelCase property names + const propertyMap: Record<string, keyof ChainInfoInternal> = { + chain_id: "chainId", + selector: "selector", + internal_id: "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") + // For chain_id, also check generated chain key format + if (filterType === "chain_id") { + const generatedKey = generateChainKey(chain.chainId, chain.chainType, "chain_id") return filterValues.includes(chainValue) || filterValues.includes(generatedKey) } @@ -307,15 +314,23 @@ export class LaneDataService { destChain: ChainInfoInternal, outputKey: OutputKeyType ): string { + // Map snake_case output keys to camelCase property names + const propertyMap: Record<string, keyof ChainInfoInternal> = { + chain_id: "chainId", + selector: "selector", + internal_id: "internalId", + } + const propertyName = propertyMap[outputKey] + const sourceKey = - outputKey === "chainId" + outputKey === "chain_id" ? generateChainKey(sourceChain.chainId, sourceChain.chainType, outputKey) - : sourceChain[outputKey].toString() + : sourceChain[propertyName].toString() const destKey = - outputKey === "chainId" + outputKey === "chain_id" ? generateChainKey(destChain.chainId, destChain.chainType, outputKey) - : destChain[outputKey].toString() + : destChain[propertyName].toString() return `${sourceKey}_to_${destKey}` } @@ -515,14 +530,14 @@ export class LaneDataService { inputKeyType: LaneInputKeyType, chainsReferenceData: Record<string, ChainConfig> ): string | null { - // If already an internalId, return it directly - if (inputKeyType === "internalId") { + // If already an internal_id, return it directly + if (inputKeyType === "internal_id") { return chainsReferenceData[identifier] ? identifier : null } - // Search through chains to find matching chainId or selector + // Search through chains to find matching chain_id or selector for (const [internalId, chainConfig] of Object.entries(chainsReferenceData)) { - if (inputKeyType === "chainId") { + if (inputKeyType === "chain_id") { // Try to match by numeric chain ID try { const supportedChain = directoryToSupportedChain(internalId) diff --git a/src/lib/ccip/services/token-data.ts b/src/lib/ccip/services/token-data.ts index f8f1a70fd41..23f850bb1db 100644 --- a/src/lib/ccip/services/token-data.ts +++ b/src/lib/ccip/services/token-data.ts @@ -149,12 +149,12 @@ export class TokenDataService { if (!destNumericChainId) return destChainId - if (outputKey === "chainId") { + if (outputKey === "chain_id") { return generateChainKey(destNumericChainId, destChainType, outputKey) } else if (outputKey === "selector") { const selectorEntry = getSelectorEntry(destNumericChainId, destChainType) return selectorEntry?.selector || destChainId - } else if (outputKey === "internalId") { + } else if (outputKey === "internal_id") { const selectorEntry = getSelectorEntry(destNumericChainId, destChainType) return selectorEntry?.name || destChainId } @@ -164,14 +164,14 @@ export class TokenDataService { // Get the appropriate key based on outputKey parameter let chainKey = chainId - if (outputKey === "chainId") { + if (outputKey === "chain_id") { chainKey = generateChainKey(numericChainId, chainType, outputKey) } else if (outputKey === "selector") { const selectorEntry = getSelectorEntry(numericChainId, chainType) if (selectorEntry) { chainKey = selectorEntry.selector } - } else if (outputKey === "internalId") { + } else if (outputKey === "internal_id") { const selectorEntry = getSelectorEntry(numericChainId, chainType) if (selectorEntry) { chainKey = selectorEntry.name @@ -276,7 +276,7 @@ export class TokenDataService { public async getFilteredTokens( environment: Environment, filters: TokenFilterType, - outputKey: OutputKeyType = "chainId" + outputKey: OutputKeyType = "chain_id" ): Promise<TokenServiceResponse> { logger.info({ message: "Starting token filtering process", @@ -388,7 +388,7 @@ export class TokenDataService { public async getTokenWithFinality( environment: Environment, tokenCanonicalSymbol: string, - outputKey: OutputKeyType = "chainId" + outputKey: OutputKeyType = "chain_id" ): Promise<TokenDetailServiceResponse | null> { logger.info({ message: "Getting token with finality data", @@ -523,7 +523,7 @@ export class TokenDataService { public async getTokenFinality( environment: Environment, tokenCanonicalSymbol: string, - outputKey: OutputKeyType = "chainId" + outputKey: OutputKeyType = "chain_id" ): Promise<TokenFinalityServiceResponse | null> { logger.info({ message: "Getting token finality data", diff --git a/src/lib/ccip/types/index.ts b/src/lib/ccip/types/index.ts index 9ffcbac54ef..30232fed61d 100644 --- a/src/lib/ccip/types/index.ts +++ b/src/lib/ccip/types/index.ts @@ -64,7 +64,7 @@ export type ChainApiResponse = { }[] } -export type OutputKeyType = "chainId" | "selector" | "internalId" +export type OutputKeyType = "chain_id" | "selector" | "internal_id" export type ChainApiError = { error: string @@ -313,7 +313,7 @@ export interface LaneFilterType { /** * Input key type for lane path parameters */ -export type LaneInputKeyType = "chainId" | "selector" | "internalId" +export type LaneInputKeyType = "chain_id" | "selector" | "internal_id" /** * Metadata for single lane detail API responses diff --git a/src/lib/ccip/utils.ts b/src/lib/ccip/utils.ts index c3ce117762d..de1326f5ed0 100644 --- a/src/lib/ccip/utils.ts +++ b/src/lib/ccip/utils.ts @@ -332,12 +332,12 @@ export const validateFilters = (filters: FilterType): void => { * @returns Validated output key * @throws CCIPError if output key is invalid */ -export const validateOutputKey = (outputKey?: string): "chainId" | "selector" | "internalId" => { - if (!outputKey) return "chainId" - if (!["chainId", "selector", "internalId"].includes(outputKey)) { - throw new CCIPError(400, "output_key must be one of: chainId, selector, or internalId") +export const validateOutputKey = (outputKey?: string): "chain_id" | "selector" | "internal_id" => { + if (!outputKey) return "chain_id" + if (!["chain_id", "selector", "internal_id"].includes(outputKey)) { + throw new CCIPError(400, "output_key must be one of: chain_id, selector, or internal_id") } - return outputKey as "chainId" | "selector" | "internalId" + return outputKey as "chain_id" | "selector" | "internal_id" } /** @@ -358,7 +358,7 @@ export const validateEnrichFeeTokens = (enrichFeeTokens?: string): boolean => { export const generateChainKey = (chainId: number | string, chainType: ChainType, outputKey: OutputKeyType): string => { const chainIdStr = chainId.toString() - if (outputKey === "chainId" && chainType !== "evm" && chainType !== "solana") { + if (outputKey === "chain_id" && chainType !== "evm" && chainType !== "solana") { return `${chainType}-${chainIdStr}` } diff --git a/src/pages/api/ccip/v1/chains.ts b/src/pages/api/ccip/v1/chains.ts index dca37833e7c..98933605e8e 100644 --- a/src/pages/api/ccip/v1/chains.ts +++ b/src/pages/api/ccip/v1/chains.ts @@ -44,7 +44,7 @@ export const GET: APIRoute = async ({ request }) => { // Validate filters const filters: FilterType = { - chainId: params.get("chainId") || undefined, + chainId: params.get("chain_id") || undefined, selector: params.get("selector") || undefined, internalId: params.get("internalId") || undefined, } @@ -104,7 +104,7 @@ export const GET: APIRoute = async ({ request }) => { acc[family] = chainList.reduce( (familyAcc, chain) => { const key = - outputKey === "chainId" + outputKey === "chain_id" ? generateChainKey(chain.chainId, chain.chainType, outputKey) : outputKey ? chain[outputKey].toString() 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 index 93166516917..afbdf413edd 100644 --- 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 @@ -42,7 +42,7 @@ export const GET: APIRoute = async ({ params, request }) => { }) const laneDataService = new LaneDataService() - const result = await laneDataService.getLaneDetails(environment, source, destination, "chainId") + const result = await laneDataService.getLaneDetails(environment, source, destination, "chain_id") if (!result.data) { throw new CCIPError(404, `Lane from chain '${source}' to chain '${destination}' not found`) 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 index 5cdc882b0ee..555dec2a5db 100644 --- 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 @@ -42,7 +42,7 @@ export const GET: APIRoute = async ({ params, request }) => { }) const laneDataService = new LaneDataService() - const result = await laneDataService.getSupportedTokensWithRateLimits(environment, source, destination, "chainId") + const result = await laneDataService.getSupportedTokensWithRateLimits(environment, source, destination, "chain_id") if (!result.data) { throw new CCIPError(404, `Lane from chain '${source}' to chain '${destination}' not found`) 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 index d05d3828354..9d0a9ca98ff 100644 --- 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 @@ -42,7 +42,7 @@ export const GET: APIRoute = async ({ params, request }) => { }) const laneDataService = new LaneDataService() - const result = await laneDataService.getLaneDetails(environment, source, destination, "internalId") + const result = await laneDataService.getLaneDetails(environment, source, destination, "internal_id") if (!result.data) { throw new CCIPError(404, `Lane from '${source}' to '${destination}' not found`) 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 index da66dc7ac88..93fc939158e 100644 --- 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 @@ -46,7 +46,7 @@ export const GET: APIRoute = async ({ params, request }) => { environment, source, destination, - "internalId" + "internal_id" ) if (!result.data) { From f1cb0b84734fa22097761a9e135b2a7b2579e23f Mon Sep 17 00:00:00 2001 From: sebastian-lerner-link <sebastian.lerner@smartcontract.com> Date: Wed, 10 Dec 2025 18:27:00 -0500 Subject: [PATCH 048/214] add details on what happens when a feed is shutdown (#3276) * add details on what happens when a feed is shutdown * formatting + slight wording adjustment --------- Co-authored-by: devin distefano <devin.distefano@smartcontract.com> --- reports/llms-report.json | 10 +++++----- src/content/data-feeds/llms-full.txt | 8 ++++++++ src/content/data-feeds/selecting-data-feeds.mdx | 7 +++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index 4e89e780fbf..0ed858d2f18 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,5 +1,5 @@ { - "startedAt": "2025-12-09T23:41:23.311Z", + "startedAt": "2025-12-10T23:13:13.756Z", "siteBase": "https://docs.chain.link", "sections": [ { @@ -38,9 +38,9 @@ "section": "data-feeds", "pagesProcessed": 37, "outputPath": "src/content/data-feeds/llms-full.txt", - "bytes": 302589, - "prevBytes": 302327, - "deltaBytes": 262 + "bytes": 302816, + "prevBytes": 302589, + "deltaBytes": 227 }, { "section": "data-streams", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-09T23:41:27.135Z" + "finishedAt": "2025-12-10T23:13:17.715Z" } diff --git a/src/content/data-feeds/llms-full.txt b/src/content/data-feeds/llms-full.txt index 27fb79aff39..6955dc98310 100644 --- a/src/content/data-feeds/llms-full.txt +++ b/src/content/data-feeds/llms-full.txt @@ -3216,6 +3216,14 @@ Data feeds managed by Chainlink Labs will be considered for deprecation if they Known users of these feeds will be contacted directly about the feeds' deprecation. Notifications will also be posted on the [Feeds Scheduled For Deprecation](/data-feeds/deprecating-feeds) page and on our [Discord channel](https://discord.com/channels/592041321326182401/991444378335838318) with two weeks of notice before they are shut down. + +<Aside type="note" title="Data Feed Shutdown Behavior"> + Once a feed is shutdown, calls to the feed will behave as follows: + + - `lastAnswer` will return `0` + - `latestRoundData` will revert with no data available +</Aside> + ## Market hours In addition to categories, be aware that markets for several assets are actively traded only during certain hours. Listed data feeds include an attribute describing their market hours. Chainlink Labs recommends using these feeds only during their specified hours: diff --git a/src/content/data-feeds/selecting-data-feeds.mdx b/src/content/data-feeds/selecting-data-feeds.mdx index 57cbcc67ccd..490c954c80f 100644 --- a/src/content/data-feeds/selecting-data-feeds.mdx +++ b/src/content/data-feeds/selecting-data-feeds.mdx @@ -103,6 +103,13 @@ Data feeds managed by Chainlink Labs will be considered for deprecation if they Known users of these feeds will be contacted directly about the feeds' deprecation. Notifications will also be posted on the [Feeds Scheduled For Deprecation](/data-feeds/deprecating-feeds) page and on our [Discord channel](https://discord.com/channels/592041321326182401/991444378335838318) with two weeks of notice before they are shut down. +{/* prettier-ignore */} +<Aside type="note" title="Data Feed Shutdown Behavior"> + Once a feed is shutdown, calls to the feed will behave as follows: + - `lastAnswer` will return `0` + - `latestRoundData` will revert with no data available +</Aside> + ## Market hours In addition to categories, be aware that markets for several assets are actively traded only during certain hours. Listed data feeds include an attribute describing their market hours. Chainlink Labs recommends using these feeds only during their specified hours: From ac1d527d32857f5d2f82c4c43660afb7fbaccffd Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Thu, 11 Dec 2025 06:47:10 -0600 Subject: [PATCH 049/214] Finality, confidence levels, custom depth (#3247) * add finality & confidence levels docs * add finality & confidence levels docs * add finality & confidence levels docs * finality clarifications + custom block depth support for chain reads * nit one liner code improvement * clarifications * add chain write finality + reorg * update custom depth w/ new helpers * nit update dates * nit clarification * llm gen --- reports/llms-report.json | 18 +- src/config/sidebar.ts | 5 + src/content/cre/concepts/finality-go.mdx | 117 ++++++++++ src/content/cre/concepts/finality-ts.mdx | 117 ++++++++++ .../using-evm-client/onchain-read-go.mdx | 69 +++++- .../using-evm-client/onchain-read-ts.mdx | 52 ++++- src/content/cre/llms-full-go.txt | 212 +++++++++++++++--- src/content/cre/llms-full-ts.txt | 190 ++++++++++++++-- .../cre/reference/sdk/evm-client-go.mdx | 27 +-- .../cre/reference/sdk/evm-client-ts.mdx | 22 +- .../sdk/triggers/evm-log-trigger-go.mdx | 6 +- .../sdk/triggers/evm-log-trigger-ts.mdx | 6 +- 12 files changed, 744 insertions(+), 97 deletions(-) create mode 100644 src/content/cre/concepts/finality-go.mdx create mode 100644 src/content/cre/concepts/finality-ts.mdx diff --git a/reports/llms-report.json b/reports/llms-report.json index 0ed858d2f18..84689f01051 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,22 +1,22 @@ { - "startedAt": "2025-12-10T23:13:13.756Z", + "startedAt": "2025-12-11T12:22:09.628Z", "siteBase": "https://docs.chain.link", "sections": [ { "section": "cre-go", - "pagesProcessed": 83, + "pagesProcessed": 84, "outputPath": "src/content/cre/llms-full-go.txt", - "bytes": 656030, - "prevBytes": 656030, + "bytes": 667067, + "prevBytes": 667067, "deltaBytes": 0 }, { "section": "cre-ts", - "pagesProcessed": 78, + "pagesProcessed": 79, "outputPath": "src/content/cre/llms-full-ts.txt", - "bytes": 612048, - "prevBytes": 612048, - "deltaBytes": 0 + "bytes": 623424, + "prevBytes": 623539, + "deltaBytes": -115 }, { "section": "vrf", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-10T23:13:17.715Z" + "finishedAt": "2025-12-11T12:22:14.025Z" } diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index c70e3d9195a..d9cadf64fc9 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -418,6 +418,11 @@ export const SIDEBAR: Partial<Record<Sections, SectionEntry[]>> = { title: "TypeScript Runtime Environment", url: "cre/concepts/typescript-wasm-runtime", }, + { + title: "Finality & Confidence Levels", + url: "cre/concepts/finality", + highlightAsCurrent: ["cre/concepts/finality-go", "cre/concepts/finality-ts"], + }, ], }, { diff --git a/src/content/cre/concepts/finality-go.mdx b/src/content/cre/concepts/finality-go.mdx new file mode 100644 index 00000000000..662e0ce9b17 --- /dev/null +++ b/src/content/cre/concepts/finality-go.mdx @@ -0,0 +1,117 @@ +--- +section: cre +title: "Finality and Confidence Levels" +date: Last Modified +sdkLang: "go" +pageId: "concepts-finality" +metadata: + description: "Understand how CRE handles blockchain finality across different chains, including confidence levels, finality tags, and block depth configurations." + datePublished: "2025-12-10" + lastModified: "2025-12-10" +--- + +import { Aside, CopyText } from "@components" + +Finality determines when a blockchain transaction is considered irreversible. Until a block is finalized, it could be reorganized (replaced by a different block if the chain temporarily forks), which means any data you read from it might change. + +Different blockchains achieve finality in different ways and at different speeds. CRE abstracts these differences through **confidence levels**, allowing you to specify your finality requirements without needing to know the underlying chain-specific implementation. + +## Understanding CRE's finality model + +CRE provides three confidence levels for reading blockchain data and monitoring events. These levels work consistently across all supported chains. + +### The three confidence levels + +| Confidence Level | Description | Use Case | +| ---------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| **`LATEST`** | The most recent block. No finality guarantees—the block could still be reorganized. | Non-critical, time-sensitive operations where speed matters more than certainty. | +| **`SAFE`** | A block that is unlikely to be reorganized, but not yet fully finalized. | A balance between speed and security for most operations. | +| **`FINALIZED`** | A block that is considered irreversible. This is the safest option. | Critical operations where you need absolute certainty the data won't change. | + +**Choosing the right level:** + +- **`FINALIZED`** — Use for financial transactions, critical state updates, or when incorrect data could cause significant issues +- **`SAFE`** — Use when you need reasonable confidence without waiting for full finality (good for most monitoring/alerting) +- **`LATEST`** — Use for real-time dashboards or displays where speed matters more than guaranteed accuracy + +### How confidence levels map to chains + +**SAFE and LATEST:** + +CRE uses the chain's native `safe` and `latest` block tags respectively for all supported chains. + +**FINALIZED:** + +When you specify `FINALIZED` in your workflow, CRE automatically maps this to a native finality tag or a block depth threshold depending on the chain. + +| Chain | Finality Method | Block Depth | +| ------------------------------- | ---------------------------- | ----------- | +| Arbitrum One / Arbitrum Sepolia | Native `finalized` tag | — | +| Avalanche / Avalanche Fuji | Native `finalized` tag | — | +| Base / Base Sepolia | Native `finalized` tag | — | +| BNB Chain / BNB Testnet | Native `finalized` tag | — | +| Ethereum / Ethereum Sepolia | Native `finalized` tag | — | +| OP Mainnet / OP Sepolia | Native `finalized` tag | — | +| Polygon / Polygon Amoy | Block depth (500 blocks ago) | 500 | + +## Finality for chain reads + +Chain read operations ([`CallContract`](/cre/reference/sdk/evm-client-go#callcontract), [`BalanceAt`](/cre/reference/sdk/evm-client-go#balanceat), [`FilterLogs`](/cre/reference/sdk/evm-client-go#filterlogs), etc.) support confidence levels and custom block depths. + +### Using confidence levels + +For most read operations, use the standard confidence levels by passing `-2` (latest) or `-3` (finalized) as the `BlockNumber` parameter. If you don't specify a block number, CRE defaults to `LATEST`. + +**Note:** The `SAFE` confidence level is not available for chain reads—only `LATEST` and `FINALIZED` are supported. + +### Custom block depths + +For use cases requiring fixed confirmation thresholds or historical state verification, you can specify **any explicit block number** instead of using the predefined confidence levels. This enables you to: + +- Implement custom finality rules tailored to your risk profile (e.g., "always wait 1,000 blocks") +- Meet regulatory requirements that mandate fixed, auditable confirmation thresholds +- Query historical state at specific past block heights for analysis or verification + +**When to use custom block depths:** + +- **Regulatory compliance** — Your interactions require provable, fixed confirmation thresholds for auditors +- **Changing chain parameters** — The chain's finality definition may change, but your security model must remain constant +- **Historical verification** — You need to verify state at a specific moment + +**Implementation:** + +You can pass any `*big.Int` directly as the `BlockNumber` parameter. The SDK accepts both special values (like `-2` for latest, `-3` for finalized) and positive integers for explicit block heights. See [Onchain Read](/cre/guides/workflow/using-evm-client/onchain-read-go#custom-block-depths) for examples. + +## Finality for chain writes + +Chain write operations return a [`WriteReportReply`](/cre/reference/sdk/evm-client-go#evmwritereportreply) when the transaction is included in a block, not when it reaches finality. + +### What a successful response means + +When [`WriteReportReply`](/cre/reference/sdk/evm-client-go#evmwritereportreply) returns with `TxStatus` equal to `SUCCESS`: + +- Your transaction was **included in a block** +- The transaction is **not necessarily finalized** yet + +The reply is returned as soon as the transaction appears in a block, not when the block reaches finality. This is important for time-sensitive workflows, but it means the transaction could still be reorganized. + +### Reorg handling + +If a block containing your transaction is reorganized: + +- CRE's Transaction Manager (TXM) automatically resubmits your transaction +- Gas bumping is applied as needed to ensure the transaction is included +- **Important:** The transaction hash may change during resubmission +- You are not automatically notified if the hash changes + +<Aside type="caution" title="For mission-critical applications"> + If you need absolute certainty that your write transaction reached finality, implement post-write verification by + reading the blockchain state after a custom number of confirmations. Do not rely solely on `WriteReportReply` for + finality confirmation. +</Aside> + +## Finality for event triggers + +EVM Log Triggers must use the three confidence levels (`LATEST`, `SAFE`, or `FINALIZED`). Custom block depths are not supported for triggers. + +By default, triggers use `SAFE` if no confidence level is specified. For details on configuring trigger confidence levels, see [EVM Log Trigger](/cre/reference/sdk/triggers/evm-log-trigger-go#evmfilterlogtriggerrequest). diff --git a/src/content/cre/concepts/finality-ts.mdx b/src/content/cre/concepts/finality-ts.mdx new file mode 100644 index 00000000000..b1f71c0ea63 --- /dev/null +++ b/src/content/cre/concepts/finality-ts.mdx @@ -0,0 +1,117 @@ +--- +section: cre +title: "Finality and Confidence Levels" +date: Last Modified +sdkLang: "ts" +pageId: "concepts-finality" +metadata: + description: "Understand how CRE handles blockchain finality across different chains, including confidence levels, finality tags, and block depth configurations." + datePublished: "2025-12-10" + lastModified: "2025-12-10" +--- + +import { Aside, CopyText } from "@components" + +Finality determines when a blockchain transaction is considered irreversible. Until a block is finalized, it could be reorganized (replaced by a different block if the chain temporarily forks), which means any data you read from it might change. + +Different blockchains achieve finality in different ways and at different speeds. CRE abstracts these differences through **confidence levels**, allowing you to specify your finality requirements without needing to know the underlying chain-specific implementation. + +## Understanding CRE's finality model + +CRE provides three confidence levels for reading blockchain data and monitoring events. These levels work consistently across all supported chains. + +### The three confidence levels + +| Confidence Level | Description | Use Case | +| ---------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| **`LATEST`** | The most recent block. No finality guarantees—the block could still be reorganized. | Non-critical, time-sensitive operations where speed matters more than certainty. | +| **`SAFE`** | A block that is unlikely to be reorganized, but not yet fully finalized. | A balance between speed and security for most operations. | +| **`FINALIZED`** | A block that is considered irreversible. This is the safest option. | Critical operations where you need absolute certainty the data won't change. | + +**Choosing the right level:** + +- **`FINALIZED`** — Use for financial transactions, critical state updates, or when incorrect data could cause significant issues +- **`SAFE`** — Use when you need reasonable confidence without waiting for full finality (good for most monitoring/alerting) +- **`LATEST`** — Use for real-time dashboards or displays where speed matters more than guaranteed accuracy + +### How confidence levels map to chains + +**SAFE and LATEST:** + +CRE uses the chain's native `safe` and `latest` block tags respectively for all supported chains. + +**FINALIZED:** + +When you specify `FINALIZED` in your workflow, CRE automatically maps this to its finality method—whether it uses the native finality tag or block depth (with the number of blocks specified for block depth). + +| Chain | Finality Method | +| ------------------------------- | ------------------------ | +| Arbitrum One / Arbitrum Sepolia | Native `finalized` tag | +| Avalanche / Avalanche Fuji | Native `finalized` tag | +| Base / Base Sepolia | Native `finalized` tag | +| BNB Chain / BNB Testnet | Native `finalized` tag | +| Ethereum / Ethereum Sepolia | Native `finalized` tag | +| OP Mainnet / OP Sepolia | Native `finalized` tag | +| Polygon / Polygon Amoy | Block depth (500 blocks) | + +## Finality for chain reads + +Chain read operations ([`CallContract`](/cre/reference/sdk/evm-client-ts#callcontract), [`BalanceAt`](/cre/reference/sdk/evm-client-ts#balanceat), [`FilterLogs`](/cre/reference/sdk/evm-client-ts#filterlogs), etc.) support confidence levels and custom block depths. + +### Using confidence levels + +For most read operations, use the standard confidence levels by passing [`LATEST_BLOCK_NUMBER`](/cre/reference/sdk/evm-client-ts#latest_block_number) or [`LAST_FINALIZED_BLOCK_NUMBER`](/cre/reference/sdk/evm-client-ts#last_finalized_block_number) as the `blockNumber` parameter. If you don't specify a block number, CRE defaults to `LATEST`. + +**Note:** The `SAFE` confidence level is not available for chain reads—only `LATEST` and `FINALIZED` are supported. + +### Custom block depths + +For use cases requiring fixed confirmation thresholds or historical state verification, you can specify **any explicit block number** instead of using the predefined confidence levels. This enables you to: + +- Implement custom finality rules tailored to your risk profile (e.g., "always wait 1,000 blocks") +- Meet regulatory requirements that mandate fixed, auditable confirmation thresholds +- Query historical state at specific past block heights for analysis or verification + +**When to use custom block depths:** + +- **Regulatory compliance** — Your interactions require provable, fixed confirmation thresholds for auditors +- **Changing chain parameters** — The chain's finality definition may change, but your security model must remain constant +- **Historical verification** — You need to verify state at a specific moment + +**Implementation:** + +Block numbers must be provided as `BigIntJson` objects. See [Onchain Read](/cre/guides/workflow/using-evm-client/onchain-read-ts#custom-block-depths) for the conversion pattern and examples. + +## Finality for chain writes + +Chain write operations return a [`WriteReportReply`](/cre/reference/sdk/evm-client-ts#writereportreply) when the transaction is included in a block, not when it reaches finality. + +### What a successful response means + +When [`WriteReportReply`](/cre/reference/sdk/evm-client-ts#writereportreply) returns with `txStatus` equal to `TX_STATUS_SUCCESS`: + +- Your transaction was **included in a block** +- The transaction is **not necessarily finalized** yet + +The reply is returned as soon as the transaction appears in a block, not when the block reaches finality. This is important for time-sensitive workflows, but it means the transaction could still be reorganized. + +### Reorg handling + +If a block containing your transaction is reorganized: + +- CRE's Transaction Manager (TXM) automatically resubmits your transaction +- Gas bumping is applied as needed to ensure the transaction is included +- **Important:** The transaction hash may change during resubmission +- You are not automatically notified if the hash changes + +<Aside type="caution" title="For mission-critical applications"> + If you need absolute certainty that your write transaction reached finality, implement post-write verification by + reading the blockchain state after a custom number of confirmations. Do not rely solely on `WriteReportReply` for + finality confirmation. +</Aside> + +## Finality for event triggers + +EVM Log Triggers must use the three confidence levels (`LATEST`, `SAFE`, or `FINALIZED`). Custom block depths are not supported for triggers. + +By default, triggers use `SAFE` if no confidence level is specified. For details on configuring trigger confidence levels, see [EVM Log Trigger](/cre/reference/sdk/triggers/evm-log-trigger-ts#configuration). diff --git a/src/content/cre/guides/workflow/using-evm-client/onchain-read-go.mdx b/src/content/cre/guides/workflow/using-evm-client/onchain-read-go.mdx index 69e189775b5..20d9f6e0228 100644 --- a/src/content/cre/guides/workflow/using-evm-client/onchain-read-go.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/onchain-read-go.mdx @@ -7,7 +7,7 @@ date: Last Modified metadata: description: "Read data from smart contracts in Go: learn to call view functions and fetch verified blockchain state in your workflows." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2025-12-10" --- import { Aside } from "@components" @@ -153,28 +153,73 @@ When calling contract read methods, you must specify a block number. There are t ### Using magic numbers -- **Finalized block**: Use `big.NewInt(-3)` to read from the latest finalized block +- **Finalized block**: Use `big.NewInt(-3)` to read from the latest finalized block (recommended for production) - **Latest block**: Use `big.NewInt(-2)` to read from the latest block -- **Specific block**: Use `big.NewInt(blockNumber)` to read from a specific block -### Using rpc constants (alternative) +For explicit block numbers, see [Custom block depths](#custom-block-depths) below. -You can also use constants from the `go-ethereum/rpc` package for better readability: +### Custom block depths + +For use cases requiring fixed confirmation thresholds (e.g., regulatory compliance) or historical state verification, you can specify an exact block number. + +**Example 1 - Read from a specific historical block**: + +```go +// Read from block 12345678 +specificBlock := big.NewInt(12345678) +value, err := storageContract.Get(runtime, specificBlock).Await() +if err != nil { + return nil, fmt.Errorf("failed to read from specific block: %w", err) +} +``` + +**Example 2 - Read from 500 blocks ago from latest block**: ```go import ( - "math/big" - "github.com/ethereum/go-ethereum/rpc" + pb "github.com/smartcontractkit/chainlink-protos/cre/go/values/pb" ) -// For latest block -reqBlockNumber := big.NewInt(rpc.LatestBlockNumber.Int64()) +// Helper to convert protobuf BigInt to standard library big.Int +func pbBigIntToBigInt(pb *pb.BigInt) *big.Int { + if pb == nil { + return nil + } + result := new(big.Int).SetBytes(pb.AbsVal) + if pb.Sign < 0 { + result.Neg(result) + } + return result +} + +// Get the latest block number +latestHeader, err := evmClient.HeaderByNumber(runtime, &evm.HeaderByNumberRequest{}).Await() +if err != nil { + return nil, fmt.Errorf("failed to get latest block: %w", err) +} + +// Convert protobuf BigInt to standard library big.Int +latestBlockNum := pbBigIntToBigInt(latestHeader.Header.BlockNumber) +customDepth := big.NewInt(500) +customBlock := new(big.Int).Sub(latestBlockNum, customDepth) -// For finalized block -reqBlockNumber := big.NewInt(rpc.FinalizedBlockNumber.Int64()) +// Use the custom block number with the contract binding +value, err := storageContract.Get(runtime, customBlock).Await() +if err != nil { + return nil, fmt.Errorf("failed to read from custom block: %w", err) +} ``` -Both approaches are equivalent - use whichever you find more readable in your code. +**Understanding the conversion:** + +The `pbBigIntToBigInt` helper converts the SDK's protobuf `*pb.BigInt` type (which stores the value as `AbsVal []byte` and `Sign int64`) to Go's standard library `*big.Int`. This allows you to perform arithmetic operations like subtracting 500 blocks. + +<Aside type="note" title="SDK enhancement planned"> + The SDK team is working on a built-in helper to simplify this conversion. Until then, use the `pbBigIntToBigInt` + helper shown above. +</Aside> + +See [Finality and Confidence Levels](/cre/concepts/finality-go) for more details on when to use custom block depths. ## Complete example diff --git a/src/content/cre/guides/workflow/using-evm-client/onchain-read-ts.mdx b/src/content/cre/guides/workflow/using-evm-client/onchain-read-ts.mdx index 5634f0b6af8..cfbab411819 100644 --- a/src/content/cre/guides/workflow/using-evm-client/onchain-read-ts.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/onchain-read-ts.mdx @@ -7,7 +7,7 @@ date: Last Modified metadata: description: "Read data from smart contracts in TypeScript: learn to call view functions and fetch verified blockchain state in your workflows." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2025-12-10" --- import { Aside } from "@components" @@ -168,7 +168,7 @@ When calling `callContract()`, you can specify which block to read from: - **`LAST_FINALIZED_BLOCK_NUMBER`**: Read from the last finalized block (recommended for production) - **`LATEST_BLOCK_NUMBER`**: Read from the latest block -- **Specific block**: Use an object with `{ absVal: "base64EncodedNumber", sign: "1" }` format +- **Custom block number**: Use a `BigIntJson` object for custom finality depths or historical queries ```typescript import { LAST_FINALIZED_BLOCK_NUMBER, LATEST_BLOCK_NUMBER } from "@chainlink/cre-sdk" @@ -186,6 +186,54 @@ const contractCall = evmClient.callContract(runtime, { }).result() ``` +#### Custom block depths + +For use cases requiring fixed confirmation thresholds (e.g., regulatory compliance) or historical state verification, you can specify an exact block number. + +**Example 1 - Read from a specific historical block**: + +```typescript +import { blockNumber } from '@chainlink/cre-sdk' + +const historicalBlock = 9767655n +const contractCall = evmClient.callContract(runtime, { + call: encodeCallMsg({...}), + blockNumber: blockNumber(historicalBlock), +}).result() +``` + +**Example 2 - Read from 500 blocks ago for custom finality**: + +```typescript +import { protoBigIntToBigint, blockNumber } from '@chainlink/cre-sdk' + +// Get the latest block number +const latestHeader = evmClient.headerByNumber(runtime, {}).result() +if (!latestHeader.header?.blockNumber) { + throw new Error("Failed to get latest block number") +} + +// Convert protobuf BigInt to native bigint and calculate custom block +const latestBlockNum = protoBigIntToBigint(latestHeader.header.blockNumber) +const customBlock = latestBlockNum - 500n + +// Call the contract at the custom block height +const contractCall = evmClient.callContract(runtime, { + call: encodeCallMsg({...}), + blockNumber: blockNumber(customBlock), +}).result() +``` + +**Helper functions:** + +The SDK provides two helper functions for working with block numbers: + +- **`protoBigIntToBigint(pb)`** — Converts a protobuf `BigInt` (returned by SDK methods like `headerByNumber`) to a native JavaScript `bigint`. Use this when you need to perform arithmetic on block numbers. + +- **`blockNumber(n)`** — Converts a native `bigint`, `number`, or `string` to the protobuf `BigInt` JSON format required by SDK methods. This is an alias for `bigintToProtoBigInt`. + +See [Finality and Confidence Levels](/cre/concepts/finality-ts) for more details on when to use custom block depths. + ### Encoding call messages with `encodeCallMsg()` The `encodeCallMsg()` helper converts your hex-formatted call data into the base64 format required by the EVM capability: diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 7afe0b87947..5488008f646 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -8323,6 +8323,116 @@ cre version v1.0.2 --- +# Finality and Confidence Levels +Source: https://docs.chain.link/cre/concepts/finality-go +Last Updated: 2025-12-10 + +Finality determines when a blockchain transaction is considered irreversible. Until a block is finalized, it could be reorganized (replaced by a different block if the chain temporarily forks), which means any data you read from it might change. + +Different blockchains achieve finality in different ways and at different speeds. CRE abstracts these differences through **confidence levels**, allowing you to specify your finality requirements without needing to know the underlying chain-specific implementation. + +## Understanding CRE's finality model + +CRE provides three confidence levels for reading blockchain data and monitoring events. These levels work consistently across all supported chains. + +### The three confidence levels + +| Confidence Level | Description | Use Case | +| ---------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| **`LATEST`** | The most recent block. No finality guarantees—the block could still be reorganized. | Non-critical, time-sensitive operations where speed matters more than certainty. | +| **`SAFE`** | A block that is unlikely to be reorganized, but not yet fully finalized. | A balance between speed and security for most operations. | +| **`FINALIZED`** | A block that is considered irreversible. This is the safest option. | Critical operations where you need absolute certainty the data won't change. | + +**Choosing the right level:** + +- **`FINALIZED`** — Use for financial transactions, critical state updates, or when incorrect data could cause significant issues +- **`SAFE`** — Use when you need reasonable confidence without waiting for full finality (good for most monitoring/alerting) +- **`LATEST`** — Use for real-time dashboards or displays where speed matters more than guaranteed accuracy + +### How confidence levels map to chains + +**SAFE and LATEST:** + +CRE uses the chain's native `safe` and `latest` block tags respectively for all supported chains. + +**FINALIZED:** + +When you specify `FINALIZED` in your workflow, CRE automatically maps this to a native finality tag or a block depth threshold depending on the chain. + +| Chain | Finality Method | Block Depth | +| ------------------------------- | ---------------------------- | ----------- | +| Arbitrum One / Arbitrum Sepolia | Native `finalized` tag | — | +| Avalanche / Avalanche Fuji | Native `finalized` tag | — | +| Base / Base Sepolia | Native `finalized` tag | — | +| BNB Chain / BNB Testnet | Native `finalized` tag | — | +| Ethereum / Ethereum Sepolia | Native `finalized` tag | — | +| OP Mainnet / OP Sepolia | Native `finalized` tag | — | +| Polygon / Polygon Amoy | Block depth (500 blocks ago) | 500 | + +## Finality for chain reads + +Chain read operations ([`CallContract`](/cre/reference/sdk/evm-client-go#callcontract), [`BalanceAt`](/cre/reference/sdk/evm-client-go#balanceat), [`FilterLogs`](/cre/reference/sdk/evm-client-go#filterlogs), etc.) support confidence levels and custom block depths. + +### Using confidence levels + +For most read operations, use the standard confidence levels by passing `-2` (latest) or `-3` (finalized) as the `BlockNumber` parameter. If you don't specify a block number, CRE defaults to `LATEST`. + +**Note:** The `SAFE` confidence level is not available for chain reads—only `LATEST` and `FINALIZED` are supported. + +### Custom block depths + +For use cases requiring fixed confirmation thresholds or historical state verification, you can specify **any explicit block number** instead of using the predefined confidence levels. This enables you to: + +- Implement custom finality rules tailored to your risk profile (e.g., "always wait 1,000 blocks") +- Meet regulatory requirements that mandate fixed, auditable confirmation thresholds +- Query historical state at specific past block heights for analysis or verification + +**When to use custom block depths:** + +- **Regulatory compliance** — Your interactions require provable, fixed confirmation thresholds for auditors +- **Changing chain parameters** — The chain's finality definition may change, but your security model must remain constant +- **Historical verification** — You need to verify state at a specific moment + +**Implementation:** + +You can pass any `*big.Int` directly as the `BlockNumber` parameter. The SDK accepts both special values (like `-2` for latest, `-3` for finalized) and positive integers for explicit block heights. See [Onchain Read](/cre/guides/workflow/using-evm-client/onchain-read-go#custom-block-depths) for examples. + +## Finality for chain writes + +Chain write operations return a [`WriteReportReply`](/cre/reference/sdk/evm-client-go#evmwritereportreply) when the transaction is included in a block, not when it reaches finality. + +### What a successful response means + +When [`WriteReportReply`](/cre/reference/sdk/evm-client-go#evmwritereportreply) returns with `TxStatus` equal to `SUCCESS`: + +- Your transaction was **included in a block** +- The transaction is **not necessarily finalized** yet + +The reply is returned as soon as the transaction appears in a block, not when the block reaches finality. This is important for time-sensitive workflows, but it means the transaction could still be reorganized. + +### Reorg handling + +If a block containing your transaction is reorganized: + +- CRE's Transaction Manager (TXM) automatically resubmits your transaction +- Gas bumping is applied as needed to ensure the transaction is included +- **Important:** The transaction hash may change during resubmission +- You are not automatically notified if the hash changes + +<Aside type="caution" title="For mission-critical applications"> + If you need absolute certainty that your write transaction reached finality, implement post-write verification by + reading the blockchain state after a custom number of confirmations. Do not rely solely on `WriteReportReply` for + finality confirmation. +</Aside> + +## Finality for event triggers + +EVM Log Triggers must use the three confidence levels (`LATEST`, `SAFE`, or `FINALIZED`). Custom block depths are not supported for triggers. + +By default, triggers use `SAFE` if no confidence level is specified. For details on configuring trigger confidence levels, see [EVM Log Trigger](/cre/reference/sdk/triggers/evm-log-trigger-go#evmfilterlogtriggerrequest). + +--- + # Avoiding Non-Determinism in Workflows Source: https://docs.chain.link/cre/concepts/non-determinism-go Last Updated: 2025-11-04 @@ -10023,7 +10133,7 @@ func main() { # Onchain Read Source: https://docs.chain.link/cre/guides/workflow/using-evm-client/onchain-read-go -Last Updated: 2025-11-04 +Last Updated: 2025-12-10 This guide explains how to read data from a smart contract from within your CRE workflow. The process uses [generated bindings](/cre/guides/workflow/using-evm-client/generating-bindings) and the SDK's [`evm.Client`](/cre/reference/sdk/evm-client) to create a simple, type-safe developer experience. @@ -10166,28 +10276,73 @@ When calling contract read methods, you must specify a block number. There are t ### Using magic numbers -- **Finalized block**: Use `big.NewInt(-3)` to read from the latest finalized block +- **Finalized block**: Use `big.NewInt(-3)` to read from the latest finalized block (recommended for production) - **Latest block**: Use `big.NewInt(-2)` to read from the latest block -- **Specific block**: Use `big.NewInt(blockNumber)` to read from a specific block -### Using rpc constants (alternative) +For explicit block numbers, see [Custom block depths](#custom-block-depths) below. + +### Custom block depths + +For use cases requiring fixed confirmation thresholds (e.g., regulatory compliance) or historical state verification, you can specify an exact block number. + +**Example 1 - Read from a specific historical block**: + +```go +// Read from block 12345678 +specificBlock := big.NewInt(12345678) +value, err := storageContract.Get(runtime, specificBlock).Await() +if err != nil { + return nil, fmt.Errorf("failed to read from specific block: %w", err) +} +``` -You can also use constants from the `go-ethereum/rpc` package for better readability: +**Example 2 - Read from 500 blocks ago from latest block**: ```go import ( - "math/big" - "github.com/ethereum/go-ethereum/rpc" + pb "github.com/smartcontractkit/chainlink-protos/cre/go/values/pb" ) -// For latest block -reqBlockNumber := big.NewInt(rpc.LatestBlockNumber.Int64()) +// Helper to convert protobuf BigInt to standard library big.Int +func pbBigIntToBigInt(pb *pb.BigInt) *big.Int { + if pb == nil { + return nil + } + result := new(big.Int).SetBytes(pb.AbsVal) + if pb.Sign < 0 { + result.Neg(result) + } + return result +} + +// Get the latest block number +latestHeader, err := evmClient.HeaderByNumber(runtime, &evm.HeaderByNumberRequest{}).Await() +if err != nil { + return nil, fmt.Errorf("failed to get latest block: %w", err) +} + +// Convert protobuf BigInt to standard library big.Int +latestBlockNum := pbBigIntToBigInt(latestHeader.Header.BlockNumber) +customDepth := big.NewInt(500) +customBlock := new(big.Int).Sub(latestBlockNum, customDepth) -// For finalized block -reqBlockNumber := big.NewInt(rpc.FinalizedBlockNumber.Int64()) +// Use the custom block number with the contract binding +value, err := storageContract.Get(runtime, customBlock).Await() +if err != nil { + return nil, fmt.Errorf("failed to read from custom block: %w", err) +} ``` -Both approaches are equivalent - use whichever you find more readable in your code. +**Understanding the conversion:** + +The `pbBigIntToBigInt` helper converts the SDK's protobuf `*pb.BigInt` type (which stores the value as `AbsVal []byte` and `Sign int64`) to Go's standard library `*big.Int`. This allows you to perform arithmetic operations like subtracting 500 blocks. + +<Aside type="note" title="SDK enhancement planned"> + The SDK team is working on a built-in helper to simplify this conversion. Until then, use the `pbBigIntToBigInt` + helper shown above. +</Aside> + +See [Finality and Confidence Levels](/cre/concepts/finality-go) for more details on when to use custom block depths. ## Complete example @@ -13462,10 +13617,10 @@ func (c *Client) CallContract(runtime cre.Runtime, input *CallContractRequest) c This is the main input object for the `CallContract` function. It acts as a wrapper for the call message and an optional block number. -| Field | Type | Description | -| ------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Call` | `*evm.CallMsg` | Contains the actual details of the function call you want to make. | -| `BlockNumber` | `*pb.BigInt` | Optional. The block number to query. Defaults to `latest`. Use `-2` for `latest` (the most recent block, which may be subject to re-orgs) or `-3` for `finalized` (a block that is considered immutable and safe from re-orgs). | +| Field | Type | Description | +| ------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Call` | `*evm.CallMsg` | Contains the actual details of the function call you want to make. | +| `BlockNumber` | `*pb.BigInt` | Optional. The block number to query. Accepts:<br />• `nil` or `-2` (default): `latest` — the most recent block<br />• `-3`: `finalized` — an immutable block<br />• **Any positive integer**: an explicit block height (see [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-go#custom-block-depths) for examples)<br /><br />See [Finality and Confidence Levels](/cre/concepts/finality-go) for finality strategies. | #### `evm.CallMsg` @@ -13497,10 +13652,10 @@ func (c *Client) BalanceAt(runtime cre.Runtime, input *BalanceAtRequest) cre.Pro #### `evm.BalanceAtRequest` -| Field | Type | Description | -| ------------- | ------------ | ---------------------------------------------------------- | -| `Account` | `[]byte` | The 20-byte address of the account to query. | -| `BlockNumber` | `*pb.BigInt` | Optional. The block number to query. Defaults to `latest`. | +| Field | Type | Description | +| ------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Account` | `[]byte` | The 20-byte address of the account to query. | +| `BlockNumber` | `*pb.BigInt` | Optional. The block number to query. Accepts `nil` or `-2` for `latest` (default), `-3` for `finalized`, or any positive integer for an explicit block height (see [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-go#custom-block-depths)). See [Finality and Confidence Levels](/cre/concepts/finality-go). | #### `evm.BalanceAtReply` @@ -13586,9 +13741,9 @@ func (c *Client) HeaderByNumber(runtime cre.Runtime, input *HeaderByNumberReques #### `evm.HeaderByNumberRequest` -| Field | Type | Description | -| ------------- | ------------ | -------------------------------------------------------------------------- | -| `BlockNumber` | `*pb.BigInt` | The number of the block to retrieve. If `nil`, retrieves the latest block. | +| Field | Type | Description | +| ------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BlockNumber` | `*pb.BigInt` | The number of the block to retrieve. Accepts `nil` for `latest` (default), `-2` for `latest`, `-3` for `finalized`, or any positive integer for an explicit block height (see [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-go#custom-block-depths)). See [Finality and Confidence Levels](/cre/concepts/finality-go). | #### `evm.HeaderByNumberReply` @@ -13652,10 +13807,11 @@ func (c *Client) WriteReport(runtime cre.Runtime, input *WriteCreReportRequest) A **chain selector** is a unique identifier for a blockchain network used throughout the CRE platform. The same chain can be referenced in three different ways depending on the context. All three formats are equivalent and refer to the same blockchain. + <Aside type="note" title="Related resources"> - **Forwarder addresses**: For network-specific forwarder contract addresses, see [Supported - Networks](/cre/guides/workflow/using-evm-client/supported-networks) - **RPC configuration**: For configuring RPC - endpoints in `project.yaml`, see [Project Configuration](/cre/reference/project-configuration) + Networks](/cre/guides/workflow/using-evm-client/supported-networks) + - **RPC configuration**: For configuring RPC endpoints in `project.yaml`, see [Project Configuration](/cre/reference/project-configuration) </Aside> ### Understanding the three formats @@ -14213,9 +14369,9 @@ The configuration struct for the EVM log trigger. | `Topics` | `[]*evm.TopicValues` | A fixed 4-element array to filter event topics. The first element contains event signatures, and the next three elements contain indexed argument values. An empty array element acts as a wildcard. | | `Confidence` | `ConfidenceLevel` | The block confirmation level to monitor. Can be: <ul><li>**`evm.ConfidenceLevel_CONFIDENCE_LEVEL_SAFE` (default):** A block that is considered unlikely to be reorged but is not yet irreversible.</li><li>**`evm.ConfidenceLevel_CONFIDENCE_LEVEL_LATEST`:** The most recent block. This is the fastest but least secure, as the block could be orphaned. Best for non-critical, time-sensitive actions.</li><li>**`evm.ConfidenceLevel_CONFIDENCE_LEVEL_FINALIZED`:** A block that is considered irreversible. This is the safest option, as the event is guaranteed to be on the canonical chain, but it requires waiting longer for finality.</li></ul> | - -<Aside type="caution" title="SAFE block tag fallback"> - **Some chains do not support the SAFE block tag** (e.g., Shibarium). When you specify `CONFIDENCE_LEVEL_SAFE` on chains that don't support it, CRE automatically falls back to `CONFIDENCE_LEVEL_FINALIZED` for safety. Users are responsible for knowing which chains support the SAFE tag. If you need consistent behavior across all chains, explicitly use `CONFIDENCE_LEVEL_FINALIZED` or `CONFIDENCE_LEVEL_LATEST`. +<Aside type="note" title="Finality details"> + For details on how each confidence level maps to specific chains and estimated wait times, see [Finality and + Confidence Levels](/cre/concepts/finality). </Aside> ### `evm.Log` diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index b30a98f30a3..78433fc4dc0 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -6965,6 +6965,116 @@ cre version v1.0.2 --- +# Finality and Confidence Levels +Source: https://docs.chain.link/cre/concepts/finality-ts +Last Updated: 2025-12-10 + +Finality determines when a blockchain transaction is considered irreversible. Until a block is finalized, it could be reorganized (replaced by a different block if the chain temporarily forks), which means any data you read from it might change. + +Different blockchains achieve finality in different ways and at different speeds. CRE abstracts these differences through **confidence levels**, allowing you to specify your finality requirements without needing to know the underlying chain-specific implementation. + +## Understanding CRE's finality model + +CRE provides three confidence levels for reading blockchain data and monitoring events. These levels work consistently across all supported chains. + +### The three confidence levels + +| Confidence Level | Description | Use Case | +| ---------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| **`LATEST`** | The most recent block. No finality guarantees—the block could still be reorganized. | Non-critical, time-sensitive operations where speed matters more than certainty. | +| **`SAFE`** | A block that is unlikely to be reorganized, but not yet fully finalized. | A balance between speed and security for most operations. | +| **`FINALIZED`** | A block that is considered irreversible. This is the safest option. | Critical operations where you need absolute certainty the data won't change. | + +**Choosing the right level:** + +- **`FINALIZED`** — Use for financial transactions, critical state updates, or when incorrect data could cause significant issues +- **`SAFE`** — Use when you need reasonable confidence without waiting for full finality (good for most monitoring/alerting) +- **`LATEST`** — Use for real-time dashboards or displays where speed matters more than guaranteed accuracy + +### How confidence levels map to chains + +**SAFE and LATEST:** + +CRE uses the chain's native `safe` and `latest` block tags respectively for all supported chains. + +**FINALIZED:** + +When you specify `FINALIZED` in your workflow, CRE automatically maps this to its finality method—whether it uses the native finality tag or block depth (with the number of blocks specified for block depth). + +| Chain | Finality Method | +| ------------------------------- | ------------------------ | +| Arbitrum One / Arbitrum Sepolia | Native `finalized` tag | +| Avalanche / Avalanche Fuji | Native `finalized` tag | +| Base / Base Sepolia | Native `finalized` tag | +| BNB Chain / BNB Testnet | Native `finalized` tag | +| Ethereum / Ethereum Sepolia | Native `finalized` tag | +| OP Mainnet / OP Sepolia | Native `finalized` tag | +| Polygon / Polygon Amoy | Block depth (500 blocks) | + +## Finality for chain reads + +Chain read operations ([`CallContract`](/cre/reference/sdk/evm-client-ts#callcontract), [`BalanceAt`](/cre/reference/sdk/evm-client-ts#balanceat), [`FilterLogs`](/cre/reference/sdk/evm-client-ts#filterlogs), etc.) support confidence levels and custom block depths. + +### Using confidence levels + +For most read operations, use the standard confidence levels by passing [`LATEST_BLOCK_NUMBER`](/cre/reference/sdk/evm-client-ts#latest_block_number) or [`LAST_FINALIZED_BLOCK_NUMBER`](/cre/reference/sdk/evm-client-ts#last_finalized_block_number) as the `blockNumber` parameter. If you don't specify a block number, CRE defaults to `LATEST`. + +**Note:** The `SAFE` confidence level is not available for chain reads—only `LATEST` and `FINALIZED` are supported. + +### Custom block depths + +For use cases requiring fixed confirmation thresholds or historical state verification, you can specify **any explicit block number** instead of using the predefined confidence levels. This enables you to: + +- Implement custom finality rules tailored to your risk profile (e.g., "always wait 1,000 blocks") +- Meet regulatory requirements that mandate fixed, auditable confirmation thresholds +- Query historical state at specific past block heights for analysis or verification + +**When to use custom block depths:** + +- **Regulatory compliance** — Your interactions require provable, fixed confirmation thresholds for auditors +- **Changing chain parameters** — The chain's finality definition may change, but your security model must remain constant +- **Historical verification** — You need to verify state at a specific moment + +**Implementation:** + +Block numbers must be provided as `BigIntJson` objects. See [Onchain Read](/cre/guides/workflow/using-evm-client/onchain-read-ts#custom-block-depths) for the conversion pattern and examples. + +## Finality for chain writes + +Chain write operations return a [`WriteReportReply`](/cre/reference/sdk/evm-client-ts#writereportreply) when the transaction is included in a block, not when it reaches finality. + +### What a successful response means + +When [`WriteReportReply`](/cre/reference/sdk/evm-client-ts#writereportreply) returns with `txStatus` equal to `TX_STATUS_SUCCESS`: + +- Your transaction was **included in a block** +- The transaction is **not necessarily finalized** yet + +The reply is returned as soon as the transaction appears in a block, not when the block reaches finality. This is important for time-sensitive workflows, but it means the transaction could still be reorganized. + +### Reorg handling + +If a block containing your transaction is reorganized: + +- CRE's Transaction Manager (TXM) automatically resubmits your transaction +- Gas bumping is applied as needed to ensure the transaction is included +- **Important:** The transaction hash may change during resubmission +- You are not automatically notified if the hash changes + +<Aside type="caution" title="For mission-critical applications"> + If you need absolute certainty that your write transaction reached finality, implement post-write verification by + reading the blockchain state after a custom number of confirmations. Do not rely solely on `WriteReportReply` for + finality confirmation. +</Aside> + +## Finality for event triggers + +EVM Log Triggers must use the three confidence levels (`LATEST`, `SAFE`, or `FINALIZED`). Custom block depths are not supported for triggers. + +By default, triggers use `SAFE` if no confidence level is specified. For details on configuring trigger confidence levels, see [EVM Log Trigger](/cre/reference/sdk/triggers/evm-log-trigger-ts#configuration). + +--- + # Avoiding Non-Determinism in Workflows Source: https://docs.chain.link/cre/concepts/non-determinism-ts Last Updated: 2025-11-04 @@ -8756,7 +8866,7 @@ main() # Onchain Read Source: https://docs.chain.link/cre/guides/workflow/using-evm-client/onchain-read-ts -Last Updated: 2025-11-04 +Last Updated: 2025-12-10 This guide explains how to read data from a smart contract from within your CRE workflow. The TypeScript SDK uses [viem](https://viem.sh/) for ABI handling and the SDK's [`EVMClient`](/cre/reference/sdk/evm-client-ts) to create a type-safe developer experience. @@ -8914,7 +9024,7 @@ When calling `callContract()`, you can specify which block to read from: - **`LAST_FINALIZED_BLOCK_NUMBER`**: Read from the last finalized block (recommended for production) - **`LATEST_BLOCK_NUMBER`**: Read from the latest block -- **Specific block**: Use an object with `{ absVal: "base64EncodedNumber", sign: "1" }` format +- **Custom block number**: Use a `BigIntJson` object for custom finality depths or historical queries ```typescript import { LAST_FINALIZED_BLOCK_NUMBER, LATEST_BLOCK_NUMBER } from "@chainlink/cre-sdk" @@ -8932,6 +9042,54 @@ const contractCall = evmClient.callContract(runtime, { }).result() ``` +#### Custom block depths + +For use cases requiring fixed confirmation thresholds (e.g., regulatory compliance) or historical state verification, you can specify an exact block number. + +**Example 1 - Read from a specific historical block**: + +```typescript +import { blockNumber } from '@chainlink/cre-sdk' + +const historicalBlock = 9767655n +const contractCall = evmClient.callContract(runtime, { + call: encodeCallMsg({...}), + blockNumber: blockNumber(historicalBlock), +}).result() +``` + +**Example 2 - Read from 500 blocks ago for custom finality**: + +```typescript +import { protoBigIntToBigint, blockNumber } from '@chainlink/cre-sdk' + +// Get the latest block number +const latestHeader = evmClient.headerByNumber(runtime, {}).result() +if (!latestHeader.header?.blockNumber) { + throw new Error("Failed to get latest block number") +} + +// Convert protobuf BigInt to native bigint and calculate custom block +const latestBlockNum = protoBigIntToBigint(latestHeader.header.blockNumber) +const customBlock = latestBlockNum - 500n + +// Call the contract at the custom block height +const contractCall = evmClient.callContract(runtime, { + call: encodeCallMsg({...}), + blockNumber: blockNumber(customBlock), +}).result() +``` + +**Helper functions:** + +The SDK provides two helper functions for working with block numbers: + +- **`protoBigIntToBigint(pb)`** — Converts a protobuf `BigInt` (returned by SDK methods like `headerByNumber`) to a native JavaScript `bigint`. Use this when you need to perform arithmetic on block numbers. + +- **`blockNumber(n)`** — Converts a native `bigint`, `number`, or `string` to the protobuf `BigInt` JSON format required by SDK methods. This is an alias for `bigintToProtoBigInt`. + +See [Finality and Confidence Levels](/cre/concepts/finality-ts) for more details on when to use custom block depths. + ### Encoding call messages with `encodeCallMsg()` The `encodeCallMsg()` helper converts your hex-formatted call data into the base64 format required by the EVM capability: @@ -12562,10 +12720,10 @@ callContract( This is the main input object for the `callContract()` method. -| Field | Type | Required | Description | -| ------------- | ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `call` | `CallMsgJson` | Yes | Contains the actual details of the function call you want to make. | -| `blockNumber` | `string` | No | The block number to query. Use `LAST_FINALIZED_BLOCK_NUMBER` for finalized blocks or `LATEST_BLOCK_NUMBER` for the most recent block. Defaults to `"latest"`. | +| Field | Type | Required | Description | +| ------------- | ------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `call` | `CallMsgJson` | Yes | Contains the actual details of the function call you want to make. | +| `blockNumber` | `BigIntJson` | No | The block number to query. Accepts:<br />• `LATEST_BLOCK_NUMBER` (default): the most recent block<br />• `LAST_FINALIZED_BLOCK_NUMBER`: a finalized block<br />• **`BigIntJson` object**: an explicit block height (see [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-ts#custom-block-depths) for conversion details).<br /><br />See [Finality and Confidence Levels](/cre/concepts/finality-ts) for finality strategies. | #### `CallMsg` / `CallMsgJson` @@ -12684,10 +12842,10 @@ balanceAt( #### `BalanceAtRequest` / `BalanceAtRequestJson` -| Field | Type | Required | Description | -| ------------- | -------- | -------- | --------------------------------------------------------- | -| `account` | `string` | Yes | The 20-byte address of the account to query (hex string). | -| `blockNumber` | `string` | No | The block number to query. Defaults to `"latest"`. | +| Field | Type | Required | Description | +| ------------- | ------------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `account` | `string` | Yes | The 20-byte address of the account to query (hex string). | +| `blockNumber` | `BigIntJson` | No | The block number to query. Accepts `LATEST_BLOCK_NUMBER` (default), `LAST_FINALIZED_BLOCK_NUMBER`, or a `BigIntJson` object for an explicit block height (see [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-ts#custom-block-depths)). See [Finality and Confidence Levels](/cre/concepts/finality-ts). | #### `BalanceAtReply` @@ -12819,9 +12977,9 @@ headerByNumber( #### `HeaderByNumberRequest` / `HeaderByNumberRequestJson` -| Field | Type | Required | Description | -| ------------- | -------- | -------- | -------------------------------------------------------------------------------- | -| `blockNumber` | `string` | No | The number of the block to retrieve. If `undefined`, retrieves the latest block. | +| Field | Type | Required | Description | +| ------------- | ------------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `blockNumber` | `BigIntJson` | No | The number of the block to retrieve. Accepts `undefined` for `latest` (default), `LATEST_BLOCK_NUMBER`, `LAST_FINALIZED_BLOCK_NUMBER`, or a `BigIntJson` object for an explicit block height (see [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-ts#custom-block-depths)). See [Finality and Confidence Levels](/cre/concepts/finality-ts). | #### `HeaderByNumberReply` @@ -14114,9 +14272,9 @@ The `logTrigger()` method accepts a configuration object with the following fiel | `topics` | `TopicValues[]` | Optional. A fixed 4-element array to filter event topics. The first element contains event signatures, and the next three elements contain indexed argument values. An empty array element acts as a wildcard. | | `confidence` | `string` | Optional. The block confirmation level to monitor. Can be: <ul><li>**`"CONFIDENCE_LEVEL_LATEST"`**: The most recent block (fastest but least secure).</li><li>**`"CONFIDENCE_LEVEL_SAFE"` (default)**: A block unlikely to be reorged but not yet irreversible.</li><li>**`"CONFIDENCE_LEVEL_FINALIZED"`**: A block considered irreversible (safest, but requires waiting longer for finality).</li></ul> | - -<Aside type="caution" title="SAFE block tag fallback"> - **Some chains do not support the SAFE block tag** (e.g., Shibarium). When you specify `"CONFIDENCE_LEVEL_SAFE"` on chains that don't support it, CRE automatically falls back to `"CONFIDENCE_LEVEL_FINALIZED"` for safety. Users are responsible for knowing which chains support the SAFE tag. If you need consistent behavior across all chains, explicitly use `"CONFIDENCE_LEVEL_FINALIZED"` or `"CONFIDENCE_LEVEL_LATEST"`. +<Aside type="note" title="Finality details"> + For details on how each confidence level maps to specific chains and estimated wait times, see [Finality and + Confidence Levels](/cre/concepts/finality). </Aside> ### `TopicValues` diff --git a/src/content/cre/reference/sdk/evm-client-go.mdx b/src/content/cre/reference/sdk/evm-client-go.mdx index ad932af37ff..852f7711cf9 100644 --- a/src/content/cre/reference/sdk/evm-client-go.mdx +++ b/src/content/cre/reference/sdk/evm-client-go.mdx @@ -69,10 +69,10 @@ func (c *Client) CallContract(runtime cre.Runtime, input *CallContractRequest) c This is the main input object for the `CallContract` function. It acts as a wrapper for the call message and an optional block number. -| <div style="width:100px">Field</div> | <div style="width:110px">Type</div> | Description | -| ------------------------------------ | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Call` | `*evm.CallMsg` | Contains the actual details of the function call you want to make. | -| `BlockNumber` | `*pb.BigInt` | Optional. The block number to query. Defaults to `latest`. Use `-2` for `latest` (the most recent block, which may be subject to re-orgs) or `-3` for `finalized` (a block that is considered immutable and safe from re-orgs). | +| <div style="width:100px">Field</div> | <div style="width:110px">Type</div> | Description | +| ------------------------------------ | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Call` | `*evm.CallMsg` | Contains the actual details of the function call you want to make. | +| `BlockNumber` | `*pb.BigInt` | Optional. The block number to query. Accepts:<br/>• `nil` or `-2` (default): `latest` — the most recent block<br/>• `-3`: `finalized` — an immutable block<br/>• **Any positive integer**: an explicit block height (see [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-go#custom-block-depths) for examples)<br/><br/>See [Finality and Confidence Levels](/cre/concepts/finality-go) for finality strategies. | #### `evm.CallMsg` @@ -104,10 +104,10 @@ func (c *Client) BalanceAt(runtime cre.Runtime, input *BalanceAtRequest) cre.Pro #### `evm.BalanceAtRequest` -| Field | Type | Description | -| ------------- | ------------ | ---------------------------------------------------------- | -| `Account` | `[]byte` | The 20-byte address of the account to query. | -| `BlockNumber` | `*pb.BigInt` | Optional. The block number to query. Defaults to `latest`. | +| Field | Type | Description | +| ------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Account` | `[]byte` | The 20-byte address of the account to query. | +| `BlockNumber` | `*pb.BigInt` | Optional. The block number to query. Accepts `nil` or `-2` for `latest` (default), `-3` for `finalized`, or any positive integer for an explicit block height (see [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-go#custom-block-depths)). See [Finality and Confidence Levels](/cre/concepts/finality-go). | #### `evm.BalanceAtReply` @@ -193,9 +193,9 @@ func (c *Client) HeaderByNumber(runtime cre.Runtime, input *HeaderByNumberReques #### `evm.HeaderByNumberRequest` -| Field | Type | Description | -| ------------- | ------------ | -------------------------------------------------------------------------- | -| `BlockNumber` | `*pb.BigInt` | The number of the block to retrieve. If `nil`, retrieves the latest block. | +| Field | Type | Description | +| ------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `BlockNumber` | `*pb.BigInt` | The number of the block to retrieve. Accepts `nil` for `latest` (default), `-2` for `latest`, `-3` for `finalized`, or any positive integer for an explicit block height (see [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-go#custom-block-depths)). See [Finality and Confidence Levels](/cre/concepts/finality-go). | #### `evm.HeaderByNumberReply` @@ -259,10 +259,11 @@ func (c *Client) WriteReport(runtime cre.Runtime, input *WriteCreReportRequest) A **chain selector** is a unique identifier for a blockchain network used throughout the CRE platform. The same chain can be referenced in three different ways depending on the context. All three formats are equivalent and refer to the same blockchain. +{/* prettier-ignore */} <Aside type="note" title="Related resources"> - **Forwarder addresses**: For network-specific forwarder contract addresses, see [Supported - Networks](/cre/guides/workflow/using-evm-client/supported-networks) - **RPC configuration**: For configuring RPC - endpoints in `project.yaml`, see [Project Configuration](/cre/reference/project-configuration) + Networks](/cre/guides/workflow/using-evm-client/supported-networks) + - **RPC configuration**: For configuring RPC endpoints in `project.yaml`, see [Project Configuration](/cre/reference/project-configuration) </Aside> ### Understanding the three formats diff --git a/src/content/cre/reference/sdk/evm-client-ts.mdx b/src/content/cre/reference/sdk/evm-client-ts.mdx index 3cea5e8c36c..15ec4209239 100644 --- a/src/content/cre/reference/sdk/evm-client-ts.mdx +++ b/src/content/cre/reference/sdk/evm-client-ts.mdx @@ -82,10 +82,10 @@ callContract( This is the main input object for the `callContract()` method. -| <div style="width:110px">Field</div> | <div style="width:110px">Type</div> | Required | Description | -| ------------------------------------ | ----------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `call` | `CallMsgJson` | Yes | Contains the actual details of the function call you want to make. | -| `blockNumber` | `string` | No | The block number to query. Use `LAST_FINALIZED_BLOCK_NUMBER` for finalized blocks or `LATEST_BLOCK_NUMBER` for the most recent block. Defaults to `"latest"`. | +| <div style="width:110px">Field</div> | <div style="width:110px">Type</div> | Required | Description | +| ------------------------------------ | ----------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `call` | `CallMsgJson` | Yes | Contains the actual details of the function call you want to make. | +| `blockNumber` | `BigIntJson` | No | The block number to query. Accepts:<br/>• `LATEST_BLOCK_NUMBER` (default): the most recent block<br/>• `LAST_FINALIZED_BLOCK_NUMBER`: a finalized block<br/>• **`BigIntJson` object**: an explicit block height (see [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-ts#custom-block-depths) for conversion details).<br/><br/>See [Finality and Confidence Levels](/cre/concepts/finality-ts) for finality strategies. | #### `CallMsg` / `CallMsgJson` @@ -204,10 +204,10 @@ balanceAt( #### `BalanceAtRequest` / `BalanceAtRequestJson` -| Field | Type | Required | Description | -| ------------- | -------- | -------- | --------------------------------------------------------- | -| `account` | `string` | Yes | The 20-byte address of the account to query (hex string). | -| `blockNumber` | `string` | No | The block number to query. Defaults to `"latest"`. | +| <div style="width:110px">Field</div> | <div style="width:110px">Type</div> | Required | Description | +| ------------------------------------ | ----------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `account` | `string` | Yes | The 20-byte address of the account to query (hex string). | +| `blockNumber` | `BigIntJson` | No | The block number to query. Accepts `LATEST_BLOCK_NUMBER` (default), `LAST_FINALIZED_BLOCK_NUMBER`, or a `BigIntJson` object for an explicit block height (see [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-ts#custom-block-depths)). See [Finality and Confidence Levels](/cre/concepts/finality-ts). | #### `BalanceAtReply` @@ -339,9 +339,9 @@ headerByNumber( #### `HeaderByNumberRequest` / `HeaderByNumberRequestJson` -| <div style="width: 100px;">Field</div> | <div style="width: 100px;">Type</div> | Required | Description | -| -------------------------------------- | ------------------------------------- | -------- | -------------------------------------------------------------------------------- | -| `blockNumber` | `string` | No | The number of the block to retrieve. If `undefined`, retrieves the latest block. | +| <div style="width: 100px;">Field</div> | <div style="width: 100px;">Type</div> | Required | Description | +| -------------------------------------- | ------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `blockNumber` | `BigIntJson` | No | The number of the block to retrieve. Accepts `undefined` for `latest` (default), `LATEST_BLOCK_NUMBER`, `LAST_FINALIZED_BLOCK_NUMBER`, or a `BigIntJson` object for an explicit block height (see [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-ts#custom-block-depths)). See [Finality and Confidence Levels](/cre/concepts/finality-ts). | #### `HeaderByNumberReply` diff --git a/src/content/cre/reference/sdk/triggers/evm-log-trigger-go.mdx b/src/content/cre/reference/sdk/triggers/evm-log-trigger-go.mdx index 7e910e653db..40b7ce80bae 100644 --- a/src/content/cre/reference/sdk/triggers/evm-log-trigger-go.mdx +++ b/src/content/cre/reference/sdk/triggers/evm-log-trigger-go.mdx @@ -61,9 +61,9 @@ The configuration struct for the EVM log trigger. | `Topics` | `[]*evm.TopicValues` | A fixed 4-element array to filter event topics. The first element contains event signatures, and the next three elements contain indexed argument values. An empty array element acts as a wildcard. | | `Confidence` | `ConfidenceLevel` | The block confirmation level to monitor. Can be: <ul><li>**`evm.ConfidenceLevel_CONFIDENCE_LEVEL_SAFE` (default):** A block that is considered unlikely to be reorged but is not yet irreversible.</li><li>**`evm.ConfidenceLevel_CONFIDENCE_LEVEL_LATEST`:** The most recent block. This is the fastest but least secure, as the block could be orphaned. Best for non-critical, time-sensitive actions.</li><li>**`evm.ConfidenceLevel_CONFIDENCE_LEVEL_FINALIZED`:** A block that is considered irreversible. This is the safest option, as the event is guaranteed to be on the canonical chain, but it requires waiting longer for finality.</li></ul> | -{/* prettier-ignore */} -<Aside type="caution" title="SAFE block tag fallback"> - **Some chains do not support the SAFE block tag** (e.g., Shibarium). When you specify `CONFIDENCE_LEVEL_SAFE` on chains that don't support it, CRE automatically falls back to `CONFIDENCE_LEVEL_FINALIZED` for safety. Users are responsible for knowing which chains support the SAFE tag. If you need consistent behavior across all chains, explicitly use `CONFIDENCE_LEVEL_FINALIZED` or `CONFIDENCE_LEVEL_LATEST`. +<Aside type="note" title="Finality details"> + For details on how each confidence level maps to specific chains and estimated wait times, see [Finality and + Confidence Levels](/cre/concepts/finality). </Aside> ### `evm.Log` diff --git a/src/content/cre/reference/sdk/triggers/evm-log-trigger-ts.mdx b/src/content/cre/reference/sdk/triggers/evm-log-trigger-ts.mdx index 5bdfc650768..6464c1fba1f 100644 --- a/src/content/cre/reference/sdk/triggers/evm-log-trigger-ts.mdx +++ b/src/content/cre/reference/sdk/triggers/evm-log-trigger-ts.mdx @@ -57,9 +57,9 @@ The `logTrigger()` method accepts a configuration object with the following fiel | `topics` | `TopicValues[]` | Optional. A fixed 4-element array to filter event topics. The first element contains event signatures, and the next three elements contain indexed argument values. An empty array element acts as a wildcard. | | `confidence` | `string` | Optional. The block confirmation level to monitor. Can be: <ul><li>**`"CONFIDENCE_LEVEL_LATEST"`**: The most recent block (fastest but least secure).</li><li>**`"CONFIDENCE_LEVEL_SAFE"` (default)**: A block unlikely to be reorged but not yet irreversible.</li><li>**`"CONFIDENCE_LEVEL_FINALIZED"`**: A block considered irreversible (safest, but requires waiting longer for finality).</li></ul> | -{/* prettier-ignore */} -<Aside type="caution" title="SAFE block tag fallback"> - **Some chains do not support the SAFE block tag** (e.g., Shibarium). When you specify `"CONFIDENCE_LEVEL_SAFE"` on chains that don't support it, CRE automatically falls back to `"CONFIDENCE_LEVEL_FINALIZED"` for safety. Users are responsible for knowing which chains support the SAFE tag. If you need consistent behavior across all chains, explicitly use `"CONFIDENCE_LEVEL_FINALIZED"` or `"CONFIDENCE_LEVEL_LATEST"`. +<Aside type="note" title="Finality details"> + For details on how each confidence level maps to specific chains and estimated wait times, see [Finality and + Confidence Levels](/cre/concepts/finality). </Aside> ### `TopicValues` From ff6aacd07f9ce40cd032a65ad0f89a6e43e3d21d Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Thu, 11 Dec 2025 09:41:31 -0600 Subject: [PATCH 050/214] update service quotas (#3278) --- reports/llms-report.json | 20 ++--- src/content/cre/llms-full-go.txt | 135 +++++++++++++++-------------- src/content/cre/llms-full-ts.txt | 135 +++++++++++++++-------------- src/content/cre/service-quotas.mdx | 135 +++++++++++++++-------------- 4 files changed, 214 insertions(+), 211 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index 84689f01051..4b7cf4101ef 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,22 +1,22 @@ { - "startedAt": "2025-12-11T12:22:09.628Z", + "startedAt": "2025-12-11T14:08:50.264Z", "siteBase": "https://docs.chain.link", "sections": [ { "section": "cre-go", "pagesProcessed": 84, "outputPath": "src/content/cre/llms-full-go.txt", - "bytes": 667067, - "prevBytes": 667067, - "deltaBytes": 0 + "bytes": 662227, + "prevBytes": 656030, + "deltaBytes": 6197 }, { "section": "cre-ts", "pagesProcessed": 79, "outputPath": "src/content/cre/llms-full-ts.txt", - "bytes": 623424, - "prevBytes": 623539, - "deltaBytes": -115 + "bytes": 618245, + "prevBytes": 612048, + "deltaBytes": 6197 }, { "section": "vrf", @@ -39,8 +39,8 @@ "pagesProcessed": 37, "outputPath": "src/content/data-feeds/llms-full.txt", "bytes": 302816, - "prevBytes": 302589, - "deltaBytes": 227 + "prevBytes": 302816, + "deltaBytes": 0 }, { "section": "data-streams", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-11T12:22:14.025Z" + "finishedAt": "2025-12-11T14:08:54.424Z" } diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 5488008f646..50e762192ce 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -249,7 +249,7 @@ The mechanism by which a DON comes to a single, reliable, and tamper-proof resul # Service Quotas Source: https://docs.chain.link/cre/service-quotas -Last Updated: 2025-11-04 +Last Updated: 2025-12-11 This page documents the service quotas for Chainlink Runtime Environment (CRE) workflows. @@ -261,15 +261,10 @@ This page documents the service quotas for Chainlink Runtime Environment (CRE) w These quotas apply to each workflow owner (user account) within an organization. -| Quota | Description | Value | -| ------------------------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------- | -| Workflow Deployment Rate | Maximum rate at which an organization can deploy new workflows | Rate: 1 per minute <br /> Burst: 1 | -| Concurrent Workflow Executions | Maximum number of workflows that can execute simultaneously | 5 | -| Workflow Trigger Rate | Maximum rate at which triggers can fire for all workflows owned by a single owner (user account) | Rate: 5 per second <br /> Burst: 5 | -| Workflow Binary Size | Maximum size of the compiled WASM binary | 100 MB | -| Workflow Compressed Binary Size | Maximum size of the compressed WASM binary | 20 MB | -| Workflow Configuration Size | Maximum size of the workflow configuration | 1 MB | -| Secrets Size | Maximum total size of secrets accessible to a workflow | 1 MB | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------- | ----- | +| <a href="#perowner-workflowexecutionconcurrencylimit" id="perowner-workflowexecutionconcurrencylimit">`PerOwner.WorkflowExecutionConcurrencyLimit`</a> | Maximum number of workflows that can execute simultaneously | 5 | +| <a href="#perowner-vaultsecretslimit" id="perowner-vaultsecretslimit">`PerOwner.VaultSecretsLimit`</a> | Maximum number of secrets that can be stored per owner | 100 | <Aside type="note" title="Quota enforcement"> When workflow executions exceed the quotas defined above, they are queued and automatically retried for up to 10 @@ -280,57 +275,64 @@ These quotas apply to each workflow owner (user account) within an organization. These quotas apply to each individual workflow. +### Workflow deployment quotas + +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | ------ | +| <a href="#perworkflow-wasmbinarysizelimit" id="perworkflow-wasmbinarysizelimit">`PerWorkflow.WASMBinarySizeLimit`</a> | Maximum size of the compiled WASM binary | 100 MB | +| <a href="#perworkflow-wasmcompressedbinarysizelimit" id="perworkflow-wasmcompressedbinarysizelimit">`PerWorkflow.WASMCompressedBinarySizeLimit`</a> | Maximum size of the compressed WASM binary | 20 MB | +| <a href="#perworkflow-wasmconfigsizelimit" id="perworkflow-wasmconfigsizelimit">`PerWorkflow.WASMConfigSizeLimit`</a> | Maximum size of the workflow configuration | 1 MB | + ### Trigger quotas -| Quota | Description | Value | -| ----------------------------- | ---------------------------------------------------------------------- | -------------------------------------- | -| Trigger Rate | Maximum rate at which a workflow's triggers can fire | Rate: 1 per 30 seconds <br /> Burst: 3 | -| Maximum Triggers per Workflow | Maximum number of triggers that can be registered to a single workflow | 10 | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------- | ----- | +| <a href="#perworkflow-triggersubscriptionlimit" id="perworkflow-triggersubscriptionlimit">`PerWorkflow.TriggerSubscriptionLimit`</a> | Maximum number of triggers that can be registered to a single workflow | 10 | ### Execution quotas -| Quota | Description | Value | -| ----------------------------- | --------------------------------------------------------------- | ----------------- | -| Concurrent Workflow Instances | Maximum number of concurrent executions for a specific workflow | 5 <br /> Burst: 5 | -| Workflow Timeout | Maximum total execution time for a single workflow run | 5 minutes | -| Workflow Memory Allocation | Maximum memory allocated to a workflow | 100 MB | -| Response Size | Maximum size of the data a workflow can return | 100 KB | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- | --------- | +| <a href="#perworkflow-executionconcurrencylimit" id="perworkflow-executionconcurrencylimit">`PerWorkflow.ExecutionConcurrencyLimit`</a> | Maximum number of concurrent executions for a specific workflow | 5 | +| <a href="#perworkflow-executiontimeout" id="perworkflow-executiontimeout">`PerWorkflow.ExecutionTimeout`</a> | Maximum total execution time for a single workflow run | 5 minutes | +| <a href="#perworkflow-wasmmemorylimit" id="perworkflow-wasmmemorylimit">`PerWorkflow.WASMMemoryLimit`</a> | Maximum memory allocated to a workflow | 100 MB | +| <a href="#perworkflow-executionresponselimit" id="perworkflow-executionresponselimit">`PerWorkflow.ExecutionResponseLimit`</a> | Maximum size of the data a workflow can return | 100 KB | -### Capability call quotas +### General capability quotas -| Quota | Description | Value | -| --------------------------- | ------------------------------------------------------------------------------------------------------ | --------- | -| Concurrent Capability Calls | Maximum concurrent capability calls (HTTP, EVM read/write, secrets) that can execute within a workflow | 3 | -| Capability Call Timeout | Maximum time a single capability call can take to complete | 3 minutes | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | --------- | +| <a href="#perworkflow-capabilityconcurrencylimit" id="perworkflow-capabilityconcurrencylimit">`PerWorkflow.CapabilityConcurrencyLimit`</a> | Maximum concurrent capability calls (HTTP, EVM read/write, secrets) that can execute within a workflow | 3 | +| <a href="#perworkflow-capabilitycalltimeout" id="perworkflow-capabilitycalltimeout">`PerWorkflow.CapabilityCallTimeout`</a> | Maximum time a single capability call can take to complete | 3 minutes | ### Secrets quotas -| Quota | Description | Value | -| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ----- | -| Secrets Size | Maximum total size of secrets accessible to a workflow | 1 MB | -| Concurrent Secrets Fetches | Maximum number of secrets that can be fetched concurrently. [Learn how to fetch multiple secrets](/cre/guides/workflow/secrets). | 5 | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ----- | +| <a href="#perworkflow-wasmsecreetssizelimit" id="perworkflow-wasmsecreetssizelimit">`PerWorkflow.WASMSecretsSizeLimit`</a> | Maximum total size of secrets accessible to a workflow | 1 MB | +| <a href="#perworkflow-secretsconcurrencylimit" id="perworkflow-secretsconcurrencylimit">`PerWorkflow.SecretsConcurrencyLimit`</a> | Maximum number of secrets that can be fetched concurrently. [Learn how to fetch multiple secrets](/cre/guides/workflow/secrets). | 5 | ### Consensus quotas -| Quota | Description | Value | -| --------------------- | ---------------------------------------------------------------- | ------ | -| Observation Size | Maximum size of data that can be passed to consensus aggregation | 100 KB | -| Total Consensus Calls | Maximum number of consensus calls per workflow execution | 2,000 | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ------ | +| <a href="#perworkflow-consensus-observationsizelimit" id="perworkflow-consensus-observationsizelimit">`PerWorkflow.Consensus.ObservationSizeLimit`</a> | Maximum size of data that can be passed to consensus aggregation | 100 KB | +| <a href="#perworkflow-consensus-calllimit" id="perworkflow-consensus-calllimit">`PerWorkflow.Consensus.CallLimit`</a> | Maximum number of consensus calls per workflow execution | 2,000 | ### Logging quotas -| Quota | Description | Value | -| ------------- | --------------------------------------------------- | ----- | -| Log Line Size | Maximum size of a single log line | 1 KB | -| Log Events | Maximum number of log events per workflow execution | 1,000 | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ----- | +| <a href="#perworkflow-loglinelimit" id="perworkflow-loglinelimit">`PerWorkflow.LogLineLimit`</a> | Maximum size of a single log line | 1 KB | +| <a href="#perworkflow-logeventlimit" id="perworkflow-logeventlimit">`PerWorkflow.LogEventLimit`</a> | Maximum number of log events per workflow execution | 1,000 | ## Trigger-specific quotas ### Cron trigger -| Quota | Description | Value | -| ------------ | --------------------------------------------- | -------------------------------------- | -| Trigger Rate | Maximum rate at which a cron trigger can fire | Rate: 1 per 30 seconds <br /> Burst: 1 | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | ---------- | +| <a href="#perworkflow-crontrigger-fastestscheduleinterval" id="perworkflow-crontrigger-fastestscheduleinterval">`PerWorkflow.CRONTrigger.FastestScheduleInterval`</a> | Minimum interval between cron trigger fires | 30 seconds | <Aside type="note" title="Minimum cron schedule"> While the rate quota allows firing once per 30 seconds, you should consider the [Concurrent Workflow @@ -339,47 +341,46 @@ These quotas apply to each individual workflow. ### HTTP trigger -| Quota | Description | Value | -| ------------ | ---------------------------------------------- | -------------------------------------- | -| Trigger Rate | Maximum rate at which an HTTP trigger can fire | Rate: 1 per 30 seconds <br /> Burst: 3 | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -------------------------------------- | +| <a href="#perworkflow-httptrigger-ratelimit" id="perworkflow-httptrigger-ratelimit">`PerWorkflow.HTTPTrigger.RateLimit`</a> | Maximum rate at which an HTTP trigger can fire | Rate: 1 per 30 seconds <br /> Burst: 3 | ### EVM log trigger -| Quota | Description | Value | -| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | -| Maximum Log Triggers | Maximum number of EVM log triggers per workflow | 5 | -| Event Rate | Maximum rate at which log events can be processed | Rate: 10 per 6 seconds <br /> Burst: 10 | -| Filter Addresses | Maximum number of contract addresses that can be monitored | 5 | -| Filter Topics per Slot | Maximum number of topic values that can be specified within a single topic position (Topics[0], Topics[1], Topics[2], or Topics[3]). [Learn about topic filtering](/cre/guides/workflow/using-triggers/evm-log-trigger). | 10 | -| Event Size | Maximum size of a single log event | 5 KB | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | +| <a href="#perworkflow-logtrigger-eventratelimit" id="perworkflow-logtrigger-eventratelimit">`PerWorkflow.LogTrigger.EventRateLimit`</a> | Maximum rate at which log events can be processed | Rate: 10 per 6 seconds <br /> Burst: 10 | +| <a href="#perworkflow-logtrigger-filteraddresslimit" id="perworkflow-logtrigger-filteraddresslimit">`PerWorkflow.LogTrigger.FilterAddressLimit`</a> | Maximum number of contract addresses that can be monitored | 5 | +| <a href="#perworkflow-logtrigger-filtertopicsperslotlimit" id="perworkflow-logtrigger-filtertopicsperslotlimit">`PerWorkflow.LogTrigger.FilterTopicsPerSlotLimit`</a> | Maximum number of topic values that can be specified within a single topic position (Topics[0], Topics[1], Topics[2], or Topics[3]). [Learn about topic filtering](/cre/guides/workflow/using-triggers/evm-log-trigger). | 10 | +| <a href="#perworkflow-logtrigger-eventsizelimit" id="perworkflow-logtrigger-eventsizelimit">`PerWorkflow.LogTrigger.EventSizeLimit`</a> | Maximum size of a single log event | 5 KB | ## Capability-specific quotas ### EVM write capability -| Quota | Description | Value | -| --------------------- | --------------------------------------------------------- | --------- | -| Target Chains | Maximum number of destination chains for write operations | 10 | -| Report Size | Maximum size of a report payload | 5 KB | -| Transaction Gas Quota | Gas quota per EVM transaction | 5,000,000 | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------- | --------- | +| <a href="#perworkflow-chainwrite-targetslimit" id="perworkflow-chainwrite-targetslimit">`PerWorkflow.ChainWrite.TargetsLimit`</a> | Maximum number of destination chains for write operations | 10 | +| <a href="#perworkflow-chainwrite-reportsizelimit" id="perworkflow-chainwrite-reportsizelimit">`PerWorkflow.ChainWrite.ReportSizeLimit`</a> | Maximum size of a report payload | 5 KB | +| <a href="#perworkflow-chainwrite-evm-transactiongaslimit" id="perworkflow-chainwrite-evm-transactiongaslimit">`PerWorkflow.ChainWrite.EVM.TransactionGasLimit`</a> | Gas quota per EVM transaction | 5,000,000 | ### EVM read capability -| Quota | Description | Value | -| ------------------------ | ---------------------------------------------------------------- | ----- | -| Read Calls per Execution | Maximum number of EVM read calls per workflow execution | 10 | -| Log Query Block Quota | Maximum number of blocks that can be queried for historical logs | 100 | -| Payload Size | Maximum size of an EVM read request payload | 5 KB | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ----- | +| <a href="#perworkflow-chainread-calllimit" id="perworkflow-chainread-calllimit">`PerWorkflow.ChainRead.CallLimit`</a> | Maximum number of EVM read calls per workflow execution | 10 | +| <a href="#perworkflow-chainread-logqueryblocklimit" id="perworkflow-chainread-logqueryblocklimit">`PerWorkflow.ChainRead.LogQueryBlockLimit`</a> | Maximum number of blocks that can be queried for historical logs | 100 | +| <a href="#perworkflow-chainread-payloadsizelimit" id="perworkflow-chainread-payloadsizelimit">`PerWorkflow.ChainRead.PayloadSizeLimit`</a> | Maximum size of an EVM read request payload | 5 KB | ### HTTP capability -| Quota | Description | Value | -| ------------------------ | ------------------------------------------------------ | ---------- | -| HTTP Calls per Execution | Maximum number of HTTP requests per workflow execution | 5 | -| Response Size | Maximum size of an HTTP response | 10 KB | -| Connection Timeout | Maximum time to establish an HTTP connection | 10 seconds | -| Request Size | Maximum size of an HTTP request payload | 100 KB | -| Cache Age | Maximum time HTTP responses can be cached | 10 minutes | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | ---------- | +| <a href="#perworkflow-httpaction-calllimit" id="perworkflow-httpaction-calllimit">`PerWorkflow.HTTPAction.CallLimit`</a> | Maximum number of HTTP requests per workflow execution | 5 | +| <a href="#perworkflow-httpaction-responsesizelimit" id="perworkflow-httpaction-responsesizelimit">`PerWorkflow.HTTPAction.ResponseSizeLimit`</a> | Maximum size of an HTTP response | 100 KB | +| <a href="#perworkflow-httpaction-connectiontimeout" id="perworkflow-httpaction-connectiontimeout">`PerWorkflow.HTTPAction.ConnectionTimeout`</a> | Maximum time to establish an HTTP connection | 10 seconds | +| <a href="#perworkflow-httpaction-requestsizelimit" id="perworkflow-httpaction-requestsizelimit">`PerWorkflow.HTTPAction.RequestSizeLimit`</a> | Maximum size of an HTTP request payload | 10 KB | +| <a href="#perworkflow-httpaction-cacheagelimit" id="perworkflow-httpaction-cacheagelimit">`PerWorkflow.HTTPAction.CacheAgeLimit`</a> | Maximum time HTTP responses can be cached | 10 minutes | ## Quota increases diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index 78433fc4dc0..13f8866df30 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -249,7 +249,7 @@ The mechanism by which a DON comes to a single, reliable, and tamper-proof resul # Service Quotas Source: https://docs.chain.link/cre/service-quotas -Last Updated: 2025-11-04 +Last Updated: 2025-12-11 This page documents the service quotas for Chainlink Runtime Environment (CRE) workflows. @@ -261,15 +261,10 @@ This page documents the service quotas for Chainlink Runtime Environment (CRE) w These quotas apply to each workflow owner (user account) within an organization. -| Quota | Description | Value | -| ------------------------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------- | -| Workflow Deployment Rate | Maximum rate at which an organization can deploy new workflows | Rate: 1 per minute <br /> Burst: 1 | -| Concurrent Workflow Executions | Maximum number of workflows that can execute simultaneously | 5 | -| Workflow Trigger Rate | Maximum rate at which triggers can fire for all workflows owned by a single owner (user account) | Rate: 5 per second <br /> Burst: 5 | -| Workflow Binary Size | Maximum size of the compiled WASM binary | 100 MB | -| Workflow Compressed Binary Size | Maximum size of the compressed WASM binary | 20 MB | -| Workflow Configuration Size | Maximum size of the workflow configuration | 1 MB | -| Secrets Size | Maximum total size of secrets accessible to a workflow | 1 MB | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------- | ----- | +| <a href="#perowner-workflowexecutionconcurrencylimit" id="perowner-workflowexecutionconcurrencylimit">`PerOwner.WorkflowExecutionConcurrencyLimit`</a> | Maximum number of workflows that can execute simultaneously | 5 | +| <a href="#perowner-vaultsecretslimit" id="perowner-vaultsecretslimit">`PerOwner.VaultSecretsLimit`</a> | Maximum number of secrets that can be stored per owner | 100 | <Aside type="note" title="Quota enforcement"> When workflow executions exceed the quotas defined above, they are queued and automatically retried for up to 10 @@ -280,57 +275,64 @@ These quotas apply to each workflow owner (user account) within an organization. These quotas apply to each individual workflow. +### Workflow deployment quotas + +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | ------ | +| <a href="#perworkflow-wasmbinarysizelimit" id="perworkflow-wasmbinarysizelimit">`PerWorkflow.WASMBinarySizeLimit`</a> | Maximum size of the compiled WASM binary | 100 MB | +| <a href="#perworkflow-wasmcompressedbinarysizelimit" id="perworkflow-wasmcompressedbinarysizelimit">`PerWorkflow.WASMCompressedBinarySizeLimit`</a> | Maximum size of the compressed WASM binary | 20 MB | +| <a href="#perworkflow-wasmconfigsizelimit" id="perworkflow-wasmconfigsizelimit">`PerWorkflow.WASMConfigSizeLimit`</a> | Maximum size of the workflow configuration | 1 MB | + ### Trigger quotas -| Quota | Description | Value | -| ----------------------------- | ---------------------------------------------------------------------- | -------------------------------------- | -| Trigger Rate | Maximum rate at which a workflow's triggers can fire | Rate: 1 per 30 seconds <br /> Burst: 3 | -| Maximum Triggers per Workflow | Maximum number of triggers that can be registered to a single workflow | 10 | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------- | ----- | +| <a href="#perworkflow-triggersubscriptionlimit" id="perworkflow-triggersubscriptionlimit">`PerWorkflow.TriggerSubscriptionLimit`</a> | Maximum number of triggers that can be registered to a single workflow | 10 | ### Execution quotas -| Quota | Description | Value | -| ----------------------------- | --------------------------------------------------------------- | ----------------- | -| Concurrent Workflow Instances | Maximum number of concurrent executions for a specific workflow | 5 <br /> Burst: 5 | -| Workflow Timeout | Maximum total execution time for a single workflow run | 5 minutes | -| Workflow Memory Allocation | Maximum memory allocated to a workflow | 100 MB | -| Response Size | Maximum size of the data a workflow can return | 100 KB | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- | --------- | +| <a href="#perworkflow-executionconcurrencylimit" id="perworkflow-executionconcurrencylimit">`PerWorkflow.ExecutionConcurrencyLimit`</a> | Maximum number of concurrent executions for a specific workflow | 5 | +| <a href="#perworkflow-executiontimeout" id="perworkflow-executiontimeout">`PerWorkflow.ExecutionTimeout`</a> | Maximum total execution time for a single workflow run | 5 minutes | +| <a href="#perworkflow-wasmmemorylimit" id="perworkflow-wasmmemorylimit">`PerWorkflow.WASMMemoryLimit`</a> | Maximum memory allocated to a workflow | 100 MB | +| <a href="#perworkflow-executionresponselimit" id="perworkflow-executionresponselimit">`PerWorkflow.ExecutionResponseLimit`</a> | Maximum size of the data a workflow can return | 100 KB | -### Capability call quotas +### General capability quotas -| Quota | Description | Value | -| --------------------------- | ------------------------------------------------------------------------------------------------------ | --------- | -| Concurrent Capability Calls | Maximum concurrent capability calls (HTTP, EVM read/write, secrets) that can execute within a workflow | 3 | -| Capability Call Timeout | Maximum time a single capability call can take to complete | 3 minutes | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | --------- | +| <a href="#perworkflow-capabilityconcurrencylimit" id="perworkflow-capabilityconcurrencylimit">`PerWorkflow.CapabilityConcurrencyLimit`</a> | Maximum concurrent capability calls (HTTP, EVM read/write, secrets) that can execute within a workflow | 3 | +| <a href="#perworkflow-capabilitycalltimeout" id="perworkflow-capabilitycalltimeout">`PerWorkflow.CapabilityCallTimeout`</a> | Maximum time a single capability call can take to complete | 3 minutes | ### Secrets quotas -| Quota | Description | Value | -| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ----- | -| Secrets Size | Maximum total size of secrets accessible to a workflow | 1 MB | -| Concurrent Secrets Fetches | Maximum number of secrets that can be fetched concurrently. [Learn how to fetch multiple secrets](/cre/guides/workflow/secrets). | 5 | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ----- | +| <a href="#perworkflow-wasmsecreetssizelimit" id="perworkflow-wasmsecreetssizelimit">`PerWorkflow.WASMSecretsSizeLimit`</a> | Maximum total size of secrets accessible to a workflow | 1 MB | +| <a href="#perworkflow-secretsconcurrencylimit" id="perworkflow-secretsconcurrencylimit">`PerWorkflow.SecretsConcurrencyLimit`</a> | Maximum number of secrets that can be fetched concurrently. [Learn how to fetch multiple secrets](/cre/guides/workflow/secrets). | 5 | ### Consensus quotas -| Quota | Description | Value | -| --------------------- | ---------------------------------------------------------------- | ------ | -| Observation Size | Maximum size of data that can be passed to consensus aggregation | 100 KB | -| Total Consensus Calls | Maximum number of consensus calls per workflow execution | 2,000 | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ------ | +| <a href="#perworkflow-consensus-observationsizelimit" id="perworkflow-consensus-observationsizelimit">`PerWorkflow.Consensus.ObservationSizeLimit`</a> | Maximum size of data that can be passed to consensus aggregation | 100 KB | +| <a href="#perworkflow-consensus-calllimit" id="perworkflow-consensus-calllimit">`PerWorkflow.Consensus.CallLimit`</a> | Maximum number of consensus calls per workflow execution | 2,000 | ### Logging quotas -| Quota | Description | Value | -| ------------- | --------------------------------------------------- | ----- | -| Log Line Size | Maximum size of a single log line | 1 KB | -| Log Events | Maximum number of log events per workflow execution | 1,000 | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ----- | +| <a href="#perworkflow-loglinelimit" id="perworkflow-loglinelimit">`PerWorkflow.LogLineLimit`</a> | Maximum size of a single log line | 1 KB | +| <a href="#perworkflow-logeventlimit" id="perworkflow-logeventlimit">`PerWorkflow.LogEventLimit`</a> | Maximum number of log events per workflow execution | 1,000 | ## Trigger-specific quotas ### Cron trigger -| Quota | Description | Value | -| ------------ | --------------------------------------------- | -------------------------------------- | -| Trigger Rate | Maximum rate at which a cron trigger can fire | Rate: 1 per 30 seconds <br /> Burst: 1 | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | ---------- | +| <a href="#perworkflow-crontrigger-fastestscheduleinterval" id="perworkflow-crontrigger-fastestscheduleinterval">`PerWorkflow.CRONTrigger.FastestScheduleInterval`</a> | Minimum interval between cron trigger fires | 30 seconds | <Aside type="note" title="Minimum cron schedule"> While the rate quota allows firing once per 30 seconds, you should consider the [Concurrent Workflow @@ -339,47 +341,46 @@ These quotas apply to each individual workflow. ### HTTP trigger -| Quota | Description | Value | -| ------------ | ---------------------------------------------- | -------------------------------------- | -| Trigger Rate | Maximum rate at which an HTTP trigger can fire | Rate: 1 per 30 seconds <br /> Burst: 3 | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -------------------------------------- | +| <a href="#perworkflow-httptrigger-ratelimit" id="perworkflow-httptrigger-ratelimit">`PerWorkflow.HTTPTrigger.RateLimit`</a> | Maximum rate at which an HTTP trigger can fire | Rate: 1 per 30 seconds <br /> Burst: 3 | ### EVM log trigger -| Quota | Description | Value | -| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | -| Maximum Log Triggers | Maximum number of EVM log triggers per workflow | 5 | -| Event Rate | Maximum rate at which log events can be processed | Rate: 10 per 6 seconds <br /> Burst: 10 | -| Filter Addresses | Maximum number of contract addresses that can be monitored | 5 | -| Filter Topics per Slot | Maximum number of topic values that can be specified within a single topic position (Topics[0], Topics[1], Topics[2], or Topics[3]). [Learn about topic filtering](/cre/guides/workflow/using-triggers/evm-log-trigger). | 10 | -| Event Size | Maximum size of a single log event | 5 KB | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | +| <a href="#perworkflow-logtrigger-eventratelimit" id="perworkflow-logtrigger-eventratelimit">`PerWorkflow.LogTrigger.EventRateLimit`</a> | Maximum rate at which log events can be processed | Rate: 10 per 6 seconds <br /> Burst: 10 | +| <a href="#perworkflow-logtrigger-filteraddresslimit" id="perworkflow-logtrigger-filteraddresslimit">`PerWorkflow.LogTrigger.FilterAddressLimit`</a> | Maximum number of contract addresses that can be monitored | 5 | +| <a href="#perworkflow-logtrigger-filtertopicsperslotlimit" id="perworkflow-logtrigger-filtertopicsperslotlimit">`PerWorkflow.LogTrigger.FilterTopicsPerSlotLimit`</a> | Maximum number of topic values that can be specified within a single topic position (Topics[0], Topics[1], Topics[2], or Topics[3]). [Learn about topic filtering](/cre/guides/workflow/using-triggers/evm-log-trigger). | 10 | +| <a href="#perworkflow-logtrigger-eventsizelimit" id="perworkflow-logtrigger-eventsizelimit">`PerWorkflow.LogTrigger.EventSizeLimit`</a> | Maximum size of a single log event | 5 KB | ## Capability-specific quotas ### EVM write capability -| Quota | Description | Value | -| --------------------- | --------------------------------------------------------- | --------- | -| Target Chains | Maximum number of destination chains for write operations | 10 | -| Report Size | Maximum size of a report payload | 5 KB | -| Transaction Gas Quota | Gas quota per EVM transaction | 5,000,000 | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------- | --------- | +| <a href="#perworkflow-chainwrite-targetslimit" id="perworkflow-chainwrite-targetslimit">`PerWorkflow.ChainWrite.TargetsLimit`</a> | Maximum number of destination chains for write operations | 10 | +| <a href="#perworkflow-chainwrite-reportsizelimit" id="perworkflow-chainwrite-reportsizelimit">`PerWorkflow.ChainWrite.ReportSizeLimit`</a> | Maximum size of a report payload | 5 KB | +| <a href="#perworkflow-chainwrite-evm-transactiongaslimit" id="perworkflow-chainwrite-evm-transactiongaslimit">`PerWorkflow.ChainWrite.EVM.TransactionGasLimit`</a> | Gas quota per EVM transaction | 5,000,000 | ### EVM read capability -| Quota | Description | Value | -| ------------------------ | ---------------------------------------------------------------- | ----- | -| Read Calls per Execution | Maximum number of EVM read calls per workflow execution | 10 | -| Log Query Block Quota | Maximum number of blocks that can be queried for historical logs | 100 | -| Payload Size | Maximum size of an EVM read request payload | 5 KB | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ----- | +| <a href="#perworkflow-chainread-calllimit" id="perworkflow-chainread-calllimit">`PerWorkflow.ChainRead.CallLimit`</a> | Maximum number of EVM read calls per workflow execution | 10 | +| <a href="#perworkflow-chainread-logqueryblocklimit" id="perworkflow-chainread-logqueryblocklimit">`PerWorkflow.ChainRead.LogQueryBlockLimit`</a> | Maximum number of blocks that can be queried for historical logs | 100 | +| <a href="#perworkflow-chainread-payloadsizelimit" id="perworkflow-chainread-payloadsizelimit">`PerWorkflow.ChainRead.PayloadSizeLimit`</a> | Maximum size of an EVM read request payload | 5 KB | ### HTTP capability -| Quota | Description | Value | -| ------------------------ | ------------------------------------------------------ | ---------- | -| HTTP Calls per Execution | Maximum number of HTTP requests per workflow execution | 5 | -| Response Size | Maximum size of an HTTP response | 10 KB | -| Connection Timeout | Maximum time to establish an HTTP connection | 10 seconds | -| Request Size | Maximum size of an HTTP request payload | 100 KB | -| Cache Age | Maximum time HTTP responses can be cached | 10 minutes | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | ---------- | +| <a href="#perworkflow-httpaction-calllimit" id="perworkflow-httpaction-calllimit">`PerWorkflow.HTTPAction.CallLimit`</a> | Maximum number of HTTP requests per workflow execution | 5 | +| <a href="#perworkflow-httpaction-responsesizelimit" id="perworkflow-httpaction-responsesizelimit">`PerWorkflow.HTTPAction.ResponseSizeLimit`</a> | Maximum size of an HTTP response | 100 KB | +| <a href="#perworkflow-httpaction-connectiontimeout" id="perworkflow-httpaction-connectiontimeout">`PerWorkflow.HTTPAction.ConnectionTimeout`</a> | Maximum time to establish an HTTP connection | 10 seconds | +| <a href="#perworkflow-httpaction-requestsizelimit" id="perworkflow-httpaction-requestsizelimit">`PerWorkflow.HTTPAction.RequestSizeLimit`</a> | Maximum size of an HTTP request payload | 10 KB | +| <a href="#perworkflow-httpaction-cacheagelimit" id="perworkflow-httpaction-cacheagelimit">`PerWorkflow.HTTPAction.CacheAgeLimit`</a> | Maximum time HTTP responses can be cached | 10 minutes | ## Quota increases diff --git a/src/content/cre/service-quotas.mdx b/src/content/cre/service-quotas.mdx index 28ad41142f0..8086c84e6e6 100644 --- a/src/content/cre/service-quotas.mdx +++ b/src/content/cre/service-quotas.mdx @@ -5,7 +5,7 @@ date: Last Modified metadata: description: "Understand CRE service quotas for your workflows: execution timeouts, trigger rates, WASM resources, and organization constraints." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2025-12-11" --- import { Aside } from "@components" @@ -20,15 +20,10 @@ This page documents the service quotas for Chainlink Runtime Environment (CRE) w These quotas apply to each workflow owner (user account) within an organization. -| Quota | Description | <div style="width: 150px;">Value</div> | -| ------------------------------- | ------------------------------------------------------------------------------------------------ | -------------------------------------- | -| Workflow Deployment Rate | Maximum rate at which an organization can deploy new workflows | Rate: 1 per minute <br/> Burst: 1 | -| Concurrent Workflow Executions | Maximum number of workflows that can execute simultaneously | 5 | -| Workflow Trigger Rate | Maximum rate at which triggers can fire for all workflows owned by a single owner (user account) | Rate: 5 per second <br /> Burst: 5 | -| Workflow Binary Size | Maximum size of the compiled WASM binary | 100 MB | -| Workflow Compressed Binary Size | Maximum size of the compressed WASM binary | 20 MB | -| Workflow Configuration Size | Maximum size of the workflow configuration | 1 MB | -| Secrets Size | Maximum total size of secrets accessible to a workflow | 1 MB | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------- | ----- | +| <a href="#perowner-workflowexecutionconcurrencylimit" id="perowner-workflowexecutionconcurrencylimit">`PerOwner.WorkflowExecutionConcurrencyLimit`</a> | Maximum number of workflows that can execute simultaneously | 5 | +| <a href="#perowner-vaultsecretslimit" id="perowner-vaultsecretslimit">`PerOwner.VaultSecretsLimit`</a> | Maximum number of secrets that can be stored per owner | 100 | <Aside type="note" title="Quota enforcement"> When workflow executions exceed the quotas defined above, they are queued and automatically retried for up to 10 @@ -39,57 +34,64 @@ These quotas apply to each workflow owner (user account) within an organization. These quotas apply to each individual workflow. +### Workflow deployment quotas + +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | ------ | +| <a href="#perworkflow-wasmbinarysizelimit" id="perworkflow-wasmbinarysizelimit">`PerWorkflow.WASMBinarySizeLimit`</a> | Maximum size of the compiled WASM binary | 100 MB | +| <a href="#perworkflow-wasmcompressedbinarysizelimit" id="perworkflow-wasmcompressedbinarysizelimit">`PerWorkflow.WASMCompressedBinarySizeLimit`</a> | Maximum size of the compressed WASM binary | 20 MB | +| <a href="#perworkflow-wasmconfigsizelimit" id="perworkflow-wasmconfigsizelimit">`PerWorkflow.WASMConfigSizeLimit`</a> | Maximum size of the workflow configuration | 1 MB | + ### Trigger quotas -| Quota | Description | <div style="width: 160px;">Value</div> | -| ----------------------------- | ---------------------------------------------------------------------- | -------------------------------------- | -| Trigger Rate | Maximum rate at which a workflow's triggers can fire | Rate: 1 per 30 seconds <br /> Burst: 3 | -| Maximum Triggers per Workflow | Maximum number of triggers that can be registered to a single workflow | 10 | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------- | ----- | +| <a href="#perworkflow-triggersubscriptionlimit" id="perworkflow-triggersubscriptionlimit">`PerWorkflow.TriggerSubscriptionLimit`</a> | Maximum number of triggers that can be registered to a single workflow | 10 | ### Execution quotas -| Quota | Description | <div style="width: 150px;">Value</div> | -| ----------------------------- | --------------------------------------------------------------- | -------------------------------------- | -| Concurrent Workflow Instances | Maximum number of concurrent executions for a specific workflow | 5 <br /> Burst: 5 | -| Workflow Timeout | Maximum total execution time for a single workflow run | 5 minutes | -| Workflow Memory Allocation | Maximum memory allocated to a workflow | 100 MB | -| Response Size | Maximum size of the data a workflow can return | 100 KB | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- | --------- | +| <a href="#perworkflow-executionconcurrencylimit" id="perworkflow-executionconcurrencylimit">`PerWorkflow.ExecutionConcurrencyLimit`</a> | Maximum number of concurrent executions for a specific workflow | 5 | +| <a href="#perworkflow-executiontimeout" id="perworkflow-executiontimeout">`PerWorkflow.ExecutionTimeout`</a> | Maximum total execution time for a single workflow run | 5 minutes | +| <a href="#perworkflow-wasmmemorylimit" id="perworkflow-wasmmemorylimit">`PerWorkflow.WASMMemoryLimit`</a> | Maximum memory allocated to a workflow | 100 MB | +| <a href="#perworkflow-executionresponselimit" id="perworkflow-executionresponselimit">`PerWorkflow.ExecutionResponseLimit`</a> | Maximum size of the data a workflow can return | 100 KB | -### Capability call quotas +### General capability quotas -| Quota | Description | <div style="width: 150px;">Value</div> | -| --------------------------- | ------------------------------------------------------------------------------------------------------ | -------------------------------------- | -| Concurrent Capability Calls | Maximum concurrent capability calls (HTTP, EVM read/write, secrets) that can execute within a workflow | 3 | -| Capability Call Timeout | Maximum time a single capability call can take to complete | 3 minutes | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | --------- | +| <a href="#perworkflow-capabilityconcurrencylimit" id="perworkflow-capabilityconcurrencylimit">`PerWorkflow.CapabilityConcurrencyLimit`</a> | Maximum concurrent capability calls (HTTP, EVM read/write, secrets) that can execute within a workflow | 3 | +| <a href="#perworkflow-capabilitycalltimeout" id="perworkflow-capabilitycalltimeout">`PerWorkflow.CapabilityCallTimeout`</a> | Maximum time a single capability call can take to complete | 3 minutes | ### Secrets quotas -| Quota | Description | <div style="width: 150px;">Value</div> | -| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | -| Secrets Size | Maximum total size of secrets accessible to a workflow | 1 MB | -| Concurrent Secrets Fetches | Maximum number of secrets that can be fetched concurrently. [Learn how to fetch multiple secrets](/cre/guides/workflow/secrets). | 5 | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ----- | +| <a href="#perworkflow-wasmsecreetssizelimit" id="perworkflow-wasmsecreetssizelimit">`PerWorkflow.WASMSecretsSizeLimit`</a> | Maximum total size of secrets accessible to a workflow | 1 MB | +| <a href="#perworkflow-secretsconcurrencylimit" id="perworkflow-secretsconcurrencylimit">`PerWorkflow.SecretsConcurrencyLimit`</a> | Maximum number of secrets that can be fetched concurrently. [Learn how to fetch multiple secrets](/cre/guides/workflow/secrets). | 5 | ### Consensus quotas -| Quota | Description | <div style="width: 150px;">Value</div> | -| --------------------- | ---------------------------------------------------------------- | -------------------------------------- | -| Observation Size | Maximum size of data that can be passed to consensus aggregation | 100 KB | -| Total Consensus Calls | Maximum number of consensus calls per workflow execution | 2,000 | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ------ | +| <a href="#perworkflow-consensus-observationsizelimit" id="perworkflow-consensus-observationsizelimit">`PerWorkflow.Consensus.ObservationSizeLimit`</a> | Maximum size of data that can be passed to consensus aggregation | 100 KB | +| <a href="#perworkflow-consensus-calllimit" id="perworkflow-consensus-calllimit">`PerWorkflow.Consensus.CallLimit`</a> | Maximum number of consensus calls per workflow execution | 2,000 | ### Logging quotas -| Quota | Description | <div style="width: 150px;">Value</div> | -| ------------- | --------------------------------------------------- | -------------------------------------- | -| Log Line Size | Maximum size of a single log line | 1 KB | -| Log Events | Maximum number of log events per workflow execution | 1,000 | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ----- | +| <a href="#perworkflow-loglinelimit" id="perworkflow-loglinelimit">`PerWorkflow.LogLineLimit`</a> | Maximum size of a single log line | 1 KB | +| <a href="#perworkflow-logeventlimit" id="perworkflow-logeventlimit">`PerWorkflow.LogEventLimit`</a> | Maximum number of log events per workflow execution | 1,000 | ## Trigger-specific quotas ### Cron trigger -| Quota | Description | <div style="width: 150px;">Value</div> | -| ------------ | --------------------------------------------- | -------------------------------------- | -| Trigger Rate | Maximum rate at which a cron trigger can fire | Rate: 1 per 30 seconds <br /> Burst: 1 | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | ---------- | +| <a href="#perworkflow-crontrigger-fastestscheduleinterval" id="perworkflow-crontrigger-fastestscheduleinterval">`PerWorkflow.CRONTrigger.FastestScheduleInterval`</a> | Minimum interval between cron trigger fires | 30 seconds | <Aside type="note" title="Minimum cron schedule"> While the rate quota allows firing once per 30 seconds, you should consider the [Concurrent Workflow @@ -98,47 +100,46 @@ These quotas apply to each individual workflow. ### HTTP trigger -| Quota | Description | <div style="width: 150px;">Value</div> | -| ------------ | ---------------------------------------------- | -------------------------------------- | -| Trigger Rate | Maximum rate at which an HTTP trigger can fire | Rate: 1 per 30 seconds <br /> Burst: 3 | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -------------------------------------- | +| <a href="#perworkflow-httptrigger-ratelimit" id="perworkflow-httptrigger-ratelimit">`PerWorkflow.HTTPTrigger.RateLimit`</a> | Maximum rate at which an HTTP trigger can fire | Rate: 1 per 30 seconds <br /> Burst: 3 | ### EVM log trigger -| Quota | Description | <div style="width: 150px;">Value</div> | -| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------- | -| Maximum Log Triggers | Maximum number of EVM log triggers per workflow | 5 | -| Event Rate | Maximum rate at which log events can be processed | Rate: 10 per 6 seconds <br /> Burst: 10 | -| Filter Addresses | Maximum number of contract addresses that can be monitored | 5 | -| Filter Topics per Slot | Maximum number of topic values that can be specified within a single topic position (Topics[0], Topics[1], Topics[2], or Topics[3]). [Learn about topic filtering](/cre/guides/workflow/using-triggers/evm-log-trigger). | 10 | -| Event Size | Maximum size of a single log event | 5 KB | +| Quota Key | Description | Value | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------- | +| <a href="#perworkflow-logtrigger-eventratelimit" id="perworkflow-logtrigger-eventratelimit">`PerWorkflow.LogTrigger.EventRateLimit`</a> | Maximum rate at which log events can be processed | Rate: 10 per 6 seconds <br /> Burst: 10 | +| <a href="#perworkflow-logtrigger-filteraddresslimit" id="perworkflow-logtrigger-filteraddresslimit">`PerWorkflow.LogTrigger.FilterAddressLimit`</a> | Maximum number of contract addresses that can be monitored | 5 | +| <a href="#perworkflow-logtrigger-filtertopicsperslotlimit" id="perworkflow-logtrigger-filtertopicsperslotlimit">`PerWorkflow.LogTrigger.FilterTopicsPerSlotLimit`</a> | Maximum number of topic values that can be specified within a single topic position (Topics[0], Topics[1], Topics[2], or Topics[3]). [Learn about topic filtering](/cre/guides/workflow/using-triggers/evm-log-trigger). | 10 | +| <a href="#perworkflow-logtrigger-eventsizelimit" id="perworkflow-logtrigger-eventsizelimit">`PerWorkflow.LogTrigger.EventSizeLimit`</a> | Maximum size of a single log event | 5 KB | ## Capability-specific quotas ### EVM write capability -| Quota | Description | <div style="width: 150px;">Value</div> | -| --------------------- | --------------------------------------------------------- | -------------------------------------- | -| Target Chains | Maximum number of destination chains for write operations | 10 | -| Report Size | Maximum size of a report payload | 5 KB | -| Transaction Gas Quota | Gas quota per EVM transaction | 5,000,000 | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------- | --------- | +| <a href="#perworkflow-chainwrite-targetslimit" id="perworkflow-chainwrite-targetslimit">`PerWorkflow.ChainWrite.TargetsLimit`</a> | Maximum number of destination chains for write operations | 10 | +| <a href="#perworkflow-chainwrite-reportsizelimit" id="perworkflow-chainwrite-reportsizelimit">`PerWorkflow.ChainWrite.ReportSizeLimit`</a> | Maximum size of a report payload | 5 KB | +| <a href="#perworkflow-chainwrite-evm-transactiongaslimit" id="perworkflow-chainwrite-evm-transactiongaslimit">`PerWorkflow.ChainWrite.EVM.TransactionGasLimit`</a> | Gas quota per EVM transaction | 5,000,000 | ### EVM read capability -| Quota | Description | <div style="width: 150px;">Value</div> | -| ------------------------ | ---------------------------------------------------------------- | -------------------------------------- | -| Read Calls per Execution | Maximum number of EVM read calls per workflow execution | 10 | -| Log Query Block Quota | Maximum number of blocks that can be queried for historical logs | 100 | -| Payload Size | Maximum size of an EVM read request payload | 5 KB | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ----- | +| <a href="#perworkflow-chainread-calllimit" id="perworkflow-chainread-calllimit">`PerWorkflow.ChainRead.CallLimit`</a> | Maximum number of EVM read calls per workflow execution | 10 | +| <a href="#perworkflow-chainread-logqueryblocklimit" id="perworkflow-chainread-logqueryblocklimit">`PerWorkflow.ChainRead.LogQueryBlockLimit`</a> | Maximum number of blocks that can be queried for historical logs | 100 | +| <a href="#perworkflow-chainread-payloadsizelimit" id="perworkflow-chainread-payloadsizelimit">`PerWorkflow.ChainRead.PayloadSizeLimit`</a> | Maximum size of an EVM read request payload | 5 KB | ### HTTP capability -| Quota | Description | <div style="width: 150px;">Value</div> | -| ------------------------ | ------------------------------------------------------ | -------------------------------------- | -| HTTP Calls per Execution | Maximum number of HTTP requests per workflow execution | 5 | -| Response Size | Maximum size of an HTTP response | 10 KB | -| Connection Timeout | Maximum time to establish an HTTP connection | 10 seconds | -| Request Size | Maximum size of an HTTP request payload | 100 KB | -| Cache Age | Maximum time HTTP responses can be cached | 10 minutes | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | ---------- | +| <a href="#perworkflow-httpaction-calllimit" id="perworkflow-httpaction-calllimit">`PerWorkflow.HTTPAction.CallLimit`</a> | Maximum number of HTTP requests per workflow execution | 5 | +| <a href="#perworkflow-httpaction-responsesizelimit" id="perworkflow-httpaction-responsesizelimit">`PerWorkflow.HTTPAction.ResponseSizeLimit`</a> | Maximum size of an HTTP response | 100 KB | +| <a href="#perworkflow-httpaction-connectiontimeout" id="perworkflow-httpaction-connectiontimeout">`PerWorkflow.HTTPAction.ConnectionTimeout`</a> | Maximum time to establish an HTTP connection | 10 seconds | +| <a href="#perworkflow-httpaction-requestsizelimit" id="perworkflow-httpaction-requestsizelimit">`PerWorkflow.HTTPAction.RequestSizeLimit`</a> | Maximum size of an HTTP request payload | 10 KB | +| <a href="#perworkflow-httpaction-cacheagelimit" id="perworkflow-httpaction-cacheagelimit">`PerWorkflow.HTTPAction.CacheAgeLimit`</a> | Maximum time HTTP responses can be cached | 10 minutes | ## Quota increases From 13f02ddc18fcb19dbd1fcef9b5bfcb4a1b25c258 Mon Sep 17 00:00:00 2001 From: Anirudh Warrier <12178754+anirudhwarrier@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:38:00 +0400 Subject: [PATCH 051/214] fix: update cre-cli installation steps to use bash (#3280) * fix: update cre-cli installation steps to use bash * llm files gen --------- Co-authored-by: Karim <98668332+khadni@users.noreply.github.com> --- reports/llms-report.json | 16 ++++++++-------- .../cli-installation/macos-linux.mdx | 2 +- src/content/cre/llms-full-go.txt | 2 +- src/content/cre/llms-full-ts.txt | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index 4b7cf4101ef..3d83ae54e8d 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,22 +1,22 @@ { - "startedAt": "2025-12-11T14:08:50.264Z", + "startedAt": "2025-12-12T12:28:06.521Z", "siteBase": "https://docs.chain.link", "sections": [ { "section": "cre-go", "pagesProcessed": 84, "outputPath": "src/content/cre/llms-full-go.txt", - "bytes": 662227, - "prevBytes": 656030, - "deltaBytes": 6197 + "bytes": 673266, + "prevBytes": 673264, + "deltaBytes": 2 }, { "section": "cre-ts", "pagesProcessed": 79, "outputPath": "src/content/cre/llms-full-ts.txt", - "bytes": 618245, - "prevBytes": 612048, - "deltaBytes": 6197 + "bytes": 629623, + "prevBytes": 629621, + "deltaBytes": 2 }, { "section": "vrf", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-11T14:08:54.424Z" + "finishedAt": "2025-12-12T12:28:10.711Z" } diff --git a/src/content/cre/getting-started/cli-installation/macos-linux.mdx b/src/content/cre/getting-started/cli-installation/macos-linux.mdx index 8f4179d3d1f..182181bbc94 100644 --- a/src/content/cre/getting-started/cli-installation/macos-linux.mdx +++ b/src/content/cre/getting-started/cli-installation/macos-linux.mdx @@ -49,7 +49,7 @@ Choose your installation method: The easiest way to install the CRE CLI is using the installation script: ```bash -curl -sSL https://cre.chain.link/install.sh | sh +curl -sSL https://cre.chain.link/install.sh | bash ``` This script will: diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 50e762192ce..f79ae74956c 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -546,7 +546,7 @@ Choose your installation method: The easiest way to install the CRE CLI is using the installation script: ```bash -curl -sSL https://cre.chain.link/install.sh | sh +curl -sSL https://cre.chain.link/install.sh | bash ``` This script will: diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index 13f8866df30..eb14e7b6ca8 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -546,7 +546,7 @@ Choose your installation method: The easiest way to install the CRE CLI is using the installation script: ```bash -curl -sSL https://cre.chain.link/install.sh | sh +curl -sSL https://cre.chain.link/install.sh | bash ``` This script will: From ccb507c8fee498ffd375afb44db5bed9063f148c Mon Sep 17 00:00:00 2001 From: gfletcher-cll <grace.fletcher@smartcontract.com> Date: Fri, 12 Dec 2025 08:58:39 -0800 Subject: [PATCH 052/214] pre-work for tempo and megaeth (#3279) * pre-work for tempo and megaeth * update * fix * product chain link * changelog * llms --------- Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- public/assets/chains/tempo.svg | 4 + public/changelog.json | 19 + reports/llms-report.json | 16 +- .../QuickLinks/data/productChainLinks.ts | 3 + .../data/ccip/v1_2_0/mainnet/lanes.json | 658 +++++++++++++++--- .../data/ccip/v1_2_0/mainnet/tokens.json | 166 ++++- .../data/ccip/v1_2_0/testnet/chains.json | 20 + .../data/ccip/v1_2_0/testnet/lanes.json | 56 ++ .../data/ccip/v1_2_0/testnet/tokens.json | 57 ++ src/config/data/chain-to-technology.json | 4 +- src/config/data/chains.json | 31 + src/config/types.ts | 3 + src/config/web3Providers.ts | 2 + .../resources/link-token-contracts.mdx | 12 + src/content/resources/llms-full.txt | 12 + src/features/utils/index.ts | 8 + src/scripts/reference/chains.json | 50 +- src/scripts/reference/linkNameSymbol.json | 8 + 18 files changed, 1004 insertions(+), 125 deletions(-) create mode 100644 public/assets/chains/tempo.svg 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 @@ +<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M0 4C0 1.79086 1.79086 0 4 0H28C30.2091 0 32 1.79086 32 4V28C32 30.2091 30.2091 32 28 32H4C1.79086 32 0 30.2091 0 28V4Z" fill="#121212"/> +<path d="M11.3747 9.39979C11.4318 9.39953 11.4889 9.39926 11.5478 9.39899C11.7392 9.39841 11.9305 9.39955 12.122 9.40068C12.2592 9.40062 12.3964 9.40045 12.5336 9.40018C12.9062 9.39977 13.2788 9.40086 13.6514 9.40224C14.0408 9.40345 14.4303 9.40336 14.8198 9.40342C15.4735 9.40372 16.1273 9.40492 16.7811 9.40674C17.6214 9.40907 18.4617 9.4099 19.302 9.41026C20.0233 9.41058 20.7446 9.41158 21.4659 9.4127C21.6984 9.41303 21.9308 9.41327 22.1633 9.41349C22.5278 9.41388 22.8923 9.4147 23.2568 9.41586C23.3909 9.41623 23.5251 9.41645 23.6592 9.41654C23.8415 9.41668 24.0238 9.41731 24.2062 9.41808C24.3596 9.41844 24.3596 9.41844 24.5161 9.41881C24.7427 9.42939 24.7427 9.42939 24.8233 9.50994C24.8718 9.95666 24.7635 10.2779 24.6027 10.6927C24.4843 11.004 24.3788 11.3183 24.2745 11.6345C24.2545 11.6948 24.2345 11.7551 24.2138 11.8172C24.123 12.0911 24.0324 12.3651 23.9422 12.6393C23.8652 12.8733 23.788 13.1072 23.7107 13.3411C23.6863 13.4155 23.662 13.4898 23.6369 13.5664C23.6142 13.635 23.5915 13.7037 23.5681 13.7744C23.548 13.8356 23.5279 13.8968 23.5071 13.9599C23.4539 14.1013 23.4539 14.1013 23.3734 14.1819C23.2366 14.1901 23.0996 14.1928 22.9626 14.1933C22.8312 14.1942 22.8312 14.1942 22.697 14.195C22.5538 14.1955 22.5538 14.1955 22.4077 14.196C22.2075 14.1979 22.0073 14.1999 21.8072 14.2019C21.49 14.2047 21.1729 14.2071 20.8558 14.2081C20.5508 14.2094 20.2458 14.2126 19.9408 14.2162C19.7983 14.216 19.7983 14.216 19.653 14.2157C19.5646 14.217 19.4761 14.2184 19.3851 14.2197C19.2684 14.2205 19.2684 14.2205 19.1495 14.2212C18.8817 14.2747 18.7894 14.3735 18.6209 14.5846C18.541 14.7296 18.541 14.7296 18.4933 14.8843C18.4634 14.9707 18.4634 14.9707 18.433 15.0589C18.4127 15.1207 18.3925 15.1824 18.3717 15.246C18.3496 15.3108 18.3276 15.3757 18.3049 15.4424C18.2585 15.5797 18.2124 15.7172 18.1669 15.8548C18.0983 16.0615 18.0286 16.2679 17.9585 16.4741C17.7606 17.0603 17.5697 17.6463 17.405 18.2428C17.2828 18.6826 17.1286 19.1001 16.9605 19.5241C16.7202 20.1611 16.5221 20.8133 16.3151 21.4617C16.2237 21.7477 16.132 22.0336 16.0401 22.3194C16.0197 22.3837 15.9993 22.448 15.9783 22.5142C15.6588 23.5074 15.6588 23.5074 15.3988 23.7674C15.2021 23.7868 15.2021 23.7868 14.9517 23.7857C14.8114 23.7857 14.8114 23.7857 14.6683 23.7857C14.5669 23.7848 14.4655 23.784 14.3611 23.7832C14.2576 23.7829 14.1542 23.7827 14.0476 23.7825C13.7724 23.7819 13.4972 23.7803 13.222 23.7785C12.9413 23.7768 12.6605 23.7761 12.3798 23.7753C11.8288 23.7736 11.2778 23.7708 10.7269 23.7674C10.6265 23.3635 10.7135 23.0886 10.8524 22.7061C10.8979 22.5758 10.9433 22.4455 10.9886 22.3151C11.0121 22.2486 11.0357 22.1822 11.0599 22.1137C11.1684 21.8041 11.2711 21.4927 11.3741 21.1813C11.4147 21.0594 11.4554 20.9374 11.4961 20.8155C11.5162 20.7552 11.5362 20.6949 11.557 20.6328C11.7409 20.0811 11.7409 20.0811 11.8019 19.8979C11.842 19.7777 11.8821 19.6574 11.9221 19.5372C12.0174 19.2513 12.1128 18.9655 12.2085 18.6797C12.3796 18.1687 12.5481 17.6575 12.7054 17.1421C12.8176 16.7779 12.9351 16.417 13.0679 16.0597C13.1887 15.7328 13.3027 15.4045 13.4102 15.073C13.4521 14.9448 13.4521 14.9448 13.4949 14.814C13.5677 14.5686 13.5677 14.5686 13.4656 14.2624C12.0568 14.2359 10.6479 14.2093 9.19642 14.1819C9.08798 13.8566 9.17748 13.7124 9.29208 13.3915C9.47012 12.8838 9.62246 12.3758 9.76091 11.8557C9.84083 11.6043 9.84083 11.6043 9.95882 11.3765C10.1431 10.9958 10.2282 10.5943 10.3255 10.1841C10.3416 10.1216 10.3576 10.0592 10.3742 9.99482C10.3878 9.93842 10.4015 9.88202 10.4155 9.82391C10.6085 9.40076 10.9524 9.3993 11.3747 9.39979Z" fill="#FEFEFE"/> +</svg> diff --git a/public/changelog.json b/public/changelog.json index dd1a8395884..958fa9e39b9 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -316,6 +316,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" @@ -354,6 +358,21 @@ } }, "data": [ + { + "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": "2025-12-09", diff --git a/reports/llms-report.json b/reports/llms-report.json index 3d83ae54e8d..ee073406e3d 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,5 +1,5 @@ { - "startedAt": "2025-12-12T12:28:06.521Z", + "startedAt": "2025-12-12T16:45:20.957Z", "siteBase": "https://docs.chain.link", "sections": [ { @@ -7,16 +7,16 @@ "pagesProcessed": 84, "outputPath": "src/content/cre/llms-full-go.txt", "bytes": 673266, - "prevBytes": 673264, - "deltaBytes": 2 + "prevBytes": 673266, + "deltaBytes": 0 }, { "section": "cre-ts", "pagesProcessed": 79, "outputPath": "src/content/cre/llms-full-ts.txt", "bytes": 629623, - "prevBytes": 629621, - "deltaBytes": 2 + "prevBytes": 629623, + "deltaBytes": 0 }, { "section": "vrf", @@ -86,9 +86,9 @@ "section": "resources", "pagesProcessed": 12, "outputPath": "src/content/resources/llms-full.txt", - "bytes": 339715, + "bytes": 341272, "prevBytes": 339715, - "deltaBytes": 0 + "deltaBytes": 1557 }, { "section": "architecture-overview", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-12T12:28:10.711Z" + "finishedAt": "2025-12-12T16:45:24.639Z" } diff --git a/src/components/QuickLinks/data/productChainLinks.ts b/src/components/QuickLinks/data/productChainLinks.ts index a95a456fb29..f183b411ea3 100644 --- a/src/components/QuickLinks/data/productChainLinks.ts +++ b/src/components/QuickLinks/data/productChainLinks.ts @@ -81,6 +81,7 @@ export const productChainLinks: ProductChainLinks = { plume: "/ccip/directory/mainnet/chain/plume-mainnet", superseed: "/ccip/directory/mainnet/chain/superseed-mainnet", taiko: "/ccip/directory/mainnet/chain/ethereum-mainnet-taiko-1", + tempo: "/ccip/directory/testnet/chain/tempo-testnet", metal: "/ccip/directory/mainnet/chain/metal-mainnet", rootstock: "/ccip/directory/mainnet/chain/rootstock-mainnet", janction: "/ccip/directory/testnet/chain/janction-testnet-sepolia", @@ -336,6 +337,7 @@ export const productChainLinks: ProductChainLinks = { bittensor: "/resources/link-token-contracts#bittensor-evm", everclear: "/resources/link-token-contracts#everclear", abchain: "/resources/link-token-contracts#ab-chain", + tempo: "/resources/link-token-contracts#tempo", }, } @@ -428,4 +430,5 @@ export const chainNames: Record<string, string> = { morph: "Morph", jovay: "Jovay", stable: "Stable", + tempo: "Tempo", } diff --git a/src/config/data/ccip/v1_2_0/mainnet/lanes.json b/src/config/data/ccip/v1_2_0/mainnet/lanes.json index 7693213e7e8..b92bfa8e2fc 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/mainnet/lanes.json @@ -696,20 +696,6 @@ } } }, - "NXPC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, "savBTC": { "rateLimiterConfig": { "in": { @@ -1347,6 +1333,20 @@ } } }, + "avBTCx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "avETH": { "rateLimiterConfig": { "in": { @@ -1659,6 +1659,20 @@ } } }, + "avBTCx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "avETH": { "rateLimiterConfig": { "in": { @@ -1757,6 +1771,20 @@ } } }, + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "BYTES": { "rateLimiterConfig": { "in": { @@ -2272,6 +2300,20 @@ "rate": "462963" } } + }, + "NXPC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } }, @@ -2338,6 +2380,20 @@ "version": "1.5.0" }, "supportedTokens": { + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -2541,6 +2597,20 @@ "version": "1.6.0" }, "supportedTokens": { + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -3868,9 +3938,9 @@ "rate": "0" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" } } }, @@ -4347,20 +4417,6 @@ } } }, - "NXPC": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, "savBTC": { "rateLimiterConfig": { "in": { @@ -6036,6 +6092,20 @@ } } }, + "POWER": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RIZE": { "rateLimiterConfig": { "in": { @@ -6190,6 +6260,20 @@ } } }, + "syrupUSDT": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "TRADE": { "rateLimiterConfig": { "in": { @@ -6623,6 +6707,20 @@ } } }, + "SWCH": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "THE": { "rateLimiterConfig": { "in": { @@ -7631,22 +7729,6 @@ "address": "0x8d3039fE2400151c06Ae84a18CAf38dD9b6Ce58b", "enforceOutOfOrder": false, "version": "1.5.0" - }, - "supportedTokens": { - "SDL": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - }, - "out": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - } - } - } } }, "mainnet": { @@ -7702,20 +7784,6 @@ } } }, - "SDL": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - }, - "out": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - } - } - }, "SHIB": { "rateLimiterConfig": { "in": { @@ -8412,22 +8480,6 @@ "address": "0xF1e73c37CDa8E47768De2246AEf5eFD4d76330ae", "enforceOutOfOrder": false, "version": "1.5.0" - }, - "supportedTokens": { - "SDL": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - }, - "out": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - } - } - } } }, "ethereum-mainnet-base-1": { @@ -8707,6 +8759,20 @@ } } }, + "SDL": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "sDOLA": { "rateLimiterConfig": { "in": { @@ -12318,6 +12384,20 @@ } } }, + "SDL": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "sDOLA": { "rateLimiterConfig": { "in": { @@ -13848,6 +13928,20 @@ } } }, + "SDL": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "sDOLA": { "rateLimiterConfig": { "in": { @@ -14114,6 +14208,20 @@ } } }, + "USDf": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "USDM": { "rateLimiterConfig": { "in": { @@ -16428,6 +16536,20 @@ } } }, + "avBTCx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "avETH": { "rateLimiterConfig": { "in": { @@ -16988,6 +17110,20 @@ } } }, + "avBTCx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "avETH": { "rateLimiterConfig": { "in": { @@ -20651,6 +20787,17 @@ "version": "1.6.0" } }, + "kaia-mainnet": { + "offRamp": { + "address": "0x69699AAB9aDB591e1c5024Fda290E3650761ab9d", + "version": "1.5.0" + }, + "onRamp": { + "address": "0xD5A4260733a802e64Cf3A642410fFaED4468907e", + "enforceOutOfOrder": false, + "version": "1.5.0" + } + }, "mainnet": { "offRamp": { "address": "0xf69F5e554E6D3D90DC3a221121ffEf1ee8bf5B2A", @@ -20903,6 +21050,17 @@ "version": "1.5.0" } }, + "hyperliquid-mainnet": { + "offRamp": { + "address": "0x09D12E3aC4Ac49c778C0da6a9F2536413cd378b1", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x63098bAF7AFa14C6351AAF739Da193ff599727Df", + "enforceOutOfOrder": false, + "version": "1.5.0" + } + }, "mainnet": { "offRamp": { "address": "0x59a65c7A78A0757b6e27905f9C0e21831b25df51", @@ -21198,6 +21356,20 @@ } } }, + "avBTCx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "avETH": { "rateLimiterConfig": { "in": { @@ -21296,6 +21468,20 @@ } } }, + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "BYTES": { "rateLimiterConfig": { "in": { @@ -21993,9 +22179,9 @@ "uniBTC": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "200000000", + "isEnabled": true, + "rate": "2315" }, "out": { "capacity": "200000000", @@ -22471,6 +22657,20 @@ } } }, + "POWER": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RIZE": { "rateLimiterConfig": { "in": { @@ -22625,6 +22825,20 @@ } } }, + "syrupUSDT": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "TRADE": { "rateLimiterConfig": { "in": { @@ -23145,20 +23359,6 @@ } } }, - "SDL": { - "rateLimiterConfig": { - "in": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - }, - "out": { - "capacity": "750000000000000000000000", - "isEnabled": true, - "rate": "207500000000000000000" - } - } - }, "SHIB": { "rateLimiterConfig": { "in": { @@ -24767,6 +24967,20 @@ } } }, + "SDL": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "sDOLA": { "rateLimiterConfig": { "in": { @@ -25033,6 +25247,20 @@ } } }, + "USDf": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "USDM": { "rateLimiterConfig": { "in": { @@ -25547,6 +25775,20 @@ } } }, + "avBTCx": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "avETH": { "rateLimiterConfig": { "in": { @@ -27532,6 +27774,20 @@ "version": "1.6.0" }, "supportedTokens": { + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -27916,7 +28172,7 @@ "version": "1.5.0" }, "supportedTokens": { - "LBTC": { + "BTC.b": { "rateLimiterConfig": { "in": { "capacity": "5000000000", @@ -27930,6 +28186,20 @@ } } }, + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "20000000000", + "isEnabled": true, + "rate": "1851582" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "savUSD": { "rateLimiterConfig": { "in": { @@ -28097,6 +28367,20 @@ } } }, + "POWER": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RETH": { "rateLimiterConfig": { "in": { @@ -28886,6 +29170,20 @@ "version": "1.6.0" }, "supportedTokens": { + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -29583,6 +29881,20 @@ } } }, + "SWCH": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "THE": { "rateLimiterConfig": { "in": { @@ -31276,6 +31588,20 @@ "rate": "462963" } } + }, + "NXPC": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } }, @@ -31393,6 +31719,20 @@ "version": "1.6.0" }, "supportedTokens": { + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -31503,6 +31843,20 @@ "version": "1.6.0" }, "supportedTokens": { + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -32329,6 +32683,20 @@ "version": "1.5.0" }, "supportedTokens": { + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -32438,7 +32806,7 @@ "version": "1.5.0" }, "supportedTokens": { - "LBTC": { + "BTC.b": { "rateLimiterConfig": { "in": { "capacity": "5000000000", @@ -32452,6 +32820,20 @@ } } }, + "LBTC": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "20000000000", + "isEnabled": true, + "rate": "1851582" + } + } + }, "savUSD": { "rateLimiterConfig": { "in": { @@ -32479,6 +32861,20 @@ "version": "1.6.0" }, "supportedTokens": { + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -32544,6 +32940,20 @@ "version": "1.6.0" }, "supportedTokens": { + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -32740,6 +33150,20 @@ } } }, + "POWER": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RETH": { "rateLimiterConfig": { "in": { @@ -35811,6 +36235,20 @@ "version": "1.6.0" }, "supportedTokens": { + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -35903,6 +36341,20 @@ "version": "1.6.0" }, "supportedTokens": { + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { @@ -35944,6 +36396,20 @@ "version": "1.6.0" }, "supportedTokens": { + "BTC.b": { + "rateLimiterConfig": { + "in": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + }, + "out": { + "capacity": "5000000000", + "isEnabled": true, + "rate": "462963" + } + } + }, "LBTC": { "rateLimiterConfig": { "in": { diff --git a/src/config/data/ccip/v1_2_0/mainnet/tokens.json b/src/config/data/ccip/v1_2_0/mainnet/tokens.json index d44a581e269..fc4b245f65b 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/mainnet/tokens.json @@ -203,6 +203,35 @@ "tokenAddress": "0x84d797c33708E5bDbfdB73481530DCf8c03eC17E" } }, + "avBTCx": { + "avalanche-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "avBTC MAX", + "poolAddress": "0xC178A94C9C872C101b6DD3C6fc495C99b79e3db5", + "poolType": "lockRelease", + "symbol": "avBTCx", + "tokenAddress": "0xa7C10C510df4B1702E1F36451dd29D7C3EDC760C" + }, + "ethereum-mainnet-linea-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "avBTC MAX", + "poolAddress": "0x73FA08D6DC478eef89da438004682E37A5ea0D2e", + "poolType": "burnMint", + "symbol": "avBTCx", + "tokenAddress": "0x788002EBa02a9301008f03bf59c4B233E2272EB7" + }, + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "avBTC MAX", + "poolAddress": "0x1dD1b7F40B205B6836E87f1ed25A628ad35ba99e", + "poolType": "burnMint", + "symbol": "avBTCx", + "tokenAddress": "0x9Bc15d6dCB23EFbdCC235Bf54159B6E8bAd23dca" + } + }, "avETH": { "avalanche-mainnet": { "allowListEnabled": false, @@ -975,6 +1004,53 @@ "tokenAddress": "brBg8x9yT4WnQd8Z43aX7wfrGMrimLfT2WCWRibHo3d" } }, + "BTC.b": { + "avalanche-mainnet": { + "allowListEnabled": false, + "decimals": 8, + "name": "Bitcoin", + "poolAddress": "0x67927d7eA19F9A1053f4f5BBdf827Ed9870F1a1B", + "poolType": "burnMint", + "symbol": "BTC.b", + "tokenAddress": "0x152b9d0FdC40C096757F570A51E494bd4b943E50" + }, + "mainnet": { + "allowListEnabled": false, + "decimals": 8, + "name": "Bitcoin", + "poolAddress": "0xBA59cF1c1563a9B93A8C5D70F8E445eaCa9842D0", + "poolType": "burnMint", + "symbol": "BTC.b", + "tokenAddress": "0xB0F70C0bD6FD87dbEb7C10dC692a2a6106817072" + }, + "monad-mainnet": { + "allowListEnabled": false, + "decimals": 8, + "name": "Bitcoin", + "poolAddress": "0xAe5E2940Fc01C0f8076D36749509C75E43da0C70", + "poolType": "burnMint", + "symbol": "BTC.b", + "tokenAddress": "0xB0F70C0bD6FD87dbEb7C10dC692a2a6106817072" + }, + "polygon-mainnet-katana": { + "allowListEnabled": false, + "decimals": 8, + "name": "Bitcoin on Katana", + "poolAddress": "0xf1fc1bE000Db6fa2193aB75E461a5603400d031F", + "poolType": "burnMint", + "symbol": "BTCK", + "tokenAddress": "0xB0F70C0bD6FD87dbEb7C10dC692a2a6106817072" + }, + "stable-mainnet": { + "allowListEnabled": false, + "decimals": 8, + "name": "Bitcoin", + "poolAddress": "0xc6c22D4Be6Cc50E6D01BD6325b6cD715A52f8154", + "poolType": "burnMint", + "symbol": "BTC.b", + "tokenAddress": "0xB0F70C0bD6FD87dbEb7C10dC692a2a6106817072" + } + }, "BTR": { "bitcoin-mainnet-bitlayer-1": { "allowListEnabled": false, @@ -3746,6 +3822,15 @@ "symbol": "NXPC", "tokenAddress": "0x9f2c4FD0a0BFF91723089775C73394E72c0fC116" }, + "monad-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "NXPC", + "poolAddress": "0xc1E3A199873846AAfcFE71D31e3D82c8B97588D9", + "poolType": "burnMint", + "symbol": "NXPC", + "tokenAddress": "0xD33F18D8d48CbbB2f8b47063DE97f94De0D49B99" + }, "ronin-mainnet": { "allowListEnabled": false, "decimals": 18, @@ -3982,6 +4067,35 @@ "tokenAddress": "0x7EAe20d11Ef8c779433Eb24503dEf900b9d28ad7" } }, + "POWER": { + "bsc-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Power", + "poolAddress": "0x7EeeAd4571b12BC3e331E6Ce2D954E1528aC2921", + "poolType": "burnMint", + "symbol": "POWER", + "tokenAddress": "0x9dC44ae5BE187ECA9e2A67e33f27A4c91cEA1223" + }, + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Power", + "poolAddress": "0x7EeeAd4571b12BC3e331E6Ce2D954E1528aC2921", + "poolType": "lockRelease", + "symbol": "POWER", + "tokenAddress": "0x9dC44ae5BE187ECA9e2A67e33f27A4c91cEA1223" + }, + "ronin-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Power", + "poolAddress": "0x9B0B4aFf23aC0e144BCb947aD99Bde308dea5641", + "poolType": "burnMint", + "symbol": "POWER", + "tokenAddress": "0x394cEF8bDd737EE24DBc9f43d0d5D2ab83136054" + } + }, "PTsUSDE": { "mainnet": { "allowListEnabled": false, @@ -4414,29 +4528,29 @@ } }, "SDL": { - "ethereum-mainnet-andromeda-1": { + "ethereum-mainnet-arbitrum-1": { "allowListEnabled": false, "decimals": 18, "name": "stake.link", - "poolAddress": "0xC31A8B3Ba209FC60c3E9364649ED452939403E27", + "poolAddress": "0x26adFa2F46F5efDD5dFDF5b2f9849fD97b8390cc", "poolType": "burnMint", "symbol": "SDL", - "tokenAddress": "0xd7cf0e0fC12fB97e03841CE4f3086dB327CE0F2B" + "tokenAddress": "0xdFeA35757264F5b6C0ff21104151D9F991D0eEC0" }, - "ethereum-mainnet-arbitrum-1": { + "ethereum-mainnet-base-1": { "allowListEnabled": false, "decimals": 18, "name": "stake.link", - "poolAddress": "0xb473be8A2b4778C418451C18F4357261D626f91C", + "poolAddress": "0xe8bc08EC1d934ac5afe860aE510A8d03E747540c", "poolType": "burnMint", "symbol": "SDL", - "tokenAddress": "0xdFeA35757264F5b6C0ff21104151D9F991D0eEC0" + "tokenAddress": "0xe5B64a705db9d2395C471af1608972cCbacE26E6" }, "mainnet": { "allowListEnabled": false, "decimals": 18, "name": "stake.link", - "poolAddress": "0xAFcC997D86713FeC802Cc665122d64a5130bDd1D", + "poolAddress": "0x267aE721c7b9BB409847C324A06259A7d96a644A", "poolType": "lockRelease", "symbol": "SDL", "tokenAddress": "0xA95C5ebB86E0dE73B4fB8c47A45B792CFeA28C23" @@ -5444,6 +5558,26 @@ "tokenAddress": "0x8BF591Eae535f93a242D5A954d3Cde648b48A5A8" } }, + "SWCH": { + "bsc-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "SwissCheese Token", + "poolAddress": "0xbB4bd217aF1161F973792250B59404363866B687", + "poolType": "burnMint", + "symbol": "SWCH", + "tokenAddress": "0x280aB1903a06B5badEC1D204F450Ee8D068405d8" + }, + "matic-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "SwissCheese Token", + "poolAddress": "0x5521ceE67Ce3C7ED0e0477522a0085E1af2810d1", + "poolType": "lockRelease", + "symbol": "SWCH", + "tokenAddress": "0x3ce1327867077B551ae9A6987bF10C9fd08edCE1" + } + }, "SXT": { "ethereum-mainnet-base-1": { "allowListEnabled": false, @@ -5512,6 +5646,15 @@ } }, "syrupUSDT": { + "bsc-mainnet": { + "allowListEnabled": false, + "decimals": 6, + "name": "Syrup USDT", + "poolAddress": "0xEAA7E1f805747ae29d5618b568d1b044A8b37A01", + "poolType": "burnMint", + "symbol": "syrupUSDT", + "tokenAddress": "0x8E9d4cEa39299323FE8eda678cAD449718556c4e" + }, "ethereum-mainnet-mantle-1": { "allowListEnabled": false, "decimals": 6, @@ -6309,6 +6452,15 @@ "symbol": "USDf", "tokenAddress": "0xb3b02E4A9Fb2bD28CC2ff97B0aB3F6B3Ec1eE9D2" }, + "ethereum-mainnet-base-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "Falcon USD", + "poolAddress": "0x33570299e0D73f07c82d005DE75De54cf4582FCC", + "poolType": "burnMint", + "symbol": "USDf", + "tokenAddress": "0x8210c0634AB8f273806e4b7866E9Db353773c44B" + }, "mainnet": { "allowListEnabled": false, "decimals": 18, diff --git a/src/config/data/ccip/v1_2_0/testnet/chains.json b/src/config/data/ccip/v1_2_0/testnet/chains.json index fee00700444..82b8a07f411 100644 --- a/src/config/data/ccip/v1_2_0/testnet/chains.json +++ b/src/config/data/ccip/v1_2_0/testnet/chains.json @@ -1596,6 +1596,26 @@ "version": "1.5.0" } }, + "tempo-testnet": { + "armProxy": { + "address": "0xc2e1B8e9a765A19315cD9BbbD84a1BB6DC3FC335", + "version": "1.0.0" + }, + "chainSelector": "3963528237232804922", + "feeTokens": ["AlphaUSD", "BetaUSD", "LINK", "ThetaUSD", "WTEMP"], + "registryModule": { + "address": "0x7A635FdfDC70469B6e8796Bd7dEeB3f24fd4f949", + "version": "1.6.0" + }, + "router": { + "address": "0xAE7D1b3D8466718378038de45D4D376E73A04EB6", + "version": "1.2.0" + }, + "tokenAdminRegistry": { + "address": "0xEC7088f7952ba58f268E25AC3868DF92bF462AEf", + "version": "1.5.0" + } + }, "treasure-testnet-topaz": { "armProxy": { "address": "0x43f7b33Aee99208A38e4384655d35D8F0dCe7C51", diff --git a/src/config/data/ccip/v1_2_0/testnet/lanes.json b/src/config/data/ccip/v1_2_0/testnet/lanes.json index 567cbe4b92e..921ba9770a2 100644 --- a/src/config/data/ccip/v1_2_0/testnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/testnet/lanes.json @@ -3400,6 +3400,33 @@ } } }, + "tempo-testnet": { + "offRamp": { + "address": "0x0820f975ce90EE5c508657F0C58b71D1fcc85cE0", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x23a5084Fa78104F3DF11C63Ae59fcac4f6AD9DeE", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "CCIP-BnM": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, "treasure-testnet-topaz": { "offRamp": { "address": "0x25bDd16cD2721baB3D81043ed9742CD8F1f5bF6b", @@ -7568,6 +7595,35 @@ } } }, + "tempo-testnet": { + "ethereum-testnet-sepolia": { + "offRamp": { + "address": "0x948cfD1C48C52a93D23Ace2CfB4D2abACc0Ada29", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x0ED0EEb9b71778C2b826f37D35c4Be91D2741F33", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "CCIP-BnM": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, "treasure-testnet-topaz": { "ethereum-testnet-sepolia": { "offRamp": { diff --git a/src/config/data/ccip/v1_2_0/testnet/tokens.json b/src/config/data/ccip/v1_2_0/testnet/tokens.json index 3f0963c8f72..3368863cb64 100644 --- a/src/config/data/ccip/v1_2_0/testnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/testnet/tokens.json @@ -1,4 +1,14 @@ { + "AlphaUSD": { + "tempo-testnet": { + "allowListEnabled": false, + "decimals": 6, + "name": "AlphaUSD", + "poolType": "feeTokenOnly", + "symbol": "AlphaUSD", + "tokenAddress": "0x20C0000000000000000000000000000000000001" + } + }, "APT": { "aptos-testnet": { "allowListEnabled": false, @@ -9,6 +19,16 @@ "tokenAddress": "0x000000000000000000000000000000000000000000000000000000000000000A" } }, + "BetaUSD": { + "tempo-testnet": { + "allowListEnabled": false, + "decimals": 6, + "name": "BetaUSD", + "poolType": "feeTokenOnly", + "symbol": "BetaUSD", + "tokenAddress": "0x20C0000000000000000000000000000000000002" + } + }, "CCIP-BnM": { "abstract-testnet": { "allowListEnabled": false, @@ -397,6 +417,15 @@ "symbol": "CCIP-BnM", "tokenAddress": "0x4Bc8740F54eC7CD6738f19ff00438bFE3DCbceB3" }, + "tempo-testnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "CCIP-BnM", + "poolAddress": "0x8A9886bC69Bb735AC082C91286DC2f1bDf6d3411", + "poolType": "burnMint", + "symbol": "CCIP-BnM", + "tokenAddress": "0x9Af873f951c444d37B27B440ae53AB63CE58E5e5" + }, "wemix-testnet": { "allowListEnabled": false, "decimals": 18, @@ -1196,6 +1225,14 @@ "symbol": "LINK", "tokenAddress": "0xe5e3a4fF1773d043a387b16Ceb3c91cC49bAFD54" }, + "tempo-testnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "ChainLink Token", + "poolType": "feeTokenOnly", + "symbol": "LINK", + "tokenAddress": "0x384C8843411f725e800E625d5d1B659256D629dF" + }, "treasure-testnet-topaz": { "allowListEnabled": false, "decimals": 18, @@ -1314,6 +1351,16 @@ "tokenAddress": "0x2282DA461850d900ba7E777b6D4161a415860931" } }, + "ThetaUSD": { + "tempo-testnet": { + "allowListEnabled": false, + "decimals": 6, + "name": "ThetaUSD", + "poolType": "feeTokenOnly", + "symbol": "ThetaUSD", + "tokenAddress": "0x20C0000000000000000000000000000000000003" + } + }, "USDC": { "avalanche-fuji-testnet": { "allowListEnabled": false, @@ -2006,6 +2053,16 @@ "tokenAddress": "0x4200000000000000000000000000000000000006" } }, + "WTEMP": { + "tempo-testnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "WTEMP", + "poolType": "feeTokenOnly", + "symbol": "WTEMP", + "tokenAddress": "0xe875EB5437E55B74D18f6C090a5A14e4804dB2d9" + } + }, "WWEMIX": { "wemix-testnet": { "allowListEnabled": false, diff --git a/src/config/data/chain-to-technology.json b/src/config/data/chain-to-technology.json index e0f867250af..4266991e631 100644 --- a/src/config/data/chain-to-technology.json +++ b/src/config/data/chain-to-technology.json @@ -104,6 +104,7 @@ "MIND_NETWORK_TESTNET": "MIND_NETWORK", "MIND_NETWORK_MAINNET": "MIND_NETWORK", "MEGAETH_TESTNET": "MEGAETH", + "MEGAETH_MAINNET": "MEGAETH", "0G_GALILEO_TESTNET": "0G", "0G_MAINNET": "0G", "TAIKO_MAINNET": "TAIKO", @@ -162,5 +163,6 @@ "MORPH_HOODI_TESTNET": "MORPH", "JOVAY_MAINNET": "JOVAY", "JOVAY_TESTNET": "JOVAY", - "STABLE_MAINNET": "STABLE" + "STABLE_MAINNET": "STABLE", + "TEMPO_TESTNET": "TEMPO" } diff --git a/src/config/data/chains.json b/src/config/data/chains.json index b2efde2a9e0..91f1ec77ca3 100644 --- a/src/config/data/chains.json +++ b/src/config/data/chains.json @@ -1653,6 +1653,18 @@ "icon": "/assets/chains/megaeth.svg", "chainType": "evm", "chains": { + "MEGAETH_MAINNET": { + "chainId": 4326, + "title": "MegaETH Mainnet", + "explorer": { + "baseUrl": "https://megaexplorer.xyz" + }, + "nativeCurrency": { + "name": "MegaETH Ether", + "symbol": "ETH", + "decimals": 18 + } + }, "MEGAETH_TESTNET": { "chainId": 6342, "title": "MegaETH Testnet", @@ -2595,5 +2607,24 @@ } } } + }, + "TEMPO": { + "title": "Tempo", + "icon": "/assets/chains/tempo.svg", + "chainType": "evm", + "chains": { + "TEMPO_TESTNET": { + "chainId": 42429, + "title": "Tempo", + "explorer": { + "baseUrl": "https://explore.tempo.xyz" + }, + "nativeCurrency": { + "name": "USD", + "symbol": "USD", + "decimals": 18 + } + } + } } } diff --git a/src/config/types.ts b/src/config/types.ts index 5ecab27d036..c4ace27a0b0 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -80,6 +80,7 @@ export type SupportedTechnology = | "MORPH" | "JOVAY" | "STABLE" + | "TEMPO" export type ChainType = "evm" | "solana" | "aptos" @@ -192,6 +193,7 @@ export type SupportedChain = | "MIND_NETWORK_TESTNET" | "MIND_NETWORK_MAINNET" | "MEGAETH_TESTNET" + | "MEGAETH_MAINNET" | "TAIKO_MAINNET" | "TAIKO_HEKLA" | "PLUME_MAINNET" @@ -250,6 +252,7 @@ export type SupportedChain = | "JOVAY_MAINNET" | "JOVAY_TESTNET" | "STABLE_MAINNET" + | "TEMPO_TESTNET" export type ExplorerInfo = { baseUrl: string diff --git a/src/config/web3Providers.ts b/src/config/web3Providers.ts index f4e1b08977b..ab57ddc34a4 100644 --- a/src/config/web3Providers.ts +++ b/src/config/web3Providers.ts @@ -109,6 +109,7 @@ export const chainToProvider: Record<SupportedChain, () => Provider> = { MIND_NETWORK_TESTNET: () => new JsonRpcProvider("https://rpc-testnet.mindnetwork.xyz"), MIND_NETWORK_MAINNET: () => new JsonRpcProvider("https://rpc-mainnet.mindnetwork.xyz"), MEGAETH_TESTNET: () => new JsonRpcProvider("https://carrot.megaeth.com/rpc"), + MEGAETH_MAINNET: () => new JsonRpcProvider("https://carrot.megaeth.com/rpc"), "0G_GALILEO_TESTNET": () => new JsonRpcProvider("https://evmrpc-testnet.0g.ai/"), "0G_MAINNET": () => new JsonRpcProvider("https://evmrpc.0g.ai/"), TAIKO_MAINNET: () => new JsonRpcProvider("https://rpc.mainnet.taiko.xyz"), @@ -169,6 +170,7 @@ export const chainToProvider: Record<SupportedChain, () => Provider> = { JOVAY_MAINNET: () => new JsonRpcProvider("https://rpc.jovay.io"), JOVAY_TESTNET: () => new JsonRpcProvider("https://api.zan.top/public/jovay-testnet"), STABLE_MAINNET: () => new JsonRpcProvider("https://rpc.stable.xyz"), + TEMPO_TESTNET: () => new JsonRpcProvider("https://rpc.testnet.tempo.xyz"), } export const getRpcUrlForChain = (chain: SupportedChain): string => { diff --git a/src/content/resources/link-token-contracts.mdx b/src/content/resources/link-token-contracts.mdx index 5d6fb00873e..7e8f6574c94 100644 --- a/src/content/resources/link-token-contracts.mdx +++ b/src/content/resources/link-token-contracts.mdx @@ -1794,6 +1794,18 @@ Testnet S is used to pay for transactions on Sonic Blaze testnet. | Symbol | LINK | | Decimals | 18 | +## <img src="/assets/chains/tempo.svg" style="height: 24px; width: auto; margin-right: 8px;" />Tempo + +### Tempo Testnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Chain ID | `42429` | +| Address | <Address contractUrl="https://explore.tempo.xyz/address/0x384C8843411f725e800E625d5d1B659256D629dF" urlId="42429_0x384C8843411f725e800E625d5d1B659256D629dF" urlClass="erc-token-address"/> | +| Name | Chainlink Token on Tempo Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## <img src="/assets/chains/treasure.svg" style="height: 24px; width: auto; margin-right: 8px;" />Treasure ### Treasure Mainnet diff --git a/src/content/resources/llms-full.txt b/src/content/resources/llms-full.txt index 43d5db2917e..af965a41342 100644 --- a/src/content/resources/llms-full.txt +++ b/src/content/resources/llms-full.txt @@ -2559,6 +2559,18 @@ Testnet S is used to pay for transactions on Sonic Blaze testnet. | Symbol | LINK | | Decimals | 18 | +## <img src="/assets/chains/tempo.svg" style="height: 24px; width: auto; margin-right: 8px;" />Tempo + +### Tempo Testnet + +| Parameter | Value | +| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `42429` | +| Address | <Address contractUrl="https://explore.tempo.xyz/address/0x384C8843411f725e800E625d5d1B659256D629dF" urlId="42429_0x384C8843411f725e800E625d5d1B659256D629dF" urlClass="erc-token-address" /> | +| Name | Chainlink Token on Tempo Testnet | +| Symbol | LINK | +| Decimals | 18 | + ## <img src="/assets/chains/treasure.svg" style="height: 24px; width: auto; margin-right: 8px;" />Treasure ### Treasure Mainnet diff --git a/src/features/utils/index.ts b/src/features/utils/index.ts index 3a6fe212dde..4d8032b2970 100644 --- a/src/features/utils/index.ts +++ b/src/features/utils/index.ts @@ -402,6 +402,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": @@ -524,6 +526,8 @@ export const directoryToSupportedChain = (chainInRdd: string): SupportedChain => return "JOVAY_TESTNET" case "stable-mainnet": return "STABLE_MAINNET" + case "tempo-testnet": + return "TEMPO_TESTNET" default: throw Error(`Chain not found ${chainInRdd}`) } @@ -727,6 +731,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": @@ -847,6 +853,8 @@ export const supportedChainToChainInRdd = (supportedChain: SupportedChain): stri return "jovay-testnet" case "STABLE_MAINNET": return "stable-mainnet" + case "TEMPO_TESTNET": + return "tempo-testnet" default: throw Error(`Chain not found ${supportedChain}`) } diff --git a/src/scripts/reference/chains.json b/src/scripts/reference/chains.json index 688e67d1d07..31a1b71f82e 100644 --- a/src/scripts/reference/chains.json +++ b/src/scripts/reference/chains.json @@ -858,6 +858,18 @@ "slip44": 1005, "icon": "bittensor" }, + { + "name": "Stable Mainnet", + "chain": "ETH", + "rpc": ["https://rpc.stable.xyz"], + "faucets": [], + "nativeCurrency": { "name": "gasUSDT", "symbol": "gUSDT", "decimals": 18 }, + "infoURL": "https://docs.stable.xyz/", + "shortName": "Stable", + "chainId": 988, + "networkId": 988, + "explorers": [{ "name": "Stable Mainnet Explorer", "url": "https://stablescan.xyz/", "standard": "EIP3091" }] + }, { "name": "HyperEVM Testnet", "chain": "HYPE", @@ -1428,18 +1440,6 @@ ], "parent": { "type": "L2", "chain": "eip155-1", "bridges": [{ "url": "https://bridge.morphl2.io/" }] } }, - { - "name": "Stable Mainnet", - "chain": "ETH", - "rpc": ["https://rpc.stable.xyz"], - "faucets": [], - "nativeCurrency": { "name": "gasUSDT", "symbol": "gUSDT", "decimals": 18 }, - "infoURL": "https://docs.stable.xyz/", - "shortName": "Stable", - "chainId": 988, - "networkId": 988, - "explorers": [{ "name": "Stable Mainnet Explorer", "url": "https://stablescan.xyz/", "standard": "EIP3091" }] - }, { "name": "Botanix Testnet", "chain": "BOTANIX", @@ -1521,6 +1521,30 @@ { "name": "liskscout", "url": "https://sepolia-blockscout.lisk.com", "icon": "blockscout", "standard": "EIP3091" } ] }, + { + "name": "MegaETH Mainnet", + "chain": "ETH", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "rpc": [], + "faucets": [], + "explorers": [{ "name": "MegaETH Explorer", "url": "https://megaexplorer.xyz", "standard": "none" }], + "infoURL": "https://megaeth.com", + "shortName": "megaeth", + "chainId": 4326, + "networkId": 4326 + }, + { + "name": "Tempo Testnet", + "chain": "ETH", + "nativeCurrency": { "name": "USD", "symbol": "USD", "decimals": 18 }, + "rpc": ["https://rpc.testnet.tempo.xyz"], + "faucets": [], + "explorers": [{ "name": "Tempo Explorer", "url": "https://explore.tempo.xyz", "standard": "none" }], + "infoURL": "https://tempo.xyz/", + "shortName": "megaeth", + "chainId": 42429, + "networkId": 42429 + }, { "name": "World Chain Sepolia Testnet", "chain": "ETH", @@ -1626,7 +1650,7 @@ "name": "MegaETH Testnet", "chain": "ETH", "nativeCurrency": { "name": "MegaETH Testnet Ether", "symbol": "ETH", "decimals": 18 }, - "rpc": ["https://carrot.megaeth.com/rpc", "wss://carrot.megaeth.com/ws"], + "rpc": ["https://timothy.megaeth.com/rpc", "wss://carrot.megaeth.com/ws"], "faucets": [], "infoURL": "https://www.megaeth.com", "shortName": "megatest", diff --git a/src/scripts/reference/linkNameSymbol.json b/src/scripts/reference/linkNameSymbol.json index 9862ef0959e..ffddeec33f0 100644 --- a/src/scripts/reference/linkNameSymbol.json +++ b/src/scripts/reference/linkNameSymbol.json @@ -643,5 +643,13 @@ "988": { "name": "ChainLink Token", "symbol": "LINK" + }, + "42429": { + "name": "ChainLink Token", + "symbol": "LINK" + }, + "4326": { + "name": "ChainLink Token", + "symbol": "LINK" } } From d8d14d8e39e1dc89b9c72ac2cb468f3e855a04ff Mon Sep 17 00:00:00 2001 From: gfletcher-cll <grace.fletcher@smartcontract.com> Date: Fri, 12 Dec 2025 11:14:16 -0800 Subject: [PATCH 053/214] Ccip updates (#3282) * nonce manager updates + billing bps update * update llms --- reports/llms-report.json | 12 +++++----- .../CCIP/ChainHero/LaneDetailsHero.tsx | 2 +- src/config/data/ccip/data.ts | 2 +- .../architecture/onchain/aptos/components.mdx | 9 ------- .../architecture/onchain/evm/components.mdx | 13 +--------- .../ccip/concepts/best-practices/evm.mdx | 4 ++-- src/content/ccip/llms-full.txt | 24 ++----------------- 7 files changed, 13 insertions(+), 53 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index ee073406e3d..c889780b038 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,5 +1,5 @@ { - "startedAt": "2025-12-12T16:45:20.957Z", + "startedAt": "2025-12-12T18:52:31.071Z", "siteBase": "https://docs.chain.link", "sections": [ { @@ -30,9 +30,9 @@ "section": "ccip", "pagesProcessed": 260, "outputPath": "src/content/ccip/llms-full.txt", - "bytes": 2849877, + "bytes": 2848574, "prevBytes": 2849877, - "deltaBytes": 0 + "deltaBytes": -1303 }, { "section": "data-feeds", @@ -87,8 +87,8 @@ "pagesProcessed": 12, "outputPath": "src/content/resources/llms-full.txt", "bytes": 341272, - "prevBytes": 339715, - "deltaBytes": 1557 + "prevBytes": 341272, + "deltaBytes": 0 }, { "section": "architecture-overview", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-12T16:45:24.639Z" + "finishedAt": "2025-12-12T18:52:34.836Z" } diff --git a/src/components/CCIP/ChainHero/LaneDetailsHero.tsx b/src/components/CCIP/ChainHero/LaneDetailsHero.tsx index 8c96ef2fde5..1239dcc3dd1 100644 --- a/src/components/CCIP/ChainHero/LaneDetailsHero.tsx +++ b/src/components/CCIP/ChainHero/LaneDetailsHero.tsx @@ -147,7 +147,7 @@ function LaneDetailsHero({ label="Out of Order Execution" clipboardType="out-of-order-execution" tooltip={ - <StyledTooltip tip="Controls the execution order of your messages on the destination blockchain. Setting this to true allows messages to be executed in any order. Setting it to false ensures messages are executed in sequence, so a message will only be executed if the preceding one has been executed. On lanes where 'Out of Order Execution' is required, you must set this to true; otherwise, the transaction will revert." /> + <StyledTooltip tip="Currently controls the execution order of your messages on the destination blockchain. Required = Must be set for all messages, and to True. Optional = Can be set, and if set to True, enables Out-of-Order messaging. Note: Being deprecated in early 2026; OOO becomes default and only option." /> } > {getOutOfOrderText(enforceOutOfOrder)} diff --git a/src/config/data/ccip/data.ts b/src/config/data/ccip/data.ts index 3eec6d88f9e..217883b1230 100644 --- a/src/config/data/ccip/data.ts +++ b/src/config/data/ccip/data.ts @@ -171,7 +171,7 @@ export const events: VersionedEvents = { export const networkFees: NetworkFees = { tokenTransfers: { [TokenMechanism.LockAndUnlock]: { - allLanes: { gasTokenFee: "0.07 %", linkFee: "0.063 %" }, + allLanes: { gasTokenFee: "0.05 %", linkFee: "0.063 %" }, }, [TokenMechanism.LockAndMint]: { fromEthereum: { gasTokenFee: "0.50 USD", linkFee: "0.45 USD" }, diff --git a/src/content/ccip/concepts/architecture/onchain/aptos/components.mdx b/src/content/ccip/concepts/architecture/onchain/aptos/components.mdx index 26ccfc690c2..57df428aed2 100644 --- a/src/content/ccip/concepts/architecture/onchain/aptos/components.mdx +++ b/src/content/ccip/concepts/architecture/onchain/aptos/components.mdx @@ -85,18 +85,9 @@ When the Router forwards a `ccip_send` request, the OnRamp performs the followin - If the message involves token transfers, it initiates a secure callback pattern by calling the `Token Admin Dispatcher`. - The dispatcher uses the `Token Admin Registry` to store the message context (sender, receiver, etc.) before invoking the correct `Token Pool` to `lock_or_burn` the assets. -- **Nonce Management** - - For ordered messages, it calls the `Nonce Manager` to retrieve and increment the sender's nonce for that destination. - - **Event Emission** - Generates a unique `messageId` and emits a `CCIPMessageSent` event containing the complete, sequenced message details. -## Nonce Manager - -The `ccip::nonce_manager` module enables optional strict message ordering. It tracks outbound nonces on a per-sender and per-destination-chain basis. - -When out-of-order execution is disabled for a message, the `OnRamp` module uses the `Nonce Manager` to assign an incrementing nonce, which is then verified by the `OffRamp` on the destination chain. - ## OffRamp The `ccip_offramp::offramp` module is an internal CCIP module that operates on the destination chain. It is the primary module that the offchain DONs interact with to deliver messages to Aptos. diff --git a/src/content/ccip/concepts/architecture/onchain/evm/components.mdx b/src/content/ccip/concepts/architecture/onchain/evm/components.mdx index 13da78e8086..e720da295ec 100644 --- a/src/content/ccip/concepts/architecture/onchain/evm/components.mdx +++ b/src/content/ccip/concepts/architecture/onchain/evm/components.mdx @@ -81,7 +81,7 @@ When the Router forwards a `ccipSend()` request to the OnRamp, the contract perf - If the message involves token transfers, it retrieves the correct Token Pool from the Token Admin Registry. - Initiates calls to lock or burn the token, based on the token handling mechanism. 1. **Nonce Management** - - Uses the Nonce Manager to ensure messages requiring in-order execution are processed in the correct order. + - Uses the Nonce Manager to ensure messages requiring in-order execution are processed in the correct order. Note: In-Order enforcement using Nonce Manager will be deprecated in early 2026. 1. **Message ID Generation** - Returns a unique message ID to the Router. 1. **Event Emission** @@ -151,17 +151,6 @@ The FeeQuoter is an internal CCIP smart contract that calculates and returns CCI For additional details on how CCIP fees are calculated, refer to the [CCIP Billing page](/ccip/billing). -## NonceManager - -The NonceManager helps order messages in CCIP by tracking outbound nonces on the source blockchain and inbound nonces on the destination blockchain. It ensures strict ordering when the message's extraArgs parameter requires ordering, thus providing a flexible design. - -1. **Ordered Messages** - - **Non-zero Nonces:** When an OnRamp identifies a message that must preserve ordering, it increments and assigns a non-zero outbound nonce. - - **Inbound Validation:** On the destination blockchain, the OffRamp checks that the incoming message's nonce matches the expected inbound nonce. If there is a mismatch, the message is skipped or deferred for later retry. -1. **Out-of-Order Messages** - - **Zero Nonces:** For messages marked "out of order," the OnRamp sets the nonce to **0**. - - **No Sequence Checks:** Because `nonce == 0` indicates no ordering, the OffRamp does not validate or increment inbound nonces. These messages can execute immediately without waiting for earlier messages. - ## Token Admin Registry The Token Admin Registry is a user-facing CCIP smart contract that maintains a one-to-one mapping between token addresses and their corresponding token pool addresses on a given chain. The OnRamp and OffRamp contracts use the Token Admin Registry to retrieve a token's configured token pool address to call the appropriate functions: diff --git a/src/content/ccip/concepts/best-practices/evm.mdx b/src/content/ccip/concepts/best-practices/evm.mdx index 70c1146ed6f..dba6b64e2d7 100644 --- a/src/content/ccip/concepts/best-practices/evm.mdx +++ b/src/content/ccip/concepts/best-practices/evm.mdx @@ -4,7 +4,7 @@ date: Last Modified title: "CCIP Best Practices (EVM)" metadata: description: "Comprehensive security guide for CCIP on EVM chains covering message verification, gas optimization, token administration, liquidity management, multi-signature protection, and chain-specific considerations for building secure cross-chain applications." - image: "/images/ccip/ccip-hl-v1.6.gif" + image: "/images/ccip/ccip-hl-v1.6.png" excerpt: "ccip evm best practices ethereum security message verification gas limit optimization token administration liquidity management multi-signature contracts ccip receiver extra args defensive programming" datePublished: "2025-05-19T11:22:47Z" lastModified: "2025-05-19T11:22:47Z" @@ -82,7 +82,7 @@ The `allowOutOfOrderExecution` parameter enables you to control the execution or - **When `allowOutOfOrderExecution` is Optional:** - You can set `allowOutOfOrderExecution` to either `true` or `false`, depending on your application's requirements. - **`true`:** Messages can be executed in any order relative to other messages from the same sender. If a previous message has not yet been executed on the destination chain, it does not block the execution of subsequent messages. - - **`false`:** Messages are executed in order. CCIP ensures that preceding messages are processed before executing the current message. + - **`false`:** Messages are executed in order. CCIP ensures that preceding messages are processed before executing the current message. Note: Functionality for `allowOutofOrderExecution` = `false` (ie., enforcing In-Order cross-chain messages) is being deprecated in early 2026. - **When `allowOutOfOrderExecution` is Required:** - You **must** set `allowOutOfOrderExecution` to `true`. This setting acknowledges that messages may be executed out of order. If set to `false`, the message will revert and will not be processed. diff --git a/src/content/ccip/llms-full.txt b/src/content/ccip/llms-full.txt index b9f490a6d81..d92c281e99c 100644 --- a/src/content/ccip/llms-full.txt +++ b/src/content/ccip/llms-full.txt @@ -1096,7 +1096,7 @@ When the Router forwards a `ccipSend()` request to the OnRamp, the contract perf - If the message involves token transfers, it retrieves the correct Token Pool from the Token Admin Registry. - Initiates calls to lock or burn the token, based on the token handling mechanism. 3. **Nonce Management** - - Uses the Nonce Manager to ensure messages requiring in-order execution are processed in the correct order. + - Uses the Nonce Manager to ensure messages requiring in-order execution are processed in the correct order. Note: In-Order enforcement using Nonce Manager will be deprecated in early 2026. 4. **Message ID Generation** - Returns a unique message ID to the Router. 5. **Event Emission** @@ -1166,17 +1166,6 @@ The FeeQuoter is an internal CCIP smart contract that calculates and returns CCI For additional details on how CCIP fees are calculated, refer to the [CCIP Billing page](/ccip/billing). -## NonceManager - -The NonceManager helps order messages in CCIP by tracking outbound nonces on the source blockchain and inbound nonces on the destination blockchain. It ensures strict ordering when the message's extraArgs parameter requires ordering, thus providing a flexible design. - -1. **Ordered Messages** - - **Non-zero Nonces:** When an OnRamp identifies a message that must preserve ordering, it increments and assigns a non-zero outbound nonce. - - **Inbound Validation:** On the destination blockchain, the OffRamp checks that the incoming message's nonce matches the expected inbound nonce. If there is a mismatch, the message is skipped or deferred for later retry. -2. **Out-of-Order Messages** - - **Zero Nonces:** For messages marked "out of order," the OnRamp sets the nonce to **0**. - - **No Sequence Checks:** Because `nonce == 0` indicates no ordering, the OffRamp does not validate or increment inbound nonces. These messages can execute immediately without waiting for earlier messages. - ## Token Admin Registry The Token Admin Registry is a user-facing CCIP smart contract that maintains a one-to-one mapping between token addresses and their corresponding token pool addresses on a given chain. The OnRamp and OffRamp contracts use the Token Admin Registry to retrieve a token's configured token pool address to call the appropriate functions: @@ -1838,18 +1827,9 @@ When the Router forwards a `ccip_send` request, the OnRamp performs the followin - If the message involves token transfers, it initiates a secure callback pattern by calling the `Token Admin Dispatcher`. - The dispatcher uses the `Token Admin Registry` to store the message context (sender, receiver, etc.) before invoking the correct `Token Pool` to `lock_or_burn` the assets. -- **Nonce Management** - - For ordered messages, it calls the `Nonce Manager` to retrieve and increment the sender's nonce for that destination. - - **Event Emission** - Generates a unique `messageId` and emits a `CCIPMessageSent` event containing the complete, sequenced message details. -## Nonce Manager - -The `ccip::nonce_manager` module enables optional strict message ordering. It tracks outbound nonces on a per-sender and per-destination-chain basis. - -When out-of-order execution is disabled for a message, the `OnRamp` module uses the `Nonce Manager` to assign an incrementing nonce, which is then verified by the `OffRamp` on the destination chain. - ## OffRamp The `ccip_offramp::offramp` module is an internal CCIP module that operates on the destination chain. It is the primary module that the offchain DONs interact with to deliver messages to Aptos. @@ -4381,7 +4361,7 @@ The `allowOutOfOrderExecution` parameter enables you to control the execution or - **When `allowOutOfOrderExecution` is Optional:** - You can set `allowOutOfOrderExecution` to either `true` or `false`, depending on your application's requirements. - **`true`:** Messages can be executed in any order relative to other messages from the same sender. If a previous message has not yet been executed on the destination chain, it does not block the execution of subsequent messages. - - **`false`:** Messages are executed in order. CCIP ensures that preceding messages are processed before executing the current message. + - **`false`:** Messages are executed in order. CCIP ensures that preceding messages are processed before executing the current message. Note: Functionality for `allowOutofOrderExecution` = `false` (ie., enforcing In-Order cross-chain messages) is being deprecated in early 2026. - **When `allowOutOfOrderExecution` is Required:** - You **must** set `allowOutOfOrderExecution` to `true`. This setting acknowledges that messages may be executed out of order. If set to `false`, the message will revert and will not be processed. From 9ac1494cf9d3dc623ceeb7c72e8f4d759100d2de Mon Sep 17 00:00:00 2001 From: gfletcher-cll <grace.fletcher@smartcontract.com> Date: Fri, 12 Dec 2025 14:11:08 -0800 Subject: [PATCH 054/214] Upkeep upgrade (#3283) * add upgrade callout to automation docs * llms * Update changelog.json --- public/changelog.json | 7 +++++++ reports/llms-report.json | 12 ++++++------ .../guides/job-scheduler.mdx | 10 ++++++++++ src/content/chainlink-automation/index.mdx | 9 +++++++++ src/content/chainlink-automation/llms-full.txt | 16 ++++++++++++++++ 5 files changed, 48 insertions(+), 6 deletions(-) diff --git a/public/changelog.json b/public/changelog.json index 958fa9e39b9..d31fabffa02 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -373,6 +373,13 @@ "title": "CCIP Expands to Tempo Testnet", "topic": "CCIP" }, + { + "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", diff --git a/reports/llms-report.json b/reports/llms-report.json index c889780b038..6a281009ee9 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,5 +1,5 @@ { - "startedAt": "2025-12-12T18:52:31.071Z", + "startedAt": "2025-12-12T21:54:23.121Z", "siteBase": "https://docs.chain.link", "sections": [ { @@ -31,8 +31,8 @@ "pagesProcessed": 260, "outputPath": "src/content/ccip/llms-full.txt", "bytes": 2848574, - "prevBytes": 2849877, - "deltaBytes": -1303 + "prevBytes": 2848574, + "deltaBytes": 0 }, { "section": "data-feeds", @@ -78,9 +78,9 @@ "section": "chainlink-automation", "pagesProcessed": 25, "outputPath": "src/content/chainlink-automation/llms-full.txt", - "bytes": 196013, + "bytes": 197667, "prevBytes": 196013, - "deltaBytes": 0 + "deltaBytes": 1654 }, { "section": "resources", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-12T18:52:34.836Z" + "finishedAt": "2025-12-12T21:54:26.892Z" } diff --git a/src/content/chainlink-automation/guides/job-scheduler.mdx b/src/content/chainlink-automation/guides/job-scheduler.mdx index c4039102800..201a40691d2 100644 --- a/src/content/chainlink-automation/guides/job-scheduler.mdx +++ b/src/content/chainlink-automation/guides/job-scheduler.mdx @@ -22,6 +22,16 @@ Create powerful automation for your smart contract using time schedules without Follow the [best practices](/chainlink-automation/concepts/best-practice) when creating an Automation-compatible contract and test your upkeep on a testnet before deploying it to a mainnet. </Aside> + +<Aside type="caution" title="Upgrade Time-Based Upkeep Recommended"> + The Automation “Time-based” upkeep contract has been updated so that only the unique forwarder for your upkeep can call it. If your upkeep was deployed before 11 December 2025, we recommend you replace your existing “Time-based” upkeeps using the new “Time-based” upkeep. + +To upgrade, simply follow the [Automation UI](https://automation.chain.link/) to register a new “Time-based” upkeep with the same details as your previous upkeep. Once registered, you can delete the previous upkeep. + +Upgrading to the latest “Time-based” upkeep removes i) the ability of 3rd parties to trigger your upkeep, and ii) the possibility that a call with insufficient gas ticks the Timer forward but fails to execute your desired function. + +</Aside> + ## Using the Chainlink Automation app In the [Chainlink Automation App](https://automation.chain.link/), click the blue **Register new Upkeep** button. diff --git a/src/content/chainlink-automation/index.mdx b/src/content/chainlink-automation/index.mdx index 33776f986ce..223c4d893fa 100644 --- a/src/content/chainlink-automation/index.mdx +++ b/src/content/chainlink-automation/index.mdx @@ -23,6 +23,15 @@ import ChainlinkAutomation from "@features/chainlink-automation/common/Chainlink <ChainlinkAutomation callout="deprecation" /> +<Aside type="caution" title="Upgrade Time-Based Upkeep Recommended"> + The Automation “Time-based” upkeep contract has been updated so that only the unique forwarder for your upkeep can call it. If your upkeep was deployed before 11 December 2025, we recommend you replace your existing “Time-based” upkeeps using the new “Time-based” upkeep. + +To upgrade, simply follow the [Automation UI](https://automation.chain.link/) to register a new “Time-based” upkeep with the same details as your previous upkeep. Once registered, you can delete the previous upkeep. + +Upgrading to the latest “Time-based” upkeep removes i) the ability of 3rd parties to trigger your upkeep, and ii) the possibility that a call with insufficient gas ticks the Timer forward but fails to execute your desired function. + +</Aside> + Automate your smart contracts using a secure and hyper-reliable decentralized network that uses the same external network of node operators that secures billions in value. Building on Chainlink Automation will accelerate your innovation, save you time and money, and help you get to market faster so you don't have to deal with the setup cost, ongoing maintenance, and risks associated with a centralized automation stack. To learn more about how the Chainlink Automation Network automates your smart contracts, visit the [Concepts](/chainlink-automation/concepts/automation-concepts) and [Architecture](/chainlink-automation/concepts/automation-architecture) pages. You can also learn more through our [additional Automation resources](https://chain.link/automation#masterclass). diff --git a/src/content/chainlink-automation/llms-full.txt b/src/content/chainlink-automation/llms-full.txt index ef118c4a74a..b2258f479a7 100644 --- a/src/content/chainlink-automation/llms-full.txt +++ b/src/content/chainlink-automation/llms-full.txt @@ -401,6 +401,14 @@ Create powerful automation for your smart contract using time schedules without contract and test your upkeep on a testnet before deploying it to a mainnet. </Aside> +<Aside type="caution" title="Upgrade Time-Based Upkeep Recommended"> + The Automation “Time-based” upkeep contract has been updated so that only the unique forwarder for your upkeep can call it. If your upkeep was deployed before 11 December 2025, we recommend you replace your existing “Time-based” upkeeps using the new “Time-based” upkeep. + + To upgrade, simply follow the [Automation UI](https://automation.chain.link/) to register a new “Time-based” upkeep with the same details as your previous upkeep. Once registered, you can delete the previous upkeep. + + Upgrading to the latest “Time-based” upkeep removes i) the ability of 3rd parties to trigger your upkeep, and ii) the possibility that a call with insufficient gas ticks the Timer forward but fails to execute your desired function. +</Aside> + ## Using the Chainlink Automation app In the [Chainlink Automation App](https://automation.chain.link/), click the blue **Register new Upkeep** button. @@ -976,6 +984,14 @@ Source: https://docs.chain.link/chainlink-automation Try Chainlink Automation in the [Getting Started](/chainlink-automation/overview/getting-started) guide. </Aside> +<Aside type="caution" title="Upgrade Time-Based Upkeep Recommended"> + The Automation “Time-based” upkeep contract has been updated so that only the unique forwarder for your upkeep can call it. If your upkeep was deployed before 11 December 2025, we recommend you replace your existing “Time-based” upkeeps using the new “Time-based” upkeep. + + To upgrade, simply follow the [Automation UI](https://automation.chain.link/) to register a new “Time-based” upkeep with the same details as your previous upkeep. Once registered, you can delete the previous upkeep. + + Upgrading to the latest “Time-based” upkeep removes i) the ability of 3rd parties to trigger your upkeep, and ii) the possibility that a call with insufficient gas ticks the Timer forward but fails to execute your desired function. +</Aside> + Automate your smart contracts using a secure and hyper-reliable decentralized network that uses the same external network of node operators that secures billions in value. Building on Chainlink Automation will accelerate your innovation, save you time and money, and help you get to market faster so you don't have to deal with the setup cost, ongoing maintenance, and risks associated with a centralized automation stack. To learn more about how the Chainlink Automation Network automates your smart contracts, visit the [Concepts](/chainlink-automation/concepts/automation-concepts) and [Architecture](/chainlink-automation/concepts/automation-architecture) pages. You can also learn more through our [additional Automation resources](https://chain.link/automation#masterclass). From a9a1bdf8b71cef0dbc8da7f5e94379b5a995d5dc Mon Sep 17 00:00:00 2001 From: Mark Shenouda <mark.s.shenouda@gmail.com> Date: Mon, 15 Dec 2025 09:52:49 +0200 Subject: [PATCH 055/214] fix: index.mdx --- src/content/ccip/index.mdx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/content/ccip/index.mdx b/src/content/ccip/index.mdx index bbd7fe0ea15..d8b9780c843 100644 --- a/src/content/ccip/index.mdx +++ b/src/content/ccip/index.mdx @@ -305,10 +305,3 @@ CCIP's robust security framework is built upon several core components: /> To understand how Chainlink CCIP works, refer to the [architecture](/ccip/concepts/architecture/overview) section. If you are new to using Chainlink CCIP, read these guides before you deploy any contracts that use CCIP. - - <MediaSection - heading="High-level architecture" - description="CCIP delivers cross-chain messages from a source chain to a destination chain by combining offchain consensus and onchain execution components." - image="/images/architecture.png" - /> -</OverviewWrapper> From b53b5bc8ef3b92246dd0f3dfa1f1712f7d02b9a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 10:16:57 +0000 Subject: [PATCH 056/214] Bump @supabase/supabase-js from 2.86.2 to 2.87.1 (#3295) * Bump @supabase/supabase-js from 2.86.2 to 2.87.1 Bumps [@supabase/supabase-js](https://github.com/supabase/supabase-js/tree/HEAD/packages/core/supabase-js) from 2.86.2 to 2.87.1. - [Release notes](https://github.com/supabase/supabase-js/releases) - [Changelog](https://github.com/supabase/supabase-js/blob/master/packages/core/supabase-js/CHANGELOG.md) - [Commits](https://github.com/supabase/supabase-js/commits/v2.87.1/packages/core/supabase-js) --- updated-dependencies: - dependency-name: "@supabase/supabase-js" dependency-version: 2.87.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 285 ++++++++++++++++++++++++++++++++++++---------- package.json | 2 +- 2 files changed, 227 insertions(+), 60 deletions(-) diff --git a/package-lock.json b/package-lock.json index 82c8118a6c9..64379e9c53b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "@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.86.2", + "@supabase/supabase-js": "^2.87.1", "astro": "^5.16.4", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", @@ -11946,10 +11946,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.0", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.0.tgz", + "integrity": "sha512-EmGSKDvmnEnBrTK75T+0Syt6gy/HACOTfziw5+392Kr1Bb28Rv26GyOIkvptnT+bb2VDHU0hx9G0vSy5/S3rmQ==", + "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.0", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.0.tgz", + "integrity": "sha512-3fvMi/pSJHhikjwMZQplU4Ar9ANoR2GSBxotbkKIMI6iNduh+ln1FTvB2me69FA68aHtVZOO+cO+QpGCcvgaMA==", + "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.0", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.0.tgz", + "integrity": "sha512-bJD5pLURgKY2YK0R6gUsFWHiblSAFt1Xyc2fsyCL8XBnB7kJfVhLAKGItk6j1QZbwm1Io41ekZxBmZdyQqIDrg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@react-native/dev-middleware": "0.83.0", + "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.0", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.0.tgz", + "integrity": "sha512-7XVbkH8nCjLKLe8z5DS37LNP62/QNNya/YuLlVoLfsiB54nR/kNZij5UU7rS0npAZ3WN7LR0anqLlYnzDd0JHA==", + "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.0", + "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.0.tgz", + "integrity": "sha512-rJJxRRLLsKW+cqd0ALSBoqwL5SQTmwpd5SGl6rq9sY+fInCUKfkLEIc5HWQ0ppqoPyDteQVWbQ3a5VN84aJaNg==", + "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.0", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.0.tgz", + "integrity": "sha512-HWn42tbp0h8RWttua6d6PjseaSr3IdwkaoqVxhiM9kVDY7Ro00eO7tdlVgSzZzhIibdVS2b2C3x+sFoWhag1fA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.83.0", + "@react-native/debugger-shell": "0.83.0", + "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.0", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.0.tgz", + "integrity": "sha512-BXZRmfsbgPhEPkrRPjk2njA2AzhSelBqhuoklnv3DdLTdxaRjKYW+LW0zpKo1k3qPKj7kG1YGI3miol6l1GB5g==", + "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.0", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.0.tgz", + "integrity": "sha512-cVB9BMqlfbQR0v4Wxi5M2yDhZoKiNqWgiEXpp7ChdZIXI0SEnj8WwLwE3bDkyOfF8tCHdytpInXyg/al2O+dLQ==", + "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.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.0.tgz", + "integrity": "sha512-DG1ELOqQ6RS82R1zEUGTWa/pfSPOf+vwAnQB7Ao1vRuhW/xdd2OPQJyqx5a5QWMYpGrlkCb7ERxEVX6p2QODCA==", + "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.0", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.0.tgz", + "integrity": "sha512-AVnDppwPidQrPrzA4ETr4o9W+40yuijg3EVgFt2hnMldMZkqwPRrgJL2GSreQjCYe1NfM5Yn4Egyy4Kd0yp4Lw==", "license": "MIT", "optional": true, "peer": true, @@ -11961,7 +12108,7 @@ "node": ">= 20.19.4" }, "peerDependencies": { - "@types/react": "^19.1.1", + "@types/react": "^19.2.0", "react": "*", "react-native": "*" }, @@ -12081,6 +12228,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", @@ -12185,9 +12340,9 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/react": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz", - "integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==", + "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, @@ -12196,21 +12351,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.0", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.83.0.tgz", + "integrity": "sha512-a8wPjGfkktb1+Mjvzkky3d0u6j6zdWAzftZ2LdQtgRgqkMMfgQxD9S+ri3RNlfAFQpuCAOYUIyrNHiVkUQChxA==", "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.0", + "@react-native/codegen": "0.83.0", + "@react-native/community-cli-plugin": "0.83.0", + "@react-native/gradle-plugin": "0.83.0", + "@react-native/js-polyfills": "0.83.0", + "@react-native/normalize-colors": "0.83.0", + "@react-native/virtualized-lists": "0.83.0", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", @@ -12220,23 +12375,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": { @@ -12247,7 +12402,7 @@ }, "peerDependencies": { "@types/react": "^19.1.1", - "react": "^19.1.1" + "react": "^19.2.0" }, "peerDependenciesMeta": { "@types/react": { @@ -12267,9 +12422,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 @@ -12329,14 +12484,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": { @@ -14139,9 +14306,9 @@ "license": "MIT" }, "node_modules/@supabase/auth-js": { - "version": "2.86.2", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.86.2.tgz", - "integrity": "sha512-7k8IAhgSnZuD9Zex2+ohHKY3aWGDd4ls0xlxMGl3/jPyHSSXrIYfmtJyUH0+DPd4B3psBqHC0Ev0/nZEHdW58w==", + "version": "2.87.1", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.87.1.tgz", + "integrity": "sha512-6RDeOf5TVoaXFtEstN188ykp3pXLZaU9qoAWfx8dc50FFAAqt+kcFJ96V0IvSmcpb4mDAWcpTJ7BegmVDn/WIw==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14151,9 +14318,9 @@ } }, "node_modules/@supabase/functions-js": { - "version": "2.86.2", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.86.2.tgz", - "integrity": "sha512-OLpy3NIlj7q3yGMFwUpPkDPJbRx4aU+u73SiXqiMnA5ARwzVcOReSzI2u4oOqioE+3ud0fRx7sRsfoklBwYOmg==", + "version": "2.87.1", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.87.1.tgz", + "integrity": "sha512-rWmYo4gRD0XAjMhYDlz7IH67bp4TIQ1UE4VqwIQtl1gGPwtLDq6wcRnu7jLKlXx0Gtrknw/eoiHYG9//XrCTzQ==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14163,9 +14330,9 @@ } }, "node_modules/@supabase/postgrest-js": { - "version": "2.86.2", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.86.2.tgz", - "integrity": "sha512-KVgOF2QASvUfQnzMGAmxR7f3ZF/eZ8PFp2F5Q7SAPQlmB83FEaZ7C/QMzfVXXqkMbotfh96xcaBNSKnxowFObA==", + "version": "2.87.1", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.87.1.tgz", + "integrity": "sha512-Yzu5eL3iGmZW0C/8x+vEojAOou63FI9oVw8HI8YOq63+5yM8g8aGh7Y1E2vbXFb7+gHGsPqLnaC6dPhrYt7qBA==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14175,9 +14342,9 @@ } }, "node_modules/@supabase/realtime-js": { - "version": "2.86.2", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.86.2.tgz", - "integrity": "sha512-uLUYrOMeK1qXHISxdMFVfBs0sGV5PmqYewIHvLBnMYbb//LERojxfKlVSJBgZ+aAwxANmtQKcprjGZI7DJ6lNQ==", + "version": "2.87.1", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.87.1.tgz", + "integrity": "sha512-XvLtEznxmYZXA7LYuy5zbSXpSYjDLJq2wQeRh3MzON2OR4U8Kq+RtPz2E2Wi8HEzvBfsc+nNu1TG8LQ9+3DRkA==", "license": "MIT", "dependencies": { "@types/phoenix": "^1.6.6", @@ -14190,12 +14357,12 @@ } }, "node_modules/@supabase/storage-js": { - "version": "2.86.2", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.86.2.tgz", - "integrity": "sha512-zyR4PkO7R4f4/xRBVJho3Dm7y4512BoCqGmD7LjNV2GVtWt8vEmambiuMB2Ty3l76mqw+ynQyHY8yFWSERrHXA==", + "version": "2.87.1", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.87.1.tgz", + "integrity": "sha512-0Uc8tNV4yzkNNmp1inpXru0RB4a7ECq05G2S6BDvSpMxTxJrDVJ4vVDwyhqB8ZZ+O9+8prHaQYoByQeuDnwpFQ==", "license": "MIT", "dependencies": { - "iceberg-js": "^0.8.0", + "iceberg-js": "^0.8.1", "tslib": "2.8.1" }, "engines": { @@ -14203,16 +14370,16 @@ } }, "node_modules/@supabase/supabase-js": { - "version": "2.86.2", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.86.2.tgz", - "integrity": "sha512-KXoiqFf7zZhL/+lj7oBFFUvVDQ6gy03v9wQ5E++f7xiJUuqmI4DuBhrv8uFo6B2EGTQTA3vkXjbxmYIug/zfWw==", + "version": "2.87.1", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.87.1.tgz", + "integrity": "sha512-tVgqZqnHZVum584KuUKSQZgcy6ZkhVd6gG8QWg2QfIXH9HmXdamauxdVsLXwaNPJxEdOyfAfwIyi5XUsiVYWtg==", "license": "MIT", "dependencies": { - "@supabase/auth-js": "2.86.2", - "@supabase/functions-js": "2.86.2", - "@supabase/postgrest-js": "2.86.2", - "@supabase/realtime-js": "2.86.2", - "@supabase/storage-js": "2.86.2" + "@supabase/auth-js": "2.87.1", + "@supabase/functions-js": "2.87.1", + "@supabase/postgrest-js": "2.87.1", + "@supabase/realtime-js": "2.87.1", + "@supabase/storage-js": "2.87.1" }, "engines": { "node": ">=20.0.0" @@ -15100,9 +15267,9 @@ "license": "MIT" }, "node_modules/@types/phoenix": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz", - "integrity": "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.7.tgz", + "integrity": "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==", "license": "MIT" }, "node_modules/@types/prismjs": { diff --git a/package.json b/package.json index 04bab6311b8..545c10cf254 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@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.86.2", + "@supabase/supabase-js": "^2.87.1", "astro": "^5.16.4", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", From 8ba979fb54120ed9863cbc6a6d90369bc73aebf5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 10:28:51 +0000 Subject: [PATCH 057/214] CCT: Update changelog with new tokens (#3287) Co-authored-by: khadni <98668332+khadni@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> --- public/changelog.json | 75 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/public/changelog.json b/public/changelog.json index d31fabffa02..ffe028d9326 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -358,6 +358,81 @@ } }, "data": [ + { + "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-12", From a9d826059eb3d66317f1bb33c0c01d8beebab3d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 10:51:54 +0000 Subject: [PATCH 058/214] Bump the solana-ecosystem group with 2 updates (#3294) * Bump the solana-ecosystem group with 2 updates Bumps the solana-ecosystem group with 2 updates: [@solana/kit](https://github.com/anza-xyz/kit) and [@solana/react](https://github.com/anza-xyz/kit). Updates `@solana/kit` from 5.0.0 to 5.1.0 - [Release notes](https://github.com/anza-xyz/kit/releases) - [Commits](https://github.com/anza-xyz/kit/compare/v5.0.0...v5.1.0) Updates `@solana/react` from 5.0.0 to 5.1.0 - [Release notes](https://github.com/anza-xyz/kit/releases) - [Commits](https://github.com/anza-xyz/kit/compare/v5.0.0...v5.1.0) --- updated-dependencies: - dependency-name: "@solana/kit" dependency-version: 5.1.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: solana-ecosystem - dependency-name: "@solana/react" dependency-version: 5.1.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: solana-ecosystem ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 645 +++++++++++++++++++++++++--------------------- package.json | 4 +- 2 files changed, 349 insertions(+), 300 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64379e9c53b..32bbcc919ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,8 +35,8 @@ "@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/kit": "^5.1.0", + "@solana/react": "^5.1.0", "@solana/wallet-adapter-base": "^0.9.27", "@solana/wallet-adapter-coinbase": "^0.1.23", "@solana/wallet-adapter-react": "^0.15.39", @@ -13103,17 +13103,17 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-5.1.0.tgz", + "integrity": "sha512-Q1KzykCrl/YjLUH2RXF8vPq65U/ehAV2SHZicPbZ0jvgQUU6X1+Eca+0ilxA9xH8srYn3YTVDyEs/LYdfbY/2A==", "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.1.0", + "@solana/codecs-core": "5.1.0", + "@solana/codecs-strings": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/rpc-spec": "5.1.0", + "@solana/rpc-types": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13123,16 +13123,16 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-5.1.0.tgz", + "integrity": "sha512-X84qSZLgve9YeYsyxGI49WnfEre53tdFu4x9/4oULBgoj8d0A+P9VGLYzmRJ0YFYKRcZG7U4u3MQpI5uLZ1AsQ==", "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.1.0", + "@solana/codecs-core": "5.1.0", + "@solana/codecs-strings": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/nominal-types": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13142,12 +13142,12 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-5.1.0.tgz", + "integrity": "sha512-5But2wyxuvGXMIOnD0jBMQ9yq1QQF2LSK3IbIRSkAkXbD3DS6O2tRvKUHNhogd+BpkPyCGOQHBycezgnxmStlg==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0" + "@solana/errors": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13169,16 +13169,16 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-5.1.0.tgz", + "integrity": "sha512-krSuf/E2Sa/4oASZ/jb/5KGUG58m1/bQdLrKvBnoAFhYj7zZf+8V4UqHGTV5n2NCQfmMyORsg9n2saKjkUzo8w==", "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.1.0", + "@solana/codecs-data-structures": "5.1.0", + "@solana/codecs-numbers": "5.1.0", + "@solana/codecs-strings": "5.1.0", + "@solana/options": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13188,12 +13188,12 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-5.1.0.tgz", + "integrity": "sha512-vDwi03mxWeWCS5Il6BCdNdifYdOoHVz97YOmbWGIt45b77Ivu5NUYeSD2+ccl6fSw8eYQ6QaqqKXMjbSfsXv4g==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0" + "@solana/errors": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13203,14 +13203,14 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-5.1.0.tgz", + "integrity": "sha512-ftAwL/jsurFrk9kFVhkTLdQ8fGZ8I0PcbVH+V1a0dIP2aKDofGePvK0XbwZE/ohizC9gEIZxyBX5IgRKk5PXyg==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.0.0", - "@solana/codecs-numbers": "5.0.0", - "@solana/errors": "5.0.0" + "@solana/codecs-core": "5.1.0", + "@solana/codecs-numbers": "5.1.0", + "@solana/errors": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13220,13 +13220,13 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-5.1.0.tgz", + "integrity": "sha512-Ea5/9yjDNOrDZcI40UGzzi6Aq1JNsmzM4m5pOk6Xb3JRZ0YdKOv/MwuCqb6jRgzZ7SQjHhkfGL43kHLJA++bOw==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.0.0", - "@solana/errors": "5.0.0" + "@solana/codecs-core": "5.1.0", + "@solana/errors": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13236,14 +13236,14 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-5.1.0.tgz", + "integrity": "sha512-014xwl5T/3VnGW0gceizF47DUs5EURRtgGmbWIR5+Z32yxgQ6hT9Zl0atZbL268RHbUQ03/J8Ush1StQgy7sfQ==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.0.0", - "@solana/codecs-numbers": "5.0.0", - "@solana/errors": "5.0.0" + "@solana/codecs-core": "5.1.0", + "@solana/codecs-numbers": "5.1.0", + "@solana/errors": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13251,16 +13251,21 @@ "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", "typescript": ">=5.3.3" + }, + "peerDependenciesMeta": { + "fastestsmallesttextencoderdecoder": { + "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-5.1.0.tgz", + "integrity": "sha512-JlTyekErWa6Fdcwu1Hrh+jZxjM4YxyorGCFDRVZlmHZFkp5N00DWKcYnSGZrTF8E6ZZEP9pfS2XwM8y7p7HPww==", "license": "MIT", "dependencies": { "chalk": "5.6.2", - "commander": "14.0.1" + "commander": "14.0.2" }, "bin": { "errors": "bin/cli.mjs" @@ -13284,10 +13289,19 @@ "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-5.1.0.tgz", + "integrity": "sha512-ACZo7cH/5EXsBmruw/0gU2/PXL2l4aET0YpL93H6QEaZwEAICFD8cLkj20nBcfLTf4srEiuKtwuSDeONTWIulw==", "license": "MIT", "engines": { "node": ">=20.18.0" @@ -13297,9 +13311,9 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-5.1.0.tgz", + "integrity": "sha512-R6jacWU0Gr+j49lTDp+FSECBolqw2Gq7JlC22rI0JkcxJiiAlp3G80v6zAYq0FkHzxZbjyR6//JYUXSwliem5g==", "license": "MIT", "engines": { "node": ">=20.18.0" @@ -13309,16 +13323,17 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/instruction-plans/-/instruction-plans-5.1.0.tgz", + "integrity": "sha512-friMgHt0z5jQlCyyTDXfwAMYjCAagI7QYR+hLWB/BmvSuRpai0ddToWbWJoqrNRM312xZ+Oy/qjC3+Ftzi0DLA==", "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.1.0", + "@solana/instructions": "5.1.0", + "@solana/keys": "5.1.0", + "@solana/promises": "5.1.0", + "@solana/transaction-messages": "5.1.0", + "@solana/transactions": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13328,13 +13343,13 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-5.1.0.tgz", + "integrity": "sha512-fkwpUwwqk5K14T/kZDnCrfeR0kww49HBx+BK8xdSeJx+bt4QTwAHa9YeOkGhGrHEFVEJEUf8FKoxxTzZzJZtKQ==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.0.0", - "@solana/errors": "5.0.0" + "@solana/codecs-core": "5.1.0", + "@solana/errors": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13344,16 +13359,16 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-5.1.0.tgz", + "integrity": "sha512-ma4zTTuSOmtTCvATHMfUGNTw0Vqah/6XPe1VmLc66ohwXMI3yqatX1FQPXgDZozr15SvLAesfs7/bgl2TRoe9w==", "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.1.0", + "@solana/codecs-core": "5.1.0", + "@solana/codecs-strings": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/nominal-types": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13363,30 +13378,31 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-5.1.0.tgz", + "integrity": "sha512-oNQRzI0+mGWmXy05psO0J7r9Boy8PF7LH5H0Y9Jxvs10AbG4oSOBtyj20EccsRrr+jkqLw42fqb/4rNuASfvsA==", + "license": "MIT", + "dependencies": { + "@solana/accounts": "5.1.0", + "@solana/addresses": "5.1.0", + "@solana/codecs": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/functional": "5.1.0", + "@solana/instruction-plans": "5.1.0", + "@solana/instructions": "5.1.0", + "@solana/keys": "5.1.0", + "@solana/offchain-messages": "5.1.0", + "@solana/programs": "5.1.0", + "@solana/rpc": "5.1.0", + "@solana/rpc-parsed-types": "5.1.0", + "@solana/rpc-spec-types": "5.1.0", + "@solana/rpc-subscriptions": "5.1.0", + "@solana/rpc-types": "5.1.0", + "@solana/signers": "5.1.0", + "@solana/sysvars": "5.1.0", + "@solana/transaction-confirmation": "5.1.0", + "@solana/transaction-messages": "5.1.0", + "@solana/transactions": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13396,9 +13412,9 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-5.1.0.tgz", + "integrity": "sha512-+4Cm+SpK+D811i9giqv4Up93ZlmUcZfLDHkSH24F4in61+Y2TKA+XKuRtKhNytQMmqCfbvJZ9MHFaIeZw5g+Bg==", "license": "MIT", "engines": { "node": ">=20.18.0" @@ -13407,17 +13423,39 @@ "typescript": ">=5.3.3" } }, + "node_modules/@solana/offchain-messages": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@solana/offchain-messages/-/offchain-messages-5.1.0.tgz", + "integrity": "sha512-6FUXjiIJprjWa7y/T4E3rUb3HKi3P5zpBweBEwDflEEJ/QlieWUw7xlGAOvZ1eF3Wi+6LfcrdtZOwIkuv6o9Sg==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "5.1.0", + "@solana/codecs-core": "5.1.0", + "@solana/codecs-data-structures": "5.1.0", + "@solana/codecs-numbers": "5.1.0", + "@solana/codecs-strings": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/keys": "5.1.0", + "@solana/nominal-types": "5.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-5.1.0.tgz", + "integrity": "sha512-PqgfALd0yhK+QFaYIbRFTV6hBpiy5xwdu07zSw1RLoNvt1sg+MRsRFDk9R8ZdEdiM69PY/cKiClVSjpNzLLcJg==", "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.1.0", + "@solana/codecs-data-structures": "5.1.0", + "@solana/codecs-numbers": "5.1.0", + "@solana/codecs-strings": "5.1.0", + "@solana/errors": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13427,13 +13465,13 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-5.1.0.tgz", + "integrity": "sha512-zAghXyRGixWNcarShlrnpjMD2115BZTF9JMLIcgkCYDOwjDPFIB/Y0hwDCH87N5uSjzlgkDpxKEL4ILewoZTRQ==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.0.0", - "@solana/errors": "5.0.0" + "@solana/addresses": "5.1.0", + "@solana/errors": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13443,9 +13481,9 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-5.1.0.tgz", + "integrity": "sha512-LU9wwS1PvGc/It610dclfq+JCuUEZSIWjvaF0+sqMP7QCk12Uz7MK2m9TtvLcjTvvKTIrucglRZP6qKroWRqGg==", "license": "MIT", "engines": { "node": ">=20.18.0" @@ -13455,18 +13493,18 @@ } }, "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==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@solana/react/-/react-5.1.0.tgz", + "integrity": "sha512-sehWHTmm4gJEeftCsVLdXk64CxoOlvuEK7Z+oq9xwxGowuJvCoY8a9uv17QZW1ELXmrSV3NZ54O3wDFDNw2VDw==", "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", + "@solana/addresses": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/keys": "5.1.0", + "@solana/promises": "5.1.0", + "@solana/signers": "5.1.0", + "@solana/transaction-messages": "5.1.0", + "@solana/transactions": "5.1.0", "@solana/wallet-standard-features": "^1.3.0", "@wallet-standard/base": "^1.1.0", "@wallet-standard/errors": "^0.1.1", @@ -13478,23 +13516,28 @@ }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-5.1.0.tgz", + "integrity": "sha512-j+ByLxFCoHWw9TnsGzkAVMFUfBDIUE53nIosJAYEsERpImD2mjwc33uDE6YXLKoaKRoYO4tc7IUzkKY1fQp/CA==", "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.1.0", + "@solana/fast-stable-stringify": "5.1.0", + "@solana/functional": "5.1.0", + "@solana/rpc-api": "5.1.0", + "@solana/rpc-spec": "5.1.0", + "@solana/rpc-spec-types": "5.1.0", + "@solana/rpc-transformers": "5.1.0", + "@solana/rpc-transport-http": "5.1.0", + "@solana/rpc-types": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13504,22 +13547,22 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-5.1.0.tgz", + "integrity": "sha512-eI1tY0i3gmih1C65gFECYbfPRpHEYqFp+9IKjpknZtYpQIe9BqBKSpfYpGiCAbKdN/TMadBNPOzdK15ewhkkvQ==", "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.1.0", + "@solana/codecs-core": "5.1.0", + "@solana/codecs-strings": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/keys": "5.1.0", + "@solana/rpc-parsed-types": "5.1.0", + "@solana/rpc-spec": "5.1.0", + "@solana/rpc-transformers": "5.1.0", + "@solana/rpc-types": "5.1.0", + "@solana/transaction-messages": "5.1.0", + "@solana/transactions": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13529,9 +13572,9 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-5.1.0.tgz", + "integrity": "sha512-ZJoXHNItALMNa1zmGrNnIh96RBlc9GpIqoaZkdE14mAQ7gWe7Oc0ejYavUeSCmcL0wZcvIFh50AsfVxrHr4+2Q==", "license": "MIT", "engines": { "node": ">=20.18.0" @@ -13541,13 +13584,13 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-5.1.0.tgz", + "integrity": "sha512-y8B6fUWA1EBKXUsNo6b9EiFcQPsaJREPLlcIDbo4b6TucQNwvl7FHfpf1VHJL64SkI/WE69i2WEkiOJYjmLO0A==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0", - "@solana/rpc-spec-types": "5.0.0" + "@solana/errors": "5.1.0", + "@solana/rpc-spec-types": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13557,9 +13600,9 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-5.1.0.tgz", + "integrity": "sha512-B8/WyjmHpC34vXtAmTpZyPwRCm7WwoSkmjBcBouaaY1uilJ9+Wp2nptbq2cJyWairOoMSoI7v5kvvnrJuquq4Q==", "license": "MIT", "engines": { "node": ">=20.18.0" @@ -13569,22 +13612,22 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-5.1.0.tgz", + "integrity": "sha512-u/mafVzBbdqvYDD7x/98T5/5xk4Bl2C/90TaHiKx7FmutVC/H4QsritPTY0v9JG1dOVWbgIfUgfZ0C0DPkiYnA==", "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.1.0", + "@solana/fast-stable-stringify": "5.1.0", + "@solana/functional": "5.1.0", + "@solana/promises": "5.1.0", + "@solana/rpc-spec-types": "5.1.0", + "@solana/rpc-subscriptions-api": "5.1.0", + "@solana/rpc-subscriptions-channel-websocket": "5.1.0", + "@solana/rpc-subscriptions-spec": "5.1.0", + "@solana/rpc-transformers": "5.1.0", + "@solana/rpc-types": "5.1.0", + "@solana/subscribable": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13594,18 +13637,18 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-5.1.0.tgz", + "integrity": "sha512-84e2AsgqAGiVloW3G4RzpHPkInknu3rEuFPut2/69eq3Ab97TiTz2s5kc9gJpprtGM+xbgnIfeuGqr5F+2bXQA==", "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.1.0", + "@solana/keys": "5.1.0", + "@solana/rpc-subscriptions-spec": "5.1.0", + "@solana/rpc-transformers": "5.1.0", + "@solana/rpc-types": "5.1.0", + "@solana/transaction-messages": "5.1.0", + "@solana/transactions": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13615,15 +13658,15 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-5.1.0.tgz", + "integrity": "sha512-FzAEmHzXtlckNn7T/1dzDS7r5HmekYPstrtZKjDcVxuGMVBUkZTnb69t7EJvKNuKw1wYZEUd0EEegtC2K/9dZA==", "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.1.0", + "@solana/functional": "5.1.0", + "@solana/rpc-subscriptions-spec": "5.1.0", + "@solana/subscribable": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13631,18 +13674,23 @@ "peerDependencies": { "typescript": ">=5.3.3", "ws": "^8.18.0" + }, + "peerDependenciesMeta": { + "ws": { + "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-5.1.0.tgz", + "integrity": "sha512-ORfjKtainnYisql6z4YsXByVwY8/rWsedVWn5oe/V7Og9LyetTM7hwJ8FbUdRDZwyLlUrI0cEE1aG+3ma/8tPw==", "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.1.0", + "@solana/promises": "5.1.0", + "@solana/rpc-spec-types": "5.1.0", + "@solana/subscribable": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13652,16 +13700,16 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-5.1.0.tgz", + "integrity": "sha512-6v93xi/ewGS/xEiSktNQ0bh0Uiv1/q9nR5oiFMn3BiAJRC+FdMRMxCjp6H+/Tua7wdhpClaPKrZYBQHoIp59tw==", "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.1.0", + "@solana/functional": "5.1.0", + "@solana/nominal-types": "5.1.0", + "@solana/rpc-spec-types": "5.1.0", + "@solana/rpc-types": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13671,14 +13719,14 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-5.1.0.tgz", + "integrity": "sha512-XoGX+2n/iXzoGb3Xrltbx8avnzp15vCfCGXuZpQWFL+xUg3P4CGl217XyDGjS5VxuUml+f/30xzWl18RaAIEcw==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0", - "@solana/rpc-spec": "5.0.0", - "@solana/rpc-spec-types": "5.0.0", + "@solana/errors": "5.1.0", + "@solana/rpc-spec": "5.1.0", + "@solana/rpc-spec-types": "5.1.0", "undici-types": "^7.16.0" }, "engines": { @@ -13689,17 +13737,17 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-5.1.0.tgz", + "integrity": "sha512-Rnpt5BuHQvnULPNXUC/yRqB+7iPbon95CSCeyRvPj5tJ4fx2JibvX3s/UEoud5vC+kRjPi/R0BGJ8XFvd3eDWg==", "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.1.0", + "@solana/codecs-core": "5.1.0", + "@solana/codecs-numbers": "5.1.0", + "@solana/codecs-strings": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/nominal-types": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13709,19 +13757,20 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-5.1.0.tgz", + "integrity": "sha512-B8xO0SGN1ZWYfJROL+da3id279qNbXbXoqud+AuT5gur51RrS4YhNkTQ6khVbGtAOpPMAhkoZN0jnfCC1r33jQ==", "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.1.0", + "@solana/codecs-core": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/instructions": "5.1.0", + "@solana/keys": "5.1.0", + "@solana/nominal-types": "5.1.0", + "@solana/offchain-messages": "5.1.0", + "@solana/transaction-messages": "5.1.0", + "@solana/transactions": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13731,12 +13780,12 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-5.1.0.tgz", + "integrity": "sha512-OeW5AJwKzHh18+PIPtghuuPJTmEep2Mhb3Lsrq4alas4fibmMGkr39z1HXxVF6l6e2lu/YGhHIDtuhouWmY7ow==", "license": "MIT", "dependencies": { - "@solana/errors": "5.0.0" + "@solana/errors": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13746,15 +13795,15 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-5.1.0.tgz", + "integrity": "sha512-FJ9YIsLTAaajnOrYEYn54znstXJsvKndRhyCrlyiAEN1IXHw5HtZHploLF3ZZ78b7YU3uv3tFJMziXFBwPOn4Q==", "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.1.0", + "@solana/codecs": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/rpc-types": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13764,21 +13813,21 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-5.1.0.tgz", + "integrity": "sha512-6HnL0uH8tWZXJVuaoeTbCQp/FS11Bsc4GSlq+k0N21GdhTbFuqBhsxlAYWbzPWs9+/kYRGHqqXvBPCReWxT7BA==", "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.1.0", + "@solana/codecs-strings": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/keys": "5.1.0", + "@solana/promises": "5.1.0", + "@solana/rpc": "5.1.0", + "@solana/rpc-subscriptions": "5.1.0", + "@solana/rpc-types": "5.1.0", + "@solana/transaction-messages": "5.1.0", + "@solana/transactions": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13788,20 +13837,20 @@ } }, "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.1.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-5.1.0.tgz", + "integrity": "sha512-9rNV2YJhd85WIMvnwa/vUY4xUw3ZTU17jP1KDo/fFZWk55a0ov0ATJJPyC5HAR1i6hT1cmJzGH/UHhnD9m/Q3w==", "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.1.0", + "@solana/codecs-core": "5.1.0", + "@solana/codecs-data-structures": "5.1.0", + "@solana/codecs-numbers": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/functional": "5.1.0", + "@solana/instructions": "5.1.0", + "@solana/nominal-types": "5.1.0", + "@solana/rpc-types": "5.1.0" }, "engines": { "node": ">=20.18.0" @@ -13811,23 +13860,23 @@ } }, "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==", - "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" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-5.1.0.tgz", + "integrity": "sha512-06JwSPtz+38ozNgpysAXS2eTMPQCufIisXB6K88X8J4GF8ziqs4nkq0BpXAXn+MpZTkuMt+JeW2RxP3HKhXe5g==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "5.1.0", + "@solana/codecs-core": "5.1.0", + "@solana/codecs-data-structures": "5.1.0", + "@solana/codecs-numbers": "5.1.0", + "@solana/codecs-strings": "5.1.0", + "@solana/errors": "5.1.0", + "@solana/functional": "5.1.0", + "@solana/instructions": "5.1.0", + "@solana/keys": "5.1.0", + "@solana/nominal-types": "5.1.0", + "@solana/rpc-types": "5.1.0", + "@solana/transaction-messages": "5.1.0" }, "engines": { "node": ">=20.18.0" diff --git a/package.json b/package.json index 545c10cf254..a7010209d24 100644 --- a/package.json +++ b/package.json @@ -80,8 +80,8 @@ "@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/kit": "^5.1.0", + "@solana/react": "^5.1.0", "@solana/wallet-adapter-base": "^0.9.27", "@solana/wallet-adapter-coinbase": "^0.1.23", "@solana/wallet-adapter-react": "^0.15.39", From 4a0d83e50ff1d8607c1f0e89dddd9a691836eb01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 12:37:53 +0000 Subject: [PATCH 059/214] Bump react-instantsearch from 7.20.1 to 7.21.0 in the documentation group (#3293) * Bump react-instantsearch in the documentation group Bumps the documentation group with 1 update: [react-instantsearch](https://github.com/algolia/instantsearch). Updates `react-instantsearch` from 7.20.1 to 7.21.0 - [Release notes](https://github.com/algolia/instantsearch/releases) - [Commits](https://github.com/algolia/instantsearch/compare/react-instantsearch@7.20.1...react-instantsearch@7.21.0) --- updated-dependencies: - dependency-name: react-instantsearch dependency-version: 7.21.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: documentation ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 60 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 32bbcc919ca..b9e36f222e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ "nanostores": "^0.11.4", "pino": "^9.14.0", "preact": "^10.28.0", - "react-instantsearch": "^7.20.1", + "react-instantsearch": "^7.21.0", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "rehype-wrap-all": "^1.1.0", @@ -142,13 +142,13 @@ "license": "MIT" }, "node_modules/@ai-sdk/gateway": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.18.tgz", - "integrity": "sha512-sDQcW+6ck2m0pTIHW6BPHD7S125WD3qNkx/B8sEzJp/hurocmJ5Cni0ybExg6sQMGo+fr/GWOwpHF1cmCdg5rQ==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.21.tgz", + "integrity": "sha512-BwV7DU/lAm3Xn6iyyvZdWgVxgLu3SNXzl5y57gMvkW4nGhAOV5269IrJzQwGt03bb107sa6H6uJwWxc77zXoGA==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.18", + "@ai-sdk/provider-utils": "3.0.19", "@vercel/oidc": "3.0.5" }, "engines": { @@ -180,9 +180,9 @@ } }, "node_modules/@ai-sdk/provider-utils": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", - "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", + "version": "3.0.19", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.19.tgz", + "integrity": "sha512-W41Wc9/jbUVXVwCN/7bWa4IKe8MtxO3EyA0Hfhx6grnmiYlCvpI8neSYWFE0zScXJkgA/YK3BRybzgyiXuu6JA==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.0", @@ -16469,14 +16469,14 @@ } }, "node_modules/ai": { - "version": "5.0.108", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.108.tgz", - "integrity": "sha512-Jex3Lb7V41NNpuqJHKgrwoU6BCLHdI1Pg4qb4GJH4jRIDRXUBySJErHjyN4oTCwbiYCeb/8II9EnqSRPq9EifA==", + "version": "5.0.113", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.113.tgz", + "integrity": "sha512-26vivpSO/mzZj0k1Si2IpsFspp26ttQICHRySQiMrtWcRd5mnJMX2a8sG28vmZ38C+JUn1cWmfZrsLMxkSMw9g==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/gateway": "2.0.18", + "@ai-sdk/gateway": "2.0.21", "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.18", + "@ai-sdk/provider-utils": "3.0.19", "@opentelemetry/api": "1.9.0" }, "engines": { @@ -22869,9 +22869,9 @@ "license": "MIT" }, "node_modules/instantsearch-ui-components": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/instantsearch-ui-components/-/instantsearch-ui-components-0.15.1.tgz", - "integrity": "sha512-IpBtPYt4HHAd8lCPziMIqfvcAIeSQD8teZxhGfzCj6520GHwucYr37fMWjUPlLs/bygS+2a6zwQf3amfeekaag==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/instantsearch-ui-components/-/instantsearch-ui-components-0.15.2.tgz", + "integrity": "sha512-DgNdAqATp/ohcCWAs1tp5yZ7ojeagW7hnojuvbWXDkPoOGxLC70wFRYS5jm/nv0evVrkepVbOWYFr3iVFGY8Eg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", @@ -22891,9 +22891,9 @@ } }, "node_modules/instantsearch.js": { - "version": "4.85.0", - "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.85.0.tgz", - "integrity": "sha512-46WIVx5A6nFnRKpGiXidJS7NUFbB6TFK21h9z7sRu9YltnZw/RsUwtHwb/TVzAUnSgjqACM4pRAgqNvidGvydg==", + "version": "4.85.2", + "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.85.2.tgz", + "integrity": "sha512-GNrsiD7JRaXOBQ+fT0zPjBKk9hJaZMe1Cr80ZcW+ZgRcGCZF+DRT/DStDcVqc3BrWnOzbebS/d+Ffle4gZ3gNQ==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1", @@ -22905,7 +22905,7 @@ "algoliasearch-helper": "3.26.1", "hogan.js": "^3.0.2", "htm": "^3.0.0", - "instantsearch-ui-components": "0.15.1", + "instantsearch-ui-components": "0.15.2", "preact": "^10.10.0", "qs": "^6.5.1 < 6.10", "react": ">= 0.14.0", @@ -32047,15 +32047,15 @@ } }, "node_modules/react-instantsearch": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/react-instantsearch/-/react-instantsearch-7.20.1.tgz", - "integrity": "sha512-AiK7cyNhAdsduDnmiKa/16dTbC7aJGG86CLF/A7Nj+hiNFDm0ELUxu120cfeHOPw8WZFKkTUmnI6Og0x4S56yg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/react-instantsearch/-/react-instantsearch-7.21.0.tgz", + "integrity": "sha512-GnUgxqXfTU9/0+ZAnmnCME4zJm2k/xNWwUhp+gvTiMVtDzK/d7VkajvPvggNjZ+XbZBvI4rQBTx/9RWo253w0Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", - "instantsearch-ui-components": "0.15.1", - "instantsearch.js": "4.85.0", - "react-instantsearch-core": "7.20.1" + "instantsearch-ui-components": "0.15.2", + "instantsearch.js": "4.85.2", + "react-instantsearch-core": "7.21.0" }, "peerDependencies": { "algoliasearch": ">= 3.1 < 6", @@ -32064,15 +32064,15 @@ } }, "node_modules/react-instantsearch-core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-7.20.1.tgz", - "integrity": "sha512-GMC/F2RldOKyiWP5Sie00W+eC8lvE/CiNZ0tYJoChr9vbSzzpA88zhRl+j9LTnMMsaq4vM13/R/1ENA7/AXgdQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-7.21.0.tgz", + "integrity": "sha512-1IXRoyYxiIHhNQZC3U0I7YEs6zlG5NmlrBeU1t2b1Nce2BiYZmFBShVeGyGRA0Zw52j9bv5Gy84jmg/VffmxCg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", "ai": "^5.0.18", "algoliasearch-helper": "3.26.1", - "instantsearch.js": "4.85.0", + "instantsearch.js": "4.85.2", "use-sync-external-store": "^1.0.0", "zod": "^3.25.76 || ^4", "zod-to-json-schema": "3.24.6" diff --git a/package.json b/package.json index a7010209d24..e6c6d5d2057 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "nanostores": "^0.11.4", "pino": "^9.14.0", "preact": "^10.28.0", - "react-instantsearch": "^7.20.1", + "react-instantsearch": "^7.21.0", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "rehype-wrap-all": "^1.1.0", From 58f24a8273a0a04782af757750c4a5d3a5dc9b28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 13:52:31 +0100 Subject: [PATCH 060/214] Bump @types/node from 20.19.25 to 20.19.27 in the typescript group (#3292) * Bump @types/node from 20.19.25 to 20.19.27 in the typescript group Bumps the typescript group with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node). Updates `@types/node` from 20.19.25 to 20.19.27 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 20.19.27 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: typescript ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b9e36f222e8..3b9a038f75f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,7 +74,7 @@ "@rollup/plugin-yaml": "^4.1.2", "@types/jest": "^29.5.14", "@types/lodash": "^4.17.21", - "@types/node": "^20.19.25", + "@types/node": "^20.19.27", "@types/node-fetch": "^2.6.13", "@types/prismjs": "^1.26.5", "@types/react": "^19.2.7", @@ -15290,9 +15290,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.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", + "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" diff --git a/package.json b/package.json index e6c6d5d2057..7eee20c797a 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "@rollup/plugin-yaml": "^4.1.2", "@types/jest": "^29.5.14", "@types/lodash": "^4.17.21", - "@types/node": "^20.19.25", + "@types/node": "^20.19.27", "@types/node-fetch": "^2.6.13", "@types/prismjs": "^1.26.5", "@types/react": "^19.2.7", From d94f68f3f31c556426d2d68e0db722b0cfc70260 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 13:06:29 +0000 Subject: [PATCH 061/214] Bump knip from 5.72.0 to 5.73.4 in the linting-tools group (#3291) * Bump knip from 5.72.0 to 5.73.4 in the linting-tools group Bumps the linting-tools group with 1 update: [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip). Updates `knip` from 5.72.0 to 5.73.4 - [Release notes](https://github.com/webpro-nl/knip/releases) - [Commits](https://github.com/webpro-nl/knip/commits/5.73.4/packages/knip) --- updated-dependencies: - dependency-name: knip dependency-version: 5.73.4 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: linting-tools ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3b9a038f75f..9f3a0a65a87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,7 +92,7 @@ "eslint-plugin-promise": "^6.1.1", "husky": "^9.1.7", "jest-yaml-transform": "^0.2.0", - "knip": "^5.72.0", + "knip": "^5.73.4", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", "pino-pretty": "^13.1.3", @@ -27237,9 +27237,9 @@ } }, "node_modules/knip": { - "version": "5.72.0", - "resolved": "https://registry.npmjs.org/knip/-/knip-5.72.0.tgz", - "integrity": "sha512-rlyoXI8FcggNtM/QXd/GW0sbsYvNuA/zPXt7bsuVi6kVQogY2PDCr81bPpzNnl0CP8AkFm2Z2plVeL5QQSis2w==", + "version": "5.73.4", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.73.4.tgz", + "integrity": "sha512-q0DDgqsRMa4z2IMEPEblns0igitG8Fu7exkvEgQx1QMLKEqSvcvKP9fMk+C1Ehy+Ux6oayl6zfAEGt6DvFtidw==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index 7eee20c797a..f71237066da 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "eslint-plugin-promise": "^6.1.1", "husky": "^9.1.7", "jest-yaml-transform": "^0.2.0", - "knip": "^5.72.0", + "knip": "^5.73.4", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", "pino-pretty": "^13.1.3", From 64714969bcc7fb51fba37a085828fe7d45872401 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 14:01:36 +0000 Subject: [PATCH 062/214] Bump the ui-frameworks group with 2 updates (#3290) * Bump the ui-frameworks group with 2 updates Bumps the ui-frameworks group with 2 updates: [swagger-ui-dist](https://github.com/swagger-api/swagger-ui) and [swagger-ui-react](https://github.com/swagger-api/swagger-ui). Updates `swagger-ui-dist` from 5.30.3 to 5.31.0 - [Release notes](https://github.com/swagger-api/swagger-ui/releases) - [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.30.3...v5.31.0) Updates `swagger-ui-react` from 5.30.3 to 5.31.0 - [Release notes](https://github.com/swagger-api/swagger-ui/releases) - [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.30.3...v5.31.0) --- updated-dependencies: - dependency-name: swagger-ui-dist dependency-version: 5.31.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: ui-frameworks - dependency-name: swagger-ui-react dependency-version: 5.31.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: ui-frameworks ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 16 ++++++++-------- package.json | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9f3a0a65a87..6eaa6997af2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,8 +62,8 @@ "rehype-slug": "^6.0.0", "rehype-wrap-all": "^1.1.0", "remark-directive": "^3.0.1", - "swagger-ui-dist": "^5.30.3", - "swagger-ui-react": "^5.30.3", + "swagger-ui-dist": "^5.31.0", + "swagger-ui-react": "^5.31.0", "tweetnacl": "^1.0.3", "uuid": "^11.1.0" }, @@ -34859,18 +34859,18 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.30.3", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.30.3.tgz", - "integrity": "sha512-giQl7/ToPxCqnUAx2wpnSnDNGZtGzw1LyUw6ZitIpTmdrvpxKFY/94v1hihm0zYNpgp1/VY0jTDk//R0BBgnRQ==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.31.0.tgz", + "integrity": "sha512-zSUTIck02fSga6rc0RZP3b7J7wgHXwLea8ZjgLA3Vgnb8QeOl3Wou2/j5QkzSGeoz6HusP/coYuJl33aQxQZpg==", "license": "Apache-2.0", "dependencies": { "@scarf/scarf": "=1.4.0" } }, "node_modules/swagger-ui-react": { - "version": "5.30.3", - "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-5.30.3.tgz", - "integrity": "sha512-QIy32nPql6yiV2NVwbww1P7f6HEOAuYrnk8VEJkzPC/p6Xc5Xnz9hhmSHzXTuM70fDbVw/qPzCJ0mZMMultpiw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-5.31.0.tgz", + "integrity": "sha512-E/sTgKADThzpVksaGXbhED0pQCYdajiBNOzvSAan+RhV7pdoi2qvdwWhZsIo8nRvHk9UXJ0nkuxrud854ICr7A==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.27.1", diff --git a/package.json b/package.json index f71237066da..ad0e3c6c0a5 100644 --- a/package.json +++ b/package.json @@ -107,8 +107,8 @@ "rehype-slug": "^6.0.0", "rehype-wrap-all": "^1.1.0", "remark-directive": "^3.0.1", - "swagger-ui-dist": "^5.30.3", - "swagger-ui-react": "^5.30.3", + "swagger-ui-dist": "^5.31.0", + "swagger-ui-react": "^5.31.0", "tweetnacl": "^1.0.3", "uuid": "^11.1.0" }, From 08d5c1293ff6a7ec5085fe8c6f39dc23d8ce71ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 14:18:07 +0000 Subject: [PATCH 063/214] Bump the astro-framework group with 2 updates (#3289) * Bump the astro-framework group with 2 updates Bumps the astro-framework group with 2 updates: [@astrojs/mdx](https://github.com/withastro/astro/tree/HEAD/packages/integrations/mdx) and [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro). Updates `@astrojs/mdx` from 4.3.12 to 4.3.13 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/mdx/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/@astrojs/mdx@4.3.13/packages/integrations/mdx) Updates `astro` from 5.16.4 to 5.16.5 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/astro@5.16.5/packages/astro) --- updated-dependencies: - dependency-name: "@astrojs/mdx" dependency-version: 4.3.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: astro-framework - dependency-name: astro dependency-version: 5.16.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: astro-framework ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 104 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6eaa6997af2..a8890626e2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@11ty/eleventy-fetch": "^4.0.1", "@astro-community/astro-embed-youtube": "^0.5.9", - "@astrojs/mdx": "^4.3.12", + "@astrojs/mdx": "^4.3.13", "@astrojs/partytown": "^2.1.4", "@astrojs/preact": "^4.1.3", "@astrojs/prism": "^3.3.0", @@ -44,7 +44,7 @@ "@solana/wallet-adapter-solflare": "^0.6.32", "@solana/wallet-adapter-trust": "^0.1.17", "@supabase/supabase-js": "^2.87.1", - "astro": "^5.16.4", + "astro": "^5.16.5", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", "clipboard": "^2.0.11", @@ -523,9 +523,9 @@ "license": "MIT" }, "node_modules/@astrojs/markdown-remark": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.9.tgz", - "integrity": "sha512-hX2cLC/KW74Io1zIbn92kI482j9J7LleBLGCVU9EP3BeH5MVrnFawOnqD0t/q6D1Z+ZNeQG2gNKMslCcO36wng==", + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.10.tgz", + "integrity": "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==", "license": "MIT", "dependencies": { "@astrojs/internal-helpers": "0.7.5", @@ -534,7 +534,7 @@ "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", @@ -542,8 +542,8 @@ "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", - "shiki": "^3.13.0", - "smol-toml": "^1.4.2", + "shiki": "^3.19.0", + "smol-toml": "^1.5.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", @@ -552,12 +552,12 @@ } }, "node_modules/@astrojs/mdx": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.12.tgz", - "integrity": "sha512-pL3CVPtuQrPnDhWjy7zqbOibNyPaxP4VpQS8T8spwKqKzauJ4yoKyNkVTD8jrP7EAJHmBhZ7PTmUGZqOpKKp8g==", + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.13.tgz", + "integrity": "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==", "license": "MIT", "dependencies": { - "@astrojs/markdown-remark": "6.3.9", + "@astrojs/markdown-remark": "6.3.10", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.15.0", "es-module-lexer": "^1.7.0", @@ -11226,60 +11226,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.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.20.0.tgz", + "integrity": "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.15.0", + "@shikijs/types": "3.20.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.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.20.0.tgz", + "integrity": "sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.15.0", + "@shikijs/types": "3.20.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.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.20.0.tgz", + "integrity": "sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.15.0", + "@shikijs/types": "3.20.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.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.20.0.tgz", + "integrity": "sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.15.0" + "@shikijs/types": "3.20.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.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.20.0.tgz", + "integrity": "sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.15.0" + "@shikijs/types": "3.20.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.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.20.0.tgz", + "integrity": "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", @@ -16927,14 +16927,14 @@ } }, "node_modules/astro": { - "version": "5.16.4", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.4.tgz", - "integrity": "sha512-rgXI/8/tnO3Y9tfAaUyg/8beKhlIMltbiC8Q6jCoAfEidOyaue4KYKzbe0gJIb6qEdEaG3Kf3BY3EOSLkbWOLg==", + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.5.tgz", + "integrity": "sha512-QeuM4xzTR0QuXFDNlGVW0BW7rcquKFIkylaPeM4ufii0/RRiPTYtwxDYVZ3KfiMRuuc+nbLD0214kMKTvz/yvQ==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", - "@astrojs/markdown-remark": "6.3.9", + "@astrojs/markdown-remark": "6.3.10", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^3.0.1", "@oslojs/encoding": "^1.1.0", @@ -32560,9 +32560,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" @@ -33877,17 +33877,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.20.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.20.0.tgz", + "integrity": "sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg==", "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.20.0", + "@shikijs/engine-javascript": "3.20.0", + "@shikijs/engine-oniguruma": "3.20.0", + "@shikijs/langs": "3.20.0", + "@shikijs/themes": "3.20.0", + "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } diff --git a/package.json b/package.json index ad0e3c6c0a5..34ea6359dd6 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "dependencies": { "@11ty/eleventy-fetch": "^4.0.1", "@astro-community/astro-embed-youtube": "^0.5.9", - "@astrojs/mdx": "^4.3.12", + "@astrojs/mdx": "^4.3.13", "@astrojs/partytown": "^2.1.4", "@astrojs/preact": "^4.1.3", "@astrojs/prism": "^3.3.0", @@ -89,7 +89,7 @@ "@solana/wallet-adapter-solflare": "^0.6.32", "@solana/wallet-adapter-trust": "^0.1.17", "@supabase/supabase-js": "^2.87.1", - "astro": "^5.16.4", + "astro": "^5.16.5", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", "clipboard": "^2.0.11", From 16095ac8461d527f06ee79d8ea03fb85f9f46d3e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 14:40:51 +0000 Subject: [PATCH 064/214] Changelog Update: New data found (#3285) * Data: Update changelog for new data items * fix feeds --------- Co-authored-by: khadni <98668332+khadni@users.noreply.github.com> --- .github/scripts/data/baseline.json | 30 ++++- public/changelog.json | 199 +++++++++++++++++++++++++++++ 2 files changed, 228 insertions(+), 1 deletion(-) diff --git a/.github/scripts/data/baseline.json b/.github/scripts/data/baseline.json index ee0c0471581..7dd097a06e3 100644 --- a/.github/scripts/data/baseline.json +++ b/.github/scripts/data/baseline.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-07T21:03:36Z", + "timestamp": "2025-12-14T21:03:22Z", "knownIds": [ "aptos-apt-usd", "aptos-btc-usd", @@ -59,6 +59,7 @@ "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", @@ -112,6 +113,7 @@ "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", @@ -158,6 +160,7 @@ "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", @@ -189,6 +192,7 @@ "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", @@ -196,6 +200,7 @@ "arbitrum-eur-usd-refprice-timestamped-mainnet-production", "arbitrum-eur-usd-rwa-prod-v04", "arbitrum-eurc-usd", + "arbitrum-eurc-usd-shared-svr", "arbitrum-eurc-usd-svr", "arbitrum-eusx-usx-streams-exchangerate-mainnet-production", "arbitrum-ewj-usd-streams-equityprice-timestamped-mainnet-production", @@ -218,6 +223,7 @@ "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", @@ -330,6 +336,7 @@ "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-lly-usd-streams-equityprice-timestamped-mainnet-production", @@ -342,6 +349,7 @@ "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", @@ -609,6 +617,7 @@ "arbitrum-usds-usd-refprice-mainnet-production", "arbitrum-usdt-usd", "arbitrum-usdt-usd-premium-prod", + "arbitrum-usdt-usd-shared-svr", "arbitrum-usdt-usd-svr", "arbitrum-usol-usd-streams-cexprice-mainnet-production", "arbitrum-usr-usd", @@ -837,6 +846,7 @@ "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", @@ -923,6 +933,7 @@ "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", @@ -931,6 +942,7 @@ "base-wrseth-eth-exchange-rate", "base-wsteth-eth", "base-wsteth-steth exchangerate", + "base-wsteth-steth-exchange-rate-svr", "base-wstusr-stusr-exchange-rate", "base-xau-usd", "base-xrp-usd", @@ -1061,6 +1073,7 @@ "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-tsla-usd", @@ -1077,6 +1090,7 @@ "bnb-chain-usde-usd", "bnb-chain-usdt-bnb", "bnb-chain-usdt-usd", + "bnb-chain-usdu-por", "bnb-chain-usr-usd", "bnb-chain-vet-usd", "bnb-chain-weeth-eeth-exchange-rate", @@ -1312,6 +1326,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", @@ -1482,6 +1498,7 @@ "hyperevm-behype-hype-exchange-rate", "hyperevm-btc-usd", "hyperevm-eth-usd", + "hyperevm-feusd-usd", "hyperevm-hype-usd", "hyperevm-hyped-hype-exchange-rate", "hyperevm-khype-hype-exchange-rate", @@ -1582,6 +1599,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", @@ -1616,6 +1634,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", @@ -1646,11 +1665,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", @@ -1726,10 +1747,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", @@ -2038,6 +2061,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", @@ -2045,9 +2070,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", @@ -2115,6 +2142,7 @@ "sonic-ybtc-btc", "sonic-yeth-eth", "sonic-yusd-usd-exchange-rate", + "sonic-zar-usd", "starknet-btc-usd", "starknet-dai-usd", "starknet-eth-usd", diff --git a/public/changelog.json b/public/changelog.json index ffe028d9326..82e099a1b9d 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -433,6 +433,205 @@ "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", From 65f7a66f8c265cd601c39a7de949148381d6e51b Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Mon, 15 Dec 2025 12:52:28 -0600 Subject: [PATCH 065/214] 40X fix links (#3297) * fix links * fix links * fix links --- reports/llms-report.json | 26 ++++++++--------- src/components/Footer/Footer.astro | 3 -- src/content/cre/llms-full-ts.txt | 7 ----- .../sdk/triggers/evm-log-trigger-ts.mdx | 7 ----- src/content/data-feeds/l2-sequencer-feeds.mdx | 2 +- src/content/data-feeds/llms-full.txt | 4 +-- src/content/data-feeds/svr-feeds/index.mdx | 2 +- .../resources/contributing-to-chainlink.mdx | 6 ---- src/content/resources/hackathon-resources.mdx | 2 +- .../resources/link-token-contracts.mdx | 20 ++++++------- src/content/resources/llms-full.txt | 28 ++++++------------- src/content/vrf/llms-full.txt | 2 +- .../direct-funding/examples/test-locally.mdx | 2 +- .../feeds/data/StreamsNetworksData.ts | 4 +-- 14 files changed, 39 insertions(+), 76 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index 6a281009ee9..43a47dd587b 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,5 +1,5 @@ { - "startedAt": "2025-12-12T21:54:23.121Z", + "startedAt": "2025-12-15T18:30:25.869Z", "siteBase": "https://docs.chain.link", "sections": [ { @@ -14,17 +14,17 @@ "section": "cre-ts", "pagesProcessed": 79, "outputPath": "src/content/cre/llms-full-ts.txt", - "bytes": 629623, - "prevBytes": 629623, + "bytes": 629202, + "prevBytes": 629202, "deltaBytes": 0 }, { "section": "vrf", "pagesProcessed": 35, "outputPath": "src/content/vrf/llms-full.txt", - "bytes": 301012, + "bytes": 301005, "prevBytes": 301012, - "deltaBytes": 0 + "deltaBytes": -7 }, { "section": "ccip", @@ -38,9 +38,9 @@ "section": "data-feeds", "pagesProcessed": 37, "outputPath": "src/content/data-feeds/llms-full.txt", - "bytes": 302816, + "bytes": 302811, "prevBytes": 302816, - "deltaBytes": 0 + "deltaBytes": -5 }, { "section": "data-streams", @@ -79,16 +79,16 @@ "pagesProcessed": 25, "outputPath": "src/content/chainlink-automation/llms-full.txt", "bytes": 197667, - "prevBytes": 196013, - "deltaBytes": 1654 + "prevBytes": 197667, + "deltaBytes": 0 }, { "section": "resources", "pagesProcessed": 12, "outputPath": "src/content/resources/llms-full.txt", - "bytes": 341272, - "prevBytes": 341272, - "deltaBytes": 0 + "bytes": 340405, + "prevBytes": 340412, + "deltaBytes": -7 }, { "section": "architecture-overview", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-12T21:54:26.892Z" + "finishedAt": "2025-12-15T18:30:30.307Z" } diff --git a/src/components/Footer/Footer.astro b/src/components/Footer/Footer.astro index 7f8a2078d1a..e78527acbe0 100644 --- a/src/components/Footer/Footer.astro +++ b/src/components/Footer/Footer.astro @@ -59,9 +59,6 @@ <li class="footer-list-item"> <a href="https://chain.link/community" class="footer-list-item-link"> Community overview</a> </li> - <li class="footer-list-item"> - <a href="https://chain.link/community/grants" class="footer-list-item-link"> Grant program</a> - </li> <li class="footer-list-item"> <a href="https://chain.link/community/events" class="footer-list-item-link"> Events</a> </li> diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index eb14e7b6ca8..17a26472a84 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -14491,13 +14491,6 @@ const onLogTrigger = (runtime: Runtime<Config>, log: EVMLog): string => { } ``` -<Aside type="note" title="Using contract ABIs"> - For type-safe event handling, organize your contract ABIs in separate TypeScript files (e.g., - `contracts/abi/MyContract.ts`) as demonstrated in the [demo - workflow](https://github.com/smartcontractkit/cre-cli/tree/main/examples/proof-of-reserve). Define ABIs as `const` - arrays with full JSON ABI structures for optimal TypeScript type inference with viem. -</Aside> - --- # SDK Reference: HTTP Trigger diff --git a/src/content/cre/reference/sdk/triggers/evm-log-trigger-ts.mdx b/src/content/cre/reference/sdk/triggers/evm-log-trigger-ts.mdx index 6464c1fba1f..65475254a44 100644 --- a/src/content/cre/reference/sdk/triggers/evm-log-trigger-ts.mdx +++ b/src/content/cre/reference/sdk/triggers/evm-log-trigger-ts.mdx @@ -274,10 +274,3 @@ const onLogTrigger = (runtime: Runtime<Config>, log: EVMLog): string => { return "Log decoded" } ``` - -<Aside type="note" title="Using contract ABIs"> - For type-safe event handling, organize your contract ABIs in separate TypeScript files (e.g., - `contracts/abi/MyContract.ts`) as demonstrated in the [demo - workflow](https://github.com/smartcontractkit/cre-cli/tree/main/examples/proof-of-reserve). Define ABIs as `const` - arrays with full JSON ABI structures for optimal TypeScript type inference with viem. -</Aside> diff --git a/src/content/data-feeds/l2-sequencer-feeds.mdx b/src/content/data-feeds/l2-sequencer-feeds.mdx index b3d623b4c5a..623dfcaaea5 100644 --- a/src/content/data-feeds/l2-sequencer-feeds.mdx +++ b/src/content/data-feeds/l2-sequencer-feeds.mdx @@ -92,7 +92,7 @@ The diagram below shows how these feeds update and how a consumer retrieves the <ClickToZoom src="/images/data-feed/l2-diagram-arbitrum.webp" /> 1. Chainlink nodes trigger an OCR round every 30s and update the sequencer status by calling the `validate` function in the [`ArbitrumValidator` contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/l2ep/dev/arbitrum/ArbitrumValidator.sol) by calling it through the [`ValidatorProxy` contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.0.0/contracts/src/v0.8/ValidatorProxy.sol). -1. The `ArbitrumValidator` checks to see if the latest update is different from the previous update. If it detects a difference, it places a message in the [Arbitrum inbox contract](https://developer.offchainlabs.com/docs/inside_arbitrum#the-big-picture). +1. The `ArbitrumValidator` checks to see if the latest update is different from the previous update. If it detects a difference, it places a message in the [Arbitrum inbox contract](https://docs.arbitrum.io/how-arbitrum-works/inside-arbitrum-nitro). 1. The inbox contract sends the message to the [`ArbitrumSequencerUptimeFeed` contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/l2ep/dev/arbitrum/ArbitrumSequencerUptimeFeed.sol). The message calls the `updateStatus` function in the `ArbitrumSequencerUptimeFeed` contract and updates the latest sequencer status to 0 if the sequencer is up and 1 if it is down. It also records the block timestamp to indicate when the message was sent from the L1 network. 1. A consumer contract on the L2 network can read these values from the [`ArbitrumUptimeFeedProxy` contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.0.0/contracts/src/v0.6/EACAggregatorProxy.sol), which reads values from the `ArbitrumSequencerUptimeFeed` contract. diff --git a/src/content/data-feeds/llms-full.txt b/src/content/data-feeds/llms-full.txt index 6955dc98310..9dc79ca85f0 100644 --- a/src/content/data-feeds/llms-full.txt +++ b/src/content/data-feeds/llms-full.txt @@ -1408,7 +1408,7 @@ zkSync Mainnet: [0x0E6AC8B967393dcD3D36677c126976157F993940](https://explorer.zk The diagram below shows how these feeds update and how a consumer retrieves the status of the Arbitrum sequencer. 1. Chainlink nodes trigger an OCR round every 30s and update the sequencer status by calling the `validate` function in the [`ArbitrumValidator` contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/l2ep/dev/arbitrum/ArbitrumValidator.sol) by calling it through the [`ValidatorProxy` contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.0.0/contracts/src/v0.8/ValidatorProxy.sol). -2. The `ArbitrumValidator` checks to see if the latest update is different from the previous update. If it detects a difference, it places a message in the [Arbitrum inbox contract](https://developer.offchainlabs.com/docs/inside_arbitrum#the-big-picture). +2. The `ArbitrumValidator` checks to see if the latest update is different from the previous update. If it detects a difference, it places a message in the [Arbitrum inbox contract](https://docs.arbitrum.io/how-arbitrum-works/inside-arbitrum-nitro). 3. The inbox contract sends the message to the [`ArbitrumSequencerUptimeFeed` contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/l2ep/dev/arbitrum/ArbitrumSequencerUptimeFeed.sol). The message calls the `updateStatus` function in the `ArbitrumSequencerUptimeFeed` contract and updates the latest sequencer status to 0 if the sequencer is up and 1 if it is down. It also records the block timestamp to indicate when the message was sent from the L1 network. 4. A consumer contract on the L2 network can read these values from the [`ArbitrumUptimeFeedProxy` contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.0.0/contracts/src/v0.6/EACAggregatorProxy.sol), which reads values from the `ArbitrumSequencerUptimeFeed` contract. @@ -4823,7 +4823,7 @@ Traditional MEV searching depends on spotting oracle price updates in the public ### Example Application: Aave Liquidations -Aave is a lending protocol where collateralized positions must remain above a [threshold](https://aave.com/docs/concepts/liquidations) called their health factor. When an oracle price update reveals a borrower is undercollateralized, the position becomes eligible for liquidation. The searcher liquidates the position in exchange for a liquidation bonus reward. With Chainlink SVR, a searcher's liquidation transaction can be bundled with the new SVR price update through Flashbots. +Aave is a lending protocol where collateralized positions must remain above a [threshold](https://aave.com/help/borrowing/liquidations) called their health factor. When an oracle price update reveals a borrower is undercollateralized, the position becomes eligible for liquidation. The searcher liquidates the position in exchange for a liquidation bonus reward. With Chainlink SVR, a searcher's liquidation transaction can be bundled with the new SVR price update through Flashbots. For more background on how Aave liquidations work, see [Aave Documentation](https://docs.aave.com/). To understand how Chainlink SVR adds a structured auction for these Aave liquidation opportunities, read the following sections. diff --git a/src/content/data-feeds/svr-feeds/index.mdx b/src/content/data-feeds/svr-feeds/index.mdx index 59014405596..12c7b48f7ee 100644 --- a/src/content/data-feeds/svr-feeds/index.mdx +++ b/src/content/data-feeds/svr-feeds/index.mdx @@ -205,7 +205,7 @@ Traditional MEV searching depends on spotting oracle price updates in the public ### Example Application: Aave Liquidations -Aave is a lending protocol where collateralized positions must remain above a [threshold](https://aave.com/docs/concepts/liquidations) called their health factor. When an oracle price update reveals a borrower is undercollateralized, the position becomes eligible for liquidation. The searcher liquidates the position in exchange for a liquidation bonus reward. With Chainlink SVR, a searcher's liquidation transaction can be bundled with the new SVR price update through Flashbots. +Aave is a lending protocol where collateralized positions must remain above a [threshold](https://aave.com/help/borrowing/liquidations) called their health factor. When an oracle price update reveals a borrower is undercollateralized, the position becomes eligible for liquidation. The searcher liquidates the position in exchange for a liquidation bonus reward. With Chainlink SVR, a searcher's liquidation transaction can be bundled with the new SVR price update through Flashbots. For more background on how Aave liquidations work, see [Aave Documentation](https://docs.aave.com/). To understand how Chainlink SVR adds a structured auction for these Aave liquidation opportunities, read the following sections. diff --git a/src/content/resources/contributing-to-chainlink.mdx b/src/content/resources/contributing-to-chainlink.mdx index 952c5214272..b7537ca3581 100644 --- a/src/content/resources/contributing-to-chainlink.mdx +++ b/src/content/resources/contributing-to-chainlink.mdx @@ -123,9 +123,3 @@ If you're interested in running an in-person meetup or watch party, [reach out t Chainlink runs hackathons multiple times per year and often sponsors other hackathons across the blockchain ecosystem. Participating in a hackathon that Chainlink is a part of is a great way to learn how to use Chainlink. It is also a great way to showcase your skills to the Chainlink team and the wider community. Hackathons are a popular place for recruiting talent into the blockchain ecosystem. To stay up to date on the hackathons that Chainlink is running or sponsoring, keep an eye out on the official Chainlink social media channels, and sign up for our [developer newsletter](/resources/developer-communications). - -## Applying for a grant - -The [Chainlink grant program](https://chain.link/community/grants) encourages development of critical developer tooling, add high-quality data, and the launch key services around the Chainlink Network. Grant categories include community, integration, bug bounty, research, and social impact grants. If you have a great idea that fits into one of these categories, you can apply for a grant. If successful, you will receive the funding and support needed to successfully build and implement your idea. - -For more information about the grant program, go to the [Chainlink Grants web page](https://chain.link/community/grants). diff --git a/src/content/resources/hackathon-resources.mdx b/src/content/resources/hackathon-resources.mdx index ee7b09830df..15db5dd352e 100644 --- a/src/content/resources/hackathon-resources.mdx +++ b/src/content/resources/hackathon-resources.mdx @@ -57,7 +57,7 @@ If you are new to Smart Contracts, read the [Getting Started Guide](/getting-sta ### BUILD projects - [Source Network](https://source.network/) -- [Thirdfi](https://www.thirdfi.org/) +- [Thirdfi](https://data.thirdfi.org/) ## Join the community diff --git a/src/content/resources/link-token-contracts.mdx b/src/content/resources/link-token-contracts.mdx index 7e8f6574c94..0acdcd9c46d 100644 --- a/src/content/resources/link-token-contracts.mdx +++ b/src/content/resources/link-token-contracts.mdx @@ -270,13 +270,13 @@ Testnet LINK are available at [faucets.chain.link/bitlayer-testnet](https://fauc ### Bittensor EVM Mainnet -| Parameter | Value | -| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Chain ID | `964` | -| Address | <Address contractUrl="https://taostats.io//address/0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13" urlId="964_0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13" urlClass="erc-token-address"/> | -| Name | Chainlink Token on Bittensor EVM Mainnet | -| Symbol | LINK | -| Decimals | 18 | +| Parameter | Value | +| :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `964` | +| Address | <Address contractUrl="https://taostats.io/address/0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13" urlId="964_0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13" urlClass="erc-token-address"/> | +| Name | Chainlink Token on Bittensor EVM Mainnet | +| Symbol | LINK | +| Decimals | 18 | ## <img src="/assets/chains/blast.svg" style="height: 24px; width: auto; margin-right: 8px;" />Blast @@ -900,8 +900,6 @@ ETH is used to pay for transactions on the Kroma mainnet. Testnet ETH is used to pay for transactions on the Kroma testnet. -Testnet Native and LINK are available at [faucets.chain.link/kroma-testnet](https://faucets.chain.link/kroma-testnet). - | Parameter | Value | | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ETH_CHAIN_ID` | `2358` | @@ -1970,8 +1968,6 @@ ETH is used to pay for transactions on the Zircuit mainnet. Testnet ETH is used to pay for transactions on the Zircuit testnet. -Testnet Native and LINK are available at [faucets.chain.link/zircuit-sepolia](https://faucets.chain.link/zircuit-sepolia). - | Parameter | Value | | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ETH_CHAIN_ID` | `48899` | @@ -1984,7 +1980,7 @@ Testnet Native and LINK are available at [faucets.chain.link/zircuit-sepolia](ht ### ZKsync Era Mainnet -ETH is used to pay for transactions on ZKsync Era Mainnet. Use the recommended [ZKsync Bridges](https://zksync.io/explore#bridges) to transfer ETH from Ethereum to ZKsync. +ETH is used to pay for transactions on ZKsync Era Mainnet. Use the recommended [ZKsync Bridges](https://docs.zksync.io/zksync-network/zksync-era/ecosystem/bridges) to transfer ETH from Ethereum to ZKsync. | Parameter | Value | | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/src/content/resources/llms-full.txt b/src/content/resources/llms-full.txt index af965a41342..042aab4c712 100644 --- a/src/content/resources/llms-full.txt +++ b/src/content/resources/llms-full.txt @@ -285,12 +285,6 @@ Chainlink runs hackathons multiple times per year and often sponsors other hacka To stay up to date on the hackathons that Chainlink is running or sponsoring, keep an eye out on the official Chainlink social media channels, and sign up for our [developer newsletter](/resources/developer-communications). -## Applying for a grant - -The [Chainlink grant program](https://chain.link/community/grants) encourages development of critical developer tooling, add high-quality data, and the launch key services around the Chainlink Network. Grant categories include community, integration, bug bounty, research, and social impact grants. If you have a great idea that fits into one of these categories, you can apply for a grant. If successful, you will receive the funding and support needed to successfully build and implement your idea. - -For more information about the grant program, go to the [Chainlink Grants web page](https://chain.link/community/grants). - --- # Install Frameworks @@ -697,7 +691,7 @@ If you are new to Smart Contracts, read the [Getting Started Guide](/getting-sta ### BUILD projects - [Source Network](https://source.network/) -- [Thirdfi](https://www.thirdfi.org/) +- [Thirdfi](https://data.thirdfi.org/) ## Join the community @@ -1034,13 +1028,13 @@ Testnet LINK are available at [faucets.chain.link/bitlayer-testnet](https://fauc ### Bittensor EVM Mainnet -| Parameter | Value | -| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Chain ID | `964` | -| Address | <Address contractUrl="https://taostats.io//address/0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13" urlId="964_0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13" urlClass="erc-token-address" /> | -| Name | Chainlink Token on Bittensor EVM Mainnet | -| Symbol | LINK | -| Decimals | 18 | +| Parameter | Value | +| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `964` | +| Address | <Address contractUrl="https://taostats.io/address/0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13" urlId="964_0xf09AFe78d3c7d359b334d7cB88995751F7eC5E13" urlClass="erc-token-address" /> | +| Name | Chainlink Token on Bittensor EVM Mainnet | +| Symbol | LINK | +| Decimals | 18 | ## <img src="/assets/chains/blast.svg" style="height: 24px; width: auto; margin-right: 8px;" />Blast @@ -1664,8 +1658,6 @@ ETH is used to pay for transactions on the Kroma mainnet. Testnet ETH is used to pay for transactions on the Kroma testnet. -Testnet Native and LINK are available at [faucets.chain.link/kroma-testnet](https://faucets.chain.link/kroma-testnet). - | Parameter | Value | | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ETH_CHAIN_ID` | `2358` | @@ -2735,8 +2727,6 @@ ETH is used to pay for transactions on the Zircuit mainnet. Testnet ETH is used to pay for transactions on the Zircuit testnet. -Testnet Native and LINK are available at [faucets.chain.link/zircuit-sepolia](https://faucets.chain.link/zircuit-sepolia). - | Parameter | Value | | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `ETH_CHAIN_ID` | `48899` | @@ -2749,7 +2739,7 @@ Testnet Native and LINK are available at [faucets.chain.link/zircuit-sepolia](ht ### ZKsync Era Mainnet -ETH is used to pay for transactions on ZKsync Era Mainnet. Use the recommended [ZKsync Bridges](https://zksync.io/explore#bridges) to transfer ETH from Ethereum to ZKsync. +ETH is used to pay for transactions on ZKsync Era Mainnet. Use the recommended [ZKsync Bridges](https://docs.zksync.io/zksync-network/zksync-era/ecosystem/bridges) to transfer ETH from Ethereum to ZKsync. | Parameter | Value | | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | diff --git a/src/content/vrf/llms-full.txt b/src/content/vrf/llms-full.txt index 4b026ed98b3..ffabc17a636 100644 --- a/src/content/vrf/llms-full.txt +++ b/src/content/vrf/llms-full.txt @@ -2513,7 +2513,7 @@ This guide explains how to test Chainlink VRF v2 on a [Remix IDE](https://remix- Complete the following tasks to test your VRF v2 consumer locally: 1. Deploy the [VRFCoordinatorV2Mock](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2Mock.sol). This contract is a mock of the [VRFCoordinatorV2](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/VRFCoordinatorV2.sol) contract. -2. Deploy the [MockV3Aggregator](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/mocks/MockV3Aggregator.sol) contract. +2. Deploy the [MockV3Aggregator](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/tests/MockV3Aggregator.sol) contract. 3. Deploy the [LinkToken](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/token/ERC677/LinkToken.sol) contract. 4. Deploy the [VRFV2Wrapper](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/VRFV2Wrapper.sol) contract. 5. Call the VRFV2Wrapper [setConfig function](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/VRFV2Wrapper.sol#L119) to set wrapper specific parameters. diff --git a/src/content/vrf/v2/direct-funding/examples/test-locally.mdx b/src/content/vrf/v2/direct-funding/examples/test-locally.mdx index ee1aff0fdce..58db326b44f 100644 --- a/src/content/vrf/v2/direct-funding/examples/test-locally.mdx +++ b/src/content/vrf/v2/direct-funding/examples/test-locally.mdx @@ -27,7 +27,7 @@ This guide explains how to test Chainlink VRF v2 on a [Remix IDE](https://remix- Complete the following tasks to test your VRF v2 consumer locally: 1. Deploy the [VRFCoordinatorV2Mock](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2Mock.sol). This contract is a mock of the [VRFCoordinatorV2](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/VRFCoordinatorV2.sol) contract. -1. Deploy the [MockV3Aggregator](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/mocks/MockV3Aggregator.sol) contract. +1. Deploy the [MockV3Aggregator](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/tests/MockV3Aggregator.sol) contract. 1. Deploy the [LinkToken](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/token/ERC677/LinkToken.sol) contract. 1. Deploy the [VRFV2Wrapper](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/VRFV2Wrapper.sol) contract. 1. Call the VRFV2Wrapper [setConfig function](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/vrf/VRFV2Wrapper.sol#L119) to set wrapper specific parameters. diff --git a/src/features/feeds/data/StreamsNetworksData.ts b/src/features/feeds/data/StreamsNetworksData.ts index 37ed9544dfe..9c5e68ee768 100644 --- a/src/features/feeds/data/StreamsNetworksData.ts +++ b/src/features/feeds/data/StreamsNetworksData.ts @@ -283,12 +283,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", }, }, { From baf1a2c0c2a43a910242d8e38c35d100048a7dd8 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Mon, 15 Dec 2025 19:26:31 -0600 Subject: [PATCH 066/214] bump next to 14.2.35 (#3299) --- package-lock.json | 39 +++++++++++---------------------------- package.json | 1 + 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8890626e2e..f2744fc5444 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,6 +55,7 @@ "lodash": "^4.17.21", "marked": "^15.0.12", "nanostores": "^0.11.4", + "next": "14.2.35", "pino": "^9.14.0", "preact": "^10.28.0", "react-instantsearch": "^7.21.0", @@ -8487,11 +8488,10 @@ } }, "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", @@ -8505,7 +8505,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8522,7 +8521,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8539,7 +8537,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8556,7 +8553,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8573,7 +8569,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8590,7 +8585,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8607,7 +8601,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8624,7 +8617,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } @@ -8641,7 +8633,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10" } @@ -15018,8 +15009,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@swc/helpers": { "version": "0.5.17", @@ -17889,7 +17879,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" }, @@ -18401,8 +18390,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/clipboard": { "version": "2.0.11", @@ -29854,13 +29842,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", @@ -29909,7 +29896,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" @@ -29934,7 +29920,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -34439,7 +34424,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" } @@ -34707,7 +34691,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" }, diff --git a/package.json b/package.json index 34ea6359dd6..af8e3b4291d 100644 --- a/package.json +++ b/package.json @@ -100,6 +100,7 @@ "lodash": "^4.17.21", "marked": "^15.0.12", "nanostores": "^0.11.4", + "next": "14.2.35", "pino": "^9.14.0", "preact": "^10.28.0", "react-instantsearch": "^7.21.0", From b112daf6a01790098fa5079a2e860b3593c71875 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Tue, 16 Dec 2025 10:06:34 -0600 Subject: [PATCH 067/214] Add callouts for URL redirects (#3301) * add callouts for url redirects * add callouts for url redirects * nit update --- reports/llms-report.json | 24 ++++++++--------- .../using-http-client/get-request-go.mdx | 7 ++++- .../using-http-client/get-request-ts.mdx | 7 ++++- .../using-http-client/post-request-go.mdx | 7 ++++- .../using-http-client/post-request-ts.mdx | 7 ++++- .../submitting-reports-http-go.mdx | 5 ++++ .../submitting-reports-http-ts.mdx | 5 ++++ src/content/cre/llms-full-go.txt | 26 ++++++++++++++++--- src/content/cre/llms-full-ts.txt | 26 ++++++++++++++++--- .../cre/reference/sdk/http-client-go.mdx | 7 ++++- .../cre/reference/sdk/http-client-ts.mdx | 7 ++++- 11 files changed, 104 insertions(+), 24 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index 43a47dd587b..6a915f4f94a 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,21 +1,21 @@ { - "startedAt": "2025-12-15T18:30:25.869Z", + "startedAt": "2025-12-16T15:44:36.319Z", "siteBase": "https://docs.chain.link", "sections": [ { "section": "cre-go", "pagesProcessed": 84, "outputPath": "src/content/cre/llms-full-go.txt", - "bytes": 673266, - "prevBytes": 673266, + "bytes": 674210, + "prevBytes": 674210, "deltaBytes": 0 }, { "section": "cre-ts", "pagesProcessed": 79, "outputPath": "src/content/cre/llms-full-ts.txt", - "bytes": 629202, - "prevBytes": 629202, + "bytes": 630146, + "prevBytes": 630146, "deltaBytes": 0 }, { @@ -23,8 +23,8 @@ "pagesProcessed": 35, "outputPath": "src/content/vrf/llms-full.txt", "bytes": 301005, - "prevBytes": 301012, - "deltaBytes": -7 + "prevBytes": 301005, + "deltaBytes": 0 }, { "section": "ccip", @@ -39,8 +39,8 @@ "pagesProcessed": 37, "outputPath": "src/content/data-feeds/llms-full.txt", "bytes": 302811, - "prevBytes": 302816, - "deltaBytes": -5 + "prevBytes": 302811, + "deltaBytes": 0 }, { "section": "data-streams", @@ -87,8 +87,8 @@ "pagesProcessed": 12, "outputPath": "src/content/resources/llms-full.txt", "bytes": 340405, - "prevBytes": 340412, - "deltaBytes": -7 + "prevBytes": 340405, + "deltaBytes": 0 }, { "section": "architecture-overview", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-15T18:30:30.307Z" + "finishedAt": "2025-12-16T15:44:40.643Z" } diff --git a/src/content/cre/guides/workflow/using-http-client/get-request-go.mdx b/src/content/cre/guides/workflow/using-http-client/get-request-go.mdx index 40dc67fe131..79afa8db3db 100644 --- a/src/content/cre/guides/workflow/using-http-client/get-request-go.mdx +++ b/src/content/cre/guides/workflow/using-http-client/get-request-go.mdx @@ -7,7 +7,7 @@ pageId: "guides-workflow-http-get-request" metadata: description: "Fetch data from APIs in Go: learn to make GET requests with consensus validation to bring offchain data into your workflow." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2025-12-16" --- import { Aside } from "@components" @@ -23,6 +23,11 @@ All HTTP requests are wrapped in a consensus mechanism to provide a single, reli This guide assumes you have a basic understanding of CRE. If you are new, we strongly recommend completing the [Getting Started tutorial](/cre/getting-started/overview) first. +{/* prettier-ignore */} +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + ## Choosing your approach ### Use `http.SendRequest` (Section 1) when: diff --git a/src/content/cre/guides/workflow/using-http-client/get-request-ts.mdx b/src/content/cre/guides/workflow/using-http-client/get-request-ts.mdx index d5354da076d..2beafe6b22c 100644 --- a/src/content/cre/guides/workflow/using-http-client/get-request-ts.mdx +++ b/src/content/cre/guides/workflow/using-http-client/get-request-ts.mdx @@ -7,7 +7,7 @@ pageId: "guides-workflow-http-get-request" metadata: description: "Fetch data from APIs in TypeScript: learn to make GET requests with consensus validation to bring offchain data into your workflow." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2025-12-16" --- import { Aside } from "@components" @@ -23,6 +23,11 @@ All HTTP requests are wrapped in a consensus mechanism to provide a single, reli This guide assumes you have a basic understanding of CRE. If you are new, we strongly recommend completing the [Getting Started tutorial](/cre/getting-started/overview) first. +{/* prettier-ignore */} +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + ## Choosing your approach ### Use `sendRequest` (Section 1) when: diff --git a/src/content/cre/guides/workflow/using-http-client/post-request-go.mdx b/src/content/cre/guides/workflow/using-http-client/post-request-go.mdx index 4b5cb4e3542..52fd49e3fe4 100644 --- a/src/content/cre/guides/workflow/using-http-client/post-request-go.mdx +++ b/src/content/cre/guides/workflow/using-http-client/post-request-go.mdx @@ -7,7 +7,7 @@ pageId: "guides-workflow-http-post-request" metadata: description: "Send data to external APIs in Go: learn to make POST requests from your workflow with authentication and custom headers." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2025-12-16" --- import { Aside } from "@components" @@ -52,6 +52,11 @@ For this example, we will use <a href="https://webhook.site/" target="_blank">** This guide assumes you have a basic understanding of CRE. If you are new, we strongly recommend completing the [Getting Started tutorial](/cre/getting-started/overview) first. +{/* prettier-ignore */} +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + ## 1. The `http.SendRequest` Pattern (recommended) The `http.SendRequest` helper function is the simplest and recommended way to make `POST` requests. It automatically handles the `cre.RunInNodeMode` pattern for you. diff --git a/src/content/cre/guides/workflow/using-http-client/post-request-ts.mdx b/src/content/cre/guides/workflow/using-http-client/post-request-ts.mdx index f78ef48d0e6..528e5201a35 100644 --- a/src/content/cre/guides/workflow/using-http-client/post-request-ts.mdx +++ b/src/content/cre/guides/workflow/using-http-client/post-request-ts.mdx @@ -7,7 +7,7 @@ pageId: "guides-workflow-http-post-request" metadata: description: "Send data to external APIs in TypeScript: learn to make POST requests from your workflow with authentication and custom headers." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2025-12-16" --- import { Aside } from "@components" @@ -52,6 +52,11 @@ For this example, we will use <a href="https://webhook.site/" target="_blank">** This guide assumes you have a basic understanding of CRE. If you are new, we strongly recommend completing the [Getting Started tutorial](/cre/getting-started/overview) first. +{/* prettier-ignore */} +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + ## 1. The High-Level `sendRequest` Pattern (recommended) The high-level `sendRequest()` method is the simplest and recommended way to make `POST` requests. It automatically handles the `runInNodeMode` pattern for you. diff --git a/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-go.mdx b/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-go.mdx index d499b28b905..9d7cd4b6e23 100644 --- a/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-go.mdx +++ b/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-go.mdx @@ -31,6 +31,11 @@ This guide shows how to send a cryptographically signed report (generated by you - Understanding of [generating reports](/cre/guides/workflow/using-evm-client/onchain-write/generating-reports-single-values) - A generated report from `runtime.GenerateReport()` +{/* prettier-ignore */} +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + ## Quick start: Minimal example Here's the simplest possible workflow that generates and submits a report via HTTP: diff --git a/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-ts.mdx b/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-ts.mdx index 8df8c710036..ef060842e5c 100644 --- a/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-ts.mdx +++ b/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-ts.mdx @@ -30,6 +30,11 @@ This guide shows how to send a cryptographically signed report (generated by you - Familiarity with [making POST requests](/cre/guides/workflow/using-http-client/post-request) - Familiarity with `runtime.report()` (covered [below](#generating-reports-for-http-submission)) +{/* prettier-ignore */} +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + ## Quick start: Minimal example Here's the simplest possible workflow that generates and submits a report via HTTP: diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index f79ae74956c..8f68b4320a2 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -10751,7 +10751,7 @@ These `KeystoneForwarder` addresses are used by deployed workflows. Use these ad # Making GET Requests Source: https://docs.chain.link/cre/guides/workflow/using-http-client/get-request-go -Last Updated: 2025-11-04 +Last Updated: 2025-12-16 The `http.Client` is the SDK's interface for the underlying [HTTP Capability](/cre/capabilities/http). It allows your workflow to fetch data from any external API. @@ -10764,6 +10764,11 @@ All HTTP requests are wrapped in a consensus mechanism to provide a single, reli This guide assumes you have a basic understanding of CRE. If you are new, we strongly recommend completing the [Getting Started tutorial](/cre/getting-started/overview) first. + +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + ## Choosing your approach ### Use `http.SendRequest` (Section 1) when: @@ -10957,7 +10962,7 @@ The `http.Request` struct provides several fields to customize your request. See # Making POST Requests Source: https://docs.chain.link/cre/guides/workflow/using-http-client/post-request-go -Last Updated: 2025-11-04 +Last Updated: 2025-12-16 This guide explains how to use the HTTP Client to send data to an external API using a `POST` request. Because POST requests typically create resources or trigger actions, this guide shows you how to ensure your request executes only once, even though multiple nodes in the DON run your workflow. @@ -10999,6 +11004,11 @@ For this example, we will use <a href="https://webhook.site/" target="_blank">** This guide assumes you have a basic understanding of CRE. If you are new, we strongly recommend completing the [Getting Started tutorial](/cre/getting-started/overview) first. + +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + ## 1. The `http.SendRequest` Pattern (recommended) The `http.SendRequest` helper function is the simplest and recommended way to make `POST` requests. It automatically handles the `cre.RunInNodeMode` pattern for you. @@ -11532,6 +11542,11 @@ This guide shows how to send a cryptographically signed report (generated by you - Understanding of [generating reports](/cre/guides/workflow/using-evm-client/onchain-write/generating-reports-single-values) - A generated report from `runtime.GenerateReport()` + +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + ## Quick start: Minimal example Here's the simplest possible workflow that generates and submits a report via HTTP: @@ -13931,7 +13946,7 @@ if err != nil { # SDK Reference: HTTP Client Source: https://docs.chain.link/cre/reference/sdk/http-client-go -Last Updated: 2025-11-04 +Last Updated: 2025-12-16 The HTTP Client lets you make requests to external APIs from your workflow. Each node in the DON executes the request independently, and the SDK uses consensus to provide a single, reliable result. @@ -13956,6 +13971,11 @@ The HTTP Client lets you make requests to external APIs from your workflow. Each Defines the parameters for an outgoing HTTP request. + +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + | Field | Type | Description | | --------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------- | | `Url` | `string` | The URL of the API endpoint. | diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index 17a26472a84..0d6c952e0b8 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -9500,7 +9500,7 @@ These `KeystoneForwarder` addresses are used by deployed workflows. Use these ad # Making GET Requests Source: https://docs.chain.link/cre/guides/workflow/using-http-client/get-request-ts -Last Updated: 2025-11-04 +Last Updated: 2025-12-16 The `HTTPClient` is the SDK's interface for the underlying [HTTP Capability](/cre/capabilities/http). It allows your workflow to fetch data from any external API. @@ -9513,6 +9513,11 @@ All HTTP requests are wrapped in a consensus mechanism to provide a single, reli This guide assumes you have a basic understanding of CRE. If you are new, we strongly recommend completing the [Getting Started tutorial](/cre/getting-started/overview) first. + +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + ## Choosing your approach ### Use `sendRequest` (Section 1) when: @@ -9854,7 +9859,7 @@ The request object provides several fields to customize your HTTP call. See the # Making POST Requests Source: https://docs.chain.link/cre/guides/workflow/using-http-client/post-request-ts -Last Updated: 2025-11-04 +Last Updated: 2025-12-16 This guide explains how to use the HTTP Client to send data to an external API using a `POST` request. Because POST requests typically create resources or trigger actions, this guide shows you how to ensure your request executes only once, even though multiple nodes in the DON run your workflow. @@ -9896,6 +9901,11 @@ For this example, we will use <a href="https://webhook.site/" target="_blank">** This guide assumes you have a basic understanding of CRE. If you are new, we strongly recommend completing the [Getting Started tutorial](/cre/getting-started/overview) first. + +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + ## 1. The High-Level `sendRequest` Pattern (recommended) The high-level `sendRequest()` method is the simplest and recommended way to make `POST` requests. It automatically handles the `runInNodeMode` pattern for you. @@ -10333,6 +10343,11 @@ This guide shows how to send a cryptographically signed report (generated by you - Familiarity with [making POST requests](/cre/guides/workflow/using-http-client/post-request) - Familiarity with `runtime.report()` (covered [below](#generating-reports-for-http-submission)) + +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + ## Quick start: Minimal example Here's the simplest possible workflow that generates and submits a report via HTTP: @@ -13425,7 +13440,7 @@ const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) # SDK Reference: HTTP Client Source: https://docs.chain.link/cre/reference/sdk/http-client-ts -Last Updated: 2025-11-04 +Last Updated: 2025-12-16 This page provides a reference for making offchain HTTP requests using the `HTTPClient`. This is a "node-level" action capability, meaning it executes on each individual node in the DON. @@ -13804,6 +13819,11 @@ const fetchPrice = (sendRequester: HTTPSendRequester, url: string): number => { Defines the parameters for an outgoing HTTP request. + +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + | Field | Type | Description | | --------------- | ------------------------------------------------- | --------------------------------------------------------------- | | `url` | `string` | The URL of the API endpoint. | diff --git a/src/content/cre/reference/sdk/http-client-go.mdx b/src/content/cre/reference/sdk/http-client-go.mdx index cdb2f2078c5..1206717a54e 100644 --- a/src/content/cre/reference/sdk/http-client-go.mdx +++ b/src/content/cre/reference/sdk/http-client-go.mdx @@ -7,7 +7,7 @@ pageId: "reference-sdk-http-client" metadata: description: "Reference for Go HTTP Client: complete API for GET/POST requests, headers, authentication, and consensus aggregation methods." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2025-12-16" --- import { Aside } from "@components" @@ -35,6 +35,11 @@ The HTTP Client lets you make requests to external APIs from your workflow. Each Defines the parameters for an outgoing HTTP request. +{/* prettier-ignore */} +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + | <div style="width: 120px;">Field</div> | <div style="width: 200px;">Type</div> | Description | | -------------------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | `Url` | `string` | The URL of the API endpoint. | diff --git a/src/content/cre/reference/sdk/http-client-ts.mdx b/src/content/cre/reference/sdk/http-client-ts.mdx index eb5822a9787..22e0deeb29f 100644 --- a/src/content/cre/reference/sdk/http-client-ts.mdx +++ b/src/content/cre/reference/sdk/http-client-ts.mdx @@ -7,7 +7,7 @@ pageId: "reference-sdk-http-client" metadata: description: "Reference for TypeScript HTTP Client: complete API for GET/POST requests, headers, authentication, and consensus aggregation." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2025-12-16" --- import { Aside } from "@components" @@ -389,6 +389,11 @@ const fetchPrice = (sendRequester: HTTPSendRequester, url: string): number => { Defines the parameters for an outgoing HTTP request. +{/* prettier-ignore */} +<Aside type="caution" title="Redirects are not supported"> + HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +</Aside> + | Field | Type | Description | | --------------- | ------------------------------------------------- | --------------------------------------------------------------- | | `url` | `string` | The URL of the API endpoint. | From 2aa0f1294709c69c37d806a4c5f041cb5baeebd0 Mon Sep 17 00:00:00 2001 From: devin distefano <devin.distefano@smartcontract.com> Date: Tue, 16 Dec 2025 10:08:54 -0800 Subject: [PATCH 068/214] deprecation changelog (#3303) --- public/changelog.json | 7 +++++++ reports/llms-report.json | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/public/changelog.json b/public/changelog.json index 82e099a1b9d..327433d0d50 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -358,6 +358,13 @@ } }, "data": [ + { + "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", diff --git a/reports/llms-report.json b/reports/llms-report.json index 6a915f4f94a..12927cbd718 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,5 +1,5 @@ { - "startedAt": "2025-12-16T15:44:36.319Z", + "startedAt": "2025-12-16T17:58:25.738Z", "siteBase": "https://docs.chain.link", "sections": [ { @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-16T15:44:40.643Z" + "finishedAt": "2025-12-16T17:58:29.466Z" } From db7b256ccea799ca95fef55ecf3b439dce0752aa Mon Sep 17 00:00:00 2001 From: Syed Asad Kazmi <36279345+SyedAsadKazmi@users.noreply.github.com> Date: Tue, 16 Dec 2025 23:50:50 +0530 Subject: [PATCH 069/214] Fix `ccip-tools-ts` tutorial and broken external links in CCIP (#3302) * Fix ccip-tools-ts tutorial and broken external links in CCIP * Fix eslint formatting --- reports/llms-report.json | 8 +- .../__snapshots__/ccip-dynamic.test.ts.snap | 7 - src/config/sidebar/ccip-dynamic.ts | 10 +- .../evm/v1.6.0/burn-mint-erc20.mdx | 2 +- .../evm/v1.6.0/i-type-and-version.mdx | 2 +- .../evm/v1.6.0/ownable-2-step-msg-sender.mdx | 2 +- .../evm/v1.6.0/ownable-2-step.mdx | 2 +- .../evm/v1.6.1/burn-mint-erc20.mdx | 2 +- .../evm/v1.6.1/i-type-and-version.mdx | 2 +- .../evm/v1.6.1/ownable-2-step-msg-sender.mdx | 2 +- .../evm/v1.6.1/ownable-2-step.mdx | 2 +- .../svm/v1.6.0/base-token-pool.mdx | 2 +- .../svm/v1.6.0/burn-mint-token-pool.mdx | 2 +- .../svm/v1.6.0/lock-release-token-pool.mdx | 2 +- .../api-reference/svm/v1.6.0/receiver.mdx | 2 +- .../ccip/api-reference/svm/v1.6.0/router.mdx | 2 +- .../architecture/onchain/svm/components.mdx | 4 +- .../cross-chain-token/svm/token-pools.mdx | 14 +- src/content/ccip/llms-full.txt | 533 +++++++++--------- .../programmable-token-transfers.mdx | 2 +- .../tutorials/evm/ccipreceive-gaslimit.mdx | 2 +- src/content/ccip/tutorials/evm/index.mdx | 1 - .../ccip-tools/get-status-offchain.mdx | 56 +- .../ccip-tools/get-supported-tokens.mdx | 12 +- .../evm/offchain/ccip-tools/index.mdx | 1 - .../ccip-tools/transfer-tokens-from-eoa.mdx | 79 +-- .../evm/offchain/transfer-tokens-from-eoa.mdx | 4 +- .../ccip/tutorials/evm/token-manager.mdx | 2 +- src/content/ccip/tutorials/evm/usdc.mdx | 2 +- src/content/ccip/tutorials/svm/receivers.mdx | 2 +- ...CrossChainTokenProductionPrerequisites.mdx | 2 +- 31 files changed, 378 insertions(+), 389 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index 12927cbd718..2181e9fe037 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,5 +1,5 @@ { - "startedAt": "2025-12-16T17:58:25.738Z", + "startedAt": "2025-12-16T18:01:55.280Z", "siteBase": "https://docs.chain.link", "sections": [ { @@ -30,9 +30,9 @@ "section": "ccip", "pagesProcessed": 260, "outputPath": "src/content/ccip/llms-full.txt", - "bytes": 2848574, + "bytes": 2847978, "prevBytes": 2848574, - "deltaBytes": 0 + "deltaBytes": -596 }, { "section": "data-feeds", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2025-12-16T17:58:29.466Z" + "finishedAt": "2025-12-16T18:01:58.921Z" } diff --git a/src/config/sidebar/__tests__/__snapshots__/ccip-dynamic.test.ts.snap b/src/config/sidebar/__tests__/__snapshots__/ccip-dynamic.test.ts.snap index 029002b33c8..28b9d70e244 100644 --- a/src/config/sidebar/__tests__/__snapshots__/ccip-dynamic.test.ts.snap +++ b/src/config/sidebar/__tests__/__snapshots__/ccip-dynamic.test.ts.snap @@ -381,13 +381,6 @@ exports[`CCIP Sidebar Configuration Snapshot should match the expected sidebar s "title": "Checking CCIP Message Status", "url": "ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain", }, - { - "chainTypes": [ - "evm", - ], - "title": "Get Supported Tokens", - "url": "ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens", - }, ], "title": "Using CCIP CLI", "url": "ccip/tutorials/evm/offchain/ccip-tools", diff --git a/src/config/sidebar/ccip-dynamic.ts b/src/config/sidebar/ccip-dynamic.ts index 77a458a94fd..b69927cd15c 100644 --- a/src/config/sidebar/ccip-dynamic.ts +++ b/src/config/sidebar/ccip-dynamic.ts @@ -333,11 +333,11 @@ export const CCIP_SIDEBAR_CONTENT: SectionEntry[] = [ url: "ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain", chainTypes: ["evm"], }, - { - title: "Get Supported Tokens", - url: "ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens", - chainTypes: ["evm"], - }, + // { + // title: "Get Supported Tokens", + // url: "ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens", + // chainTypes: ["evm"], + // }, ], }, ], diff --git a/src/content/ccip/api-reference/evm/v1.6.0/burn-mint-erc20.mdx b/src/content/ccip/api-reference/evm/v1.6.0/burn-mint-erc20.mdx index 15cb71d1781..79a37204df2 100644 --- a/src/content/ccip/api-reference/evm/v1.6.0/burn-mint-erc20.mdx +++ b/src/content/ccip/api-reference/evm/v1.6.0/burn-mint-erc20.mdx @@ -15,7 +15,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" An ERC20-compliant token contract that extends the standard functionality with controlled minting and burning capabilities through role-based access control. -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol) <Aside> diff --git a/src/content/ccip/api-reference/evm/v1.6.0/i-type-and-version.mdx b/src/content/ccip/api-reference/evm/v1.6.0/i-type-and-version.mdx index 692edb3aa2c..94508bad3b6 100644 --- a/src/content/ccip/api-reference/evm/v1.6.0/i-type-and-version.mdx +++ b/src/content/ccip/api-reference/evm/v1.6.0/i-type-and-version.mdx @@ -15,7 +15,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" An interface that provides type and version information for contracts. -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/interfaces/ITypeAndVersion.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/interfaces/ITypeAndVersion.sol) ## Functions diff --git a/src/content/ccip/api-reference/evm/v1.6.0/ownable-2-step-msg-sender.mdx b/src/content/ccip/api-reference/evm/v1.6.0/ownable-2-step-msg-sender.mdx index 2b4154b19cf..a525dad5c0c 100644 --- a/src/content/ccip/api-reference/evm/v1.6.0/ownable-2-step-msg-sender.mdx +++ b/src/content/ccip/api-reference/evm/v1.6.0/ownable-2-step-msg-sender.mdx @@ -28,7 +28,7 @@ This prevents accidental transfers to incorrect or inaccessible addresses. </Aside> -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/access/Ownable2StepMsgSender.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/access/Ownable2StepMsgSender.sol) ## Functions diff --git a/src/content/ccip/api-reference/evm/v1.6.0/ownable-2-step.mdx b/src/content/ccip/api-reference/evm/v1.6.0/ownable-2-step.mdx index 09c32e43444..663d4c15508 100644 --- a/src/content/ccip/api-reference/evm/v1.6.0/ownable-2-step.mdx +++ b/src/content/ccip/api-reference/evm/v1.6.0/ownable-2-step.mdx @@ -15,7 +15,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" A minimal contract that implements 2-step ownership transfer and nothing more. It's made to be minimal to reduce the impact of the bytecode size on any contract that inherits from it. -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/access/Ownable2Step.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/access/Ownable2Step.sol) <Aside type="note"> This contract implements a secure two-step ownership transfer process: diff --git a/src/content/ccip/api-reference/evm/v1.6.1/burn-mint-erc20.mdx b/src/content/ccip/api-reference/evm/v1.6.1/burn-mint-erc20.mdx index 85833541e3d..01028653d99 100644 --- a/src/content/ccip/api-reference/evm/v1.6.1/burn-mint-erc20.mdx +++ b/src/content/ccip/api-reference/evm/v1.6.1/burn-mint-erc20.mdx @@ -15,7 +15,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" An ERC20-compliant token contract that extends the standard functionality with controlled minting and burning capabilities through role-based access control. -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol) <Aside> diff --git a/src/content/ccip/api-reference/evm/v1.6.1/i-type-and-version.mdx b/src/content/ccip/api-reference/evm/v1.6.1/i-type-and-version.mdx index 4b21696ded4..d482e169764 100644 --- a/src/content/ccip/api-reference/evm/v1.6.1/i-type-and-version.mdx +++ b/src/content/ccip/api-reference/evm/v1.6.1/i-type-and-version.mdx @@ -15,7 +15,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" An interface that provides type and version information for contracts. -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/interfaces/ITypeAndVersion.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/interfaces/ITypeAndVersion.sol) ## Functions diff --git a/src/content/ccip/api-reference/evm/v1.6.1/ownable-2-step-msg-sender.mdx b/src/content/ccip/api-reference/evm/v1.6.1/ownable-2-step-msg-sender.mdx index a7728514163..8de7673cf59 100644 --- a/src/content/ccip/api-reference/evm/v1.6.1/ownable-2-step-msg-sender.mdx +++ b/src/content/ccip/api-reference/evm/v1.6.1/ownable-2-step-msg-sender.mdx @@ -28,7 +28,7 @@ This prevents accidental transfers to incorrect or inaccessible addresses. </Aside> -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/access/Ownable2StepMsgSender.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/access/Ownable2StepMsgSender.sol) ## Functions diff --git a/src/content/ccip/api-reference/evm/v1.6.1/ownable-2-step.mdx b/src/content/ccip/api-reference/evm/v1.6.1/ownable-2-step.mdx index 09d5d9a4247..ed078a04c47 100644 --- a/src/content/ccip/api-reference/evm/v1.6.1/ownable-2-step.mdx +++ b/src/content/ccip/api-reference/evm/v1.6.1/ownable-2-step.mdx @@ -15,7 +15,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" A minimal contract that implements 2-step ownership transfer and nothing more. It's made to be minimal to reduce the impact of the bytecode size on any contract that inherits from it. -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/access/Ownable2Step.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/access/Ownable2Step.sol) <Aside type="note"> This contract implements a secure two-step ownership transfer process: diff --git a/src/content/ccip/api-reference/svm/v1.6.0/base-token-pool.mdx b/src/content/ccip/api-reference/svm/v1.6.0/base-token-pool.mdx index c62adb2ece1..731b67b7a3a 100644 --- a/src/content/ccip/api-reference/svm/v1.6.0/base-token-pool.mdx +++ b/src/content/ccip/api-reference/svm/v1.6.0/base-token-pool.mdx @@ -12,7 +12,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" ## Base Token Pool Library -[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/base-token-pool) +[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/base-token-pool) The Base Token Pool library provides foundational components and shared functionality for CCIP token pool implementations on SVM-based blockchains. This library is not deployable as a standalone program but serves as a dependency for concrete token pool implementations like BurnMint and Lock-Release pools. diff --git a/src/content/ccip/api-reference/svm/v1.6.0/burn-mint-token-pool.mdx b/src/content/ccip/api-reference/svm/v1.6.0/burn-mint-token-pool.mdx index 73d3230e020..11549669b4d 100644 --- a/src/content/ccip/api-reference/svm/v1.6.0/burn-mint-token-pool.mdx +++ b/src/content/ccip/api-reference/svm/v1.6.0/burn-mint-token-pool.mdx @@ -12,7 +12,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" ## BurnMint Token Pool -[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/burnmint-token-pool) +[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/burnmint-token-pool) Below is a complete API reference for the CCIP BurnMint Token Pool program instructions. This pool implementation burns tokens on the source chain and mints them on the destination chain. diff --git a/src/content/ccip/api-reference/svm/v1.6.0/lock-release-token-pool.mdx b/src/content/ccip/api-reference/svm/v1.6.0/lock-release-token-pool.mdx index 529553d1547..e4b2d38d413 100644 --- a/src/content/ccip/api-reference/svm/v1.6.0/lock-release-token-pool.mdx +++ b/src/content/ccip/api-reference/svm/v1.6.0/lock-release-token-pool.mdx @@ -12,7 +12,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" ## Lock-Release Token Pool -[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/lockrelease-token-pool) +[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/lockrelease-token-pool) The Lock-Release Token Pool program implements a token pool that uses a lock/release strategy for cross-chain transfers. When tokens are sent cross-chain, they are locked in the pool on the source chain and released from the pool on the destination chain. diff --git a/src/content/ccip/api-reference/svm/v1.6.0/receiver.mdx b/src/content/ccip/api-reference/svm/v1.6.0/receiver.mdx index 538c5d0ccbe..074ce402a7e 100644 --- a/src/content/ccip/api-reference/svm/v1.6.0/receiver.mdx +++ b/src/content/ccip/api-reference/svm/v1.6.0/receiver.mdx @@ -12,7 +12,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" ## Receiver -[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/example-ccip-receiver) +[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/example-ccip-receiver) Below is a complete API reference for the `ccip_receive` instruction that must be implemented by any Solana program wishing to receive CCIP messages. diff --git a/src/content/ccip/api-reference/svm/v1.6.0/router.mdx b/src/content/ccip/api-reference/svm/v1.6.0/router.mdx index 7ec9e046dbd..f54d0fc8e26 100644 --- a/src/content/ccip/api-reference/svm/v1.6.0/router.mdx +++ b/src/content/ccip/api-reference/svm/v1.6.0/router.mdx @@ -12,7 +12,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" ## Router -[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/ccip-router) +[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/ccip-router) Below is a complete API reference for the CCIP Router program instructions. diff --git a/src/content/ccip/concepts/architecture/onchain/svm/components.mdx b/src/content/ccip/concepts/architecture/onchain/svm/components.mdx index a151c817efd..5f73c87c26c 100644 --- a/src/content/ccip/concepts/architecture/onchain/svm/components.mdx +++ b/src/content/ccip/concepts/architecture/onchain/svm/components.mdx @@ -64,7 +64,7 @@ This section provides more detail on the Onchain components. **Additional Resources**: -- CCIP provides program examples for a Sender/Receiver in the [Programs folder](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs). +- CCIP provides program examples for a Sender/Receiver in the [Programs folder](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs). ## Router @@ -188,7 +188,7 @@ The FeeQuoter is a central component in Chainlink CCIP that maintains token and - Token Pools are deployed by token developers and exist independently of the core CCIP programs. - Token Pools are programs that interact with SPL token programs. -- Token pools follow standard models (Lock/Release and Burn/Mint), with audited code available in the [CCIP repository](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs). +- Token pools follow standard models (Lock/Release and Burn/Mint), with audited code available in the [CCIP repository](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs). - For tokens requiring bespoke logic before burn/mint/lock/release, custom pools can be built on top of the base pools. More details are available in the CCT documentation. ## Risk Management Network diff --git a/src/content/ccip/concepts/cross-chain-token/svm/token-pools.mdx b/src/content/ccip/concepts/cross-chain-token/svm/token-pools.mdx index 91605966cab..078ebc97c58 100644 --- a/src/content/ccip/concepts/cross-chain-token/svm/token-pools.mdx +++ b/src/content/ccip/concepts/cross-chain-token/svm/token-pools.mdx @@ -55,7 +55,7 @@ Before diving into the technical details, it's important to understand your thre **Who should use this:** Projects that need control over upgrade timing or have specific governance requirements. -**How it works:** You compile and deploy the Chainlink-provided [BurnMint](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/burnmint-token-pool) or [LockRelease](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/lockrelease-token-pool) programs to your chosen address, retaining upgrade authority. +**How it works:** You compile and deploy the Chainlink-provided [BurnMint](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/burnmint-token-pool) or [LockRelease](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/lockrelease-token-pool) programs to your chosen address, retaining upgrade authority. ### Approach 3: Custom Token Pools @@ -75,7 +75,7 @@ Before diving into the technical details, it's important to understand your thre Before implementing token pools, you need to choose the appropriate [token handling mechanism](/ccip/concepts/cross-chain-token/overview#token-handling-mechanisms) for your cross-chain token transfers. This strategic decision determines which combination of token pools you'll deploy on source and destination blockchains. -The table below summarizes the different token handling mechanisms and the [recommended token pools](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs) to deploy for each scenario, ensuring a seamless token transfer process. +The table below summarizes the different token handling mechanisms and the [recommended token pools](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs) to deploy for each scenario, ensuring a seamless token transfer process. | Token Handling Mechanism | Source Blockchain Token Pool Type | Destination Blockchain Token Pool Type | How it Works | | ------------------------ | --------------------------------- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -506,7 +506,7 @@ Understanding who can call which instructions is critical for secure pool operat - You have operational capacity to monitor and maintain pool liquidity levels - Your token participates in [Lock and Mint/Burn and Unlock](/ccip/concepts/cross-chain-token/overview#burn-and-unlock) or [Lock and Unlock](/ccip/concepts/cross-chain-token/overview#lock-and-unlock) token handling mechanisms -Both pool types are built on the shared [`base-token-pool`](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/base-token-pool) foundation, which provides common functionality including [rate limiting](/ccip/concepts/cross-chain-token/overview#token-pool-rate-limits), allowlists, cross-chain configuration, and event handling. +Both pool types are built on the shared [`base-token-pool`](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/base-token-pool) foundation, which provides common functionality including [rate limiting](/ccip/concepts/cross-chain-token/overview#token-pool-rate-limits), allowlists, cross-chain configuration, and event handling. ## Next Steps: Pool Configuration @@ -588,7 +588,7 @@ When CCIP interacts with your custom token pools, it expects the presence of the #### Integration with Base Token Pool -All custom token pools should integrate the [`base-token-pool`](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/base-token-pool) library for core functionality: +All custom token pools should integrate the [`base-token-pool`](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/base-token-pool) library for core functionality: - **Ownership management**: Pool ownership and proposed ownership transfers - **Rate limiting**: Inbound and outbound rate limit controls per destination chain @@ -642,9 +642,9 @@ All standard token pools (BurnMint, LockRelease) automatically call [`to_svm_tok **Implementation References:** -- [BurnMint Token Pool](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/burnmint-token-pool) - Standard burn/mint implementation -- [LockRelease Token Pool](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/lockrelease-token-pool) - Standard lock/release implementation -- [Base Token Pool Library](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/base-token-pool) - Shared functionality foundation +- [BurnMint Token Pool](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/burnmint-token-pool) - Standard burn/mint implementation +- [LockRelease Token Pool](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/lockrelease-token-pool) - Standard lock/release implementation +- [Base Token Pool Library](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/base-token-pool) - Shared functionality foundation **Testing and Validation:** diff --git a/src/content/ccip/llms-full.txt b/src/content/ccip/llms-full.txt index d92c281e99c..e29504ea5ba 100644 --- a/src/content/ccip/llms-full.txt +++ b/src/content/ccip/llms-full.txt @@ -1441,7 +1441,7 @@ This section provides more detail on the Onchain components. **Additional Resources**: -- CCIP provides program examples for a Sender/Receiver in the [Programs folder](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs). +- CCIP provides program examples for a Sender/Receiver in the [Programs folder](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs). ## Router @@ -1571,7 +1571,7 @@ The FeeQuoter is a central component in Chainlink CCIP that maintains token and - Token Pools are deployed by token developers and exist independently of the core CCIP programs. - Token Pools are programs that interact with SPL token programs. -- Token pools follow standard models (Lock/Release and Burn/Mint), with audited code available in the [CCIP repository](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs). +- Token pools follow standard models (Lock/Release and Burn/Mint), with audited code available in the [CCIP repository](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs). - For tokens requiring bespoke logic before burn/mint/lock/release, custom pools can be built on top of the base pools. More details are available in the CCT documentation. ## Risk Management Network @@ -3016,7 +3016,7 @@ Before diving into the technical details, it's important to understand your thre **Who should use this:** Projects that need control over upgrade timing or have specific governance requirements. -**How it works:** You compile and deploy the Chainlink-provided [BurnMint](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/burnmint-token-pool) or [LockRelease](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/lockrelease-token-pool) programs to your chosen address, retaining upgrade authority. +**How it works:** You compile and deploy the Chainlink-provided [BurnMint](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/burnmint-token-pool) or [LockRelease](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/lockrelease-token-pool) programs to your chosen address, retaining upgrade authority. ### Approach 3: Custom Token Pools @@ -3036,7 +3036,7 @@ Before diving into the technical details, it's important to understand your thre Before implementing token pools, you need to choose the appropriate [token handling mechanism](/ccip/concepts/cross-chain-token/overview#token-handling-mechanisms) for your cross-chain token transfers. This strategic decision determines which combination of token pools you'll deploy on source and destination blockchains. -The table below summarizes the different token handling mechanisms and the [recommended token pools](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs) to deploy for each scenario, ensuring a seamless token transfer process. +The table below summarizes the different token handling mechanisms and the [recommended token pools](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs) to deploy for each scenario, ensuring a seamless token transfer process. | Token Handling Mechanism | Source Blockchain Token Pool Type | Destination Blockchain Token Pool Type | How it Works | | ------------------------ | --------------------------------- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -3455,7 +3455,7 @@ Understanding who can call which instructions is critical for secure pool operat - You have operational capacity to monitor and maintain pool liquidity levels - Your token participates in [Lock and Mint/Burn and Unlock](/ccip/concepts/cross-chain-token/overview#burn-and-unlock) or [Lock and Unlock](/ccip/concepts/cross-chain-token/overview#lock-and-unlock) token handling mechanisms -Both pool types are built on the shared [`base-token-pool`](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/base-token-pool) foundation, which provides common functionality including [rate limiting](/ccip/concepts/cross-chain-token/overview#token-pool-rate-limits), allowlists, cross-chain configuration, and event handling. +Both pool types are built on the shared [`base-token-pool`](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/base-token-pool) foundation, which provides common functionality including [rate limiting](/ccip/concepts/cross-chain-token/overview#token-pool-rate-limits), allowlists, cross-chain configuration, and event handling. ## Next Steps: Pool Configuration @@ -3537,7 +3537,7 @@ When CCIP interacts with your custom token pools, it expects the presence of the #### Integration with Base Token Pool -All custom token pools should integrate the [`base-token-pool`](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/base-token-pool) library for core functionality: +All custom token pools should integrate the [`base-token-pool`](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/base-token-pool) library for core functionality: - **Ownership management**: Pool ownership and proposed ownership transfers - **Rate limiting**: Inbound and outbound rate limit controls per destination chain @@ -3591,9 +3591,9 @@ All standard token pools (BurnMint, LockRelease) automatically call [`to_svm_tok **Implementation References:** -- [BurnMint Token Pool](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/burnmint-token-pool) - Standard burn/mint implementation -- [LockRelease Token Pool](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/lockrelease-token-pool) - Standard lock/release implementation -- [Base Token Pool Library](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/base-token-pool) - Shared functionality foundation +- [BurnMint Token Pool](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/burnmint-token-pool) - Standard burn/mint implementation +- [LockRelease Token Pool](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/lockrelease-token-pool) - Standard lock/release implementation +- [Base Token Pool Library](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/base-token-pool) - Shared functionality foundation **Testing and Validation:** @@ -5994,7 +5994,7 @@ If you have existing token(s) that you've already deployed, you can use the Toke Before selecting a token pool type, be sure to review [CCIP token handling mechanisms](/ccip/concepts/cross-chain-token/overview#token-handling-mechanisms). -3. On the **Networks** page, select the additional blockchain networks where you'd like to deploy your new token. For additional networks, Token Manager Wizard workflow automatically configures all tokens with the Burn & Mint mechanism. (Refer to the [token contract](https://github.com/smartcontractkit/chainlink/blob/contracts-ccip/v1.6.0-beta.0/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol) and [token pool contract](https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/ccip/pools/BurnMintTokenPool.sol) for the Burn & Mint mechanism.) +3. On the **Networks** page, select the additional blockchain networks where you'd like to deploy your new token. For additional networks, Token Manager Wizard workflow automatically configures all tokens with the Burn & Mint mechanism. (Refer to the [token contract](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol) and [token pool contract](https://github.com/smartcontractkit/chainlink-ccip/tree/contracts-ccip-v1.6.1/chains/evm/contracts/pools/BurnMintTokenPool.sol) for the Burn & Mint mechanism.) 4. On the **Summary** page, each network you've selected appears along with an expandable list of the transactions the Token Manager will guide you through to deploy your token for each network. @@ -6390,7 +6390,7 @@ In this tutorial, you will use Chainlink CCIP to transfer tokens directly from y ## Before you begin -1. [Install Node.js 18](https://nodejs.org/en/download/). Optionally, you can use the [nvm package](https://www.npmjs.com/package/nvm) to switch between Node.js versions with `nvm use 18`. +1. [Install Node.js 22](https://nodejs.org/en/download/). Optionally, you can use the [nvm package](https://www.npmjs.com/package/nvm) to switch between Node.js versions with `nvm use 22`. ```shell node -v @@ -6398,7 +6398,7 @@ In this tutorial, you will use Chainlink CCIP to transfer tokens directly from y ```shell $ node -v - v18.7.0 + v22.15.0 ``` 2. Your [EOA (Externally Owned Account)](https://ethereum.org/en/developers/docs/accounts/#types-of-account) must have both AVAX and LINK tokens on *Avalanche Fuji* to pay for the gas fees and CCIP fees. @@ -6756,7 +6756,6 @@ These tutorials demonstrate how to use [CCIP Tools](https://github.com/smartcont - [Transfer Tokens Between EOAs](/ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa): Learn how to transfer tokens between Externally Owned Accounts (EOAs) across different blockchains using Chainlink CCIP. - [Check CCIP Message Status Off-Chain](/ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain): Learn how to verify the status of Chainlink CCIP messages off-chain. -- [Get Supported Tokens](/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens): Learn how to retrieve the list of supported tokens that can be transferred between chains using Chainlink CCIP. --- @@ -6775,7 +6774,7 @@ In this tutorial, you will use Chainlink CCIP to transfer tokens directly from y ## Before you begin -1. [Install Node.js 18](https://nodejs.org/en/download/). Optionally, you can use the [nvm package](https://www.npmjs.com/package/nvm) to switch between Node.js versions with `nvm use 18`. +1. [Install Node.js 22](https://nodejs.org/en/download/). Optionally, you can use the [nvm package](https://www.npmjs.com/package/nvm) to switch between Node.js versions with `nvm use 22`. ```shell node -v @@ -6783,14 +6782,14 @@ In this tutorial, you will use Chainlink CCIP to transfer tokens directly from y ```shell $ node -v - v18.7.0 + v22.15.0 ``` 2. Your [EOA (Externally Owned Account)](https://ethereum.org/en/developers/docs/accounts/#types-of-account) must have both AVAX and LINK tokens on *Avalanche Fuji* to pay for the gas fees and CCIP fees. - [Configure MetaMask to use LINK tokens](/resources/acquire-link#configure-metamask-to-use-link-tokens) - Acquire testnet AVAX and LINK from [faucets.chain.link/fuji](https://faucets.chain.link/fuji) -3. Check the [CCIP Directory](/ccip/directory) to confirm that the tokens you will transfer are supported for your lane. In this example, you will transfer tokens from *Avalanche Fuji* to *Ethereum Sepolia* so check the list of supported tokens [here](/ccip/directory/testnet/chain/avalanche-fuji-testnet). Alternatively, you can use the [Get Supported Tokens](/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens) tutorial to retrieve the list of supported tokens programmatically. +3. Check the [CCIP Directory](/ccip/directory) to confirm that the tokens you will transfer are supported for your lane. In this example, you will transfer tokens from *Avalanche Fuji* to *Ethereum Sepolia* so check the list of supported tokens [here](/ccip/directory/testnet/chain/avalanche-fuji-testnet). 4. Learn how to [acquire CCIP test tokens](/ccip/test-tokens#evm-chains). After following this guide, your [EOA (Externally Owned Account)](https://ethereum.org/en/developers/docs/accounts/#types-of-account) should have CCIP-BnM tokens, and CCIP-BnM should appear in the list of your tokens in MetaMask. @@ -6810,7 +6809,7 @@ In this tutorial, you will use Chainlink CCIP to transfer tokens directly from y 7. To make sure that the installation is correct and the `ccip-tools` CLI commands are available, run the following command: ```shell - ./dist/ccip-tools-ts --help + ./ccip-cli/ccip-cli --help ``` 8. Inside the project's root folder, i.e., `ccip-tools-ts`, create a `.env` file and add two environment variables to store the RPC URLs: @@ -6845,7 +6844,7 @@ In this example, you will transfer CCIP-BnM tokens from your EOA on *Avalanche F For this example, CCIP fees are paid in LINK tokens. To learn how to pay CCIP fees in native AVAX, read the [Pay in native](#transfer-tokens-and-pay-in-native) section. To transfer tokens and pay in LINK, use the following command: ``` -./src/index.ts send <source> <router> <dest> \ +./ccip-cli/ccip-cli send <source> <router> <dest> \ --receiver <destinationAccount> \ --fee-token <feeTokenAddress> \ --transfer-tokens <tokenAddress>=<amount> @@ -6856,7 +6855,7 @@ For this example, CCIP fees are paid in LINK tokens. To learn how to pay CCIP fe If you have Foundry installed and have imported your private key into an encrypted keystore using the [`cast wallet import`](https://book.getfoundry.sh/reference/cast/cast-wallet-import) command, you can pass the path to that keystore file as the value of the `--wallet` flag in your command, like this: ``` - ./src/index.ts send <source> <router> <dest> \ + ./ccip-cli/ccip-cli send <source> <router> <dest> \ --receiver <destinationAccount> \ --fee-token <feeTokenAddress> \ --transfer-tokens <tokenAddress>=<amount> \ @@ -6877,7 +6876,7 @@ For this example, CCIP fees are paid in LINK tokens. To learn how to pay CCIP fe For example, `43113` for *Avalanche Fuji* or `11155111` for *Ethereum Sepolia*. You can also use the network name, such as `avalanche-testnet-fuji` or `ethereum-testnet-sepolia`. You can find the supported network names and chain IDs that can be used for `source` in the - [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/src/lib/selectors.ts) file of the + [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/ccip-sdk/src/selectors.ts) file of the `ccip-tools` repository. - `router`: Router contract address on the source network. @@ -6887,7 +6886,7 @@ For this example, CCIP fees are paid in LINK tokens. To learn how to pay CCIP fe For example, `43113` for *Avalanche Fuji* or `11155111` for *Ethereum Sepolia*. You can also use the network name, such as `avalanche-testnet-fuji` or `ethereum-testnet-sepolia`. You can find the supported network names and chain IDs that can be used for `dest` in the - [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/src/lib/selectors.ts) file of the + [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/ccip-sdk/src/selectors.ts) file of the `ccip-tools` repository. - `destinationAccount`: Address of the destination account on the destination network. Skip this argument to use the same address as the source account. @@ -6907,7 +6906,7 @@ Complete the following steps in your terminal: 1. Send 0.001 CCIP-BnM from your EOA on *Avalanche Fuji* to another account on *Ethereum Sepolia*: ``` - ./src/index.ts send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ + ./ccip-cli/ccip-cli send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ --receiver 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf \ --fee-token 0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846 \ --transfer-tokens 0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4=0.001 \ @@ -6918,7 +6917,7 @@ Complete the following steps in your terminal: | Argument | Explanation | | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | ./src/index.ts send | This executes the `send` command of the `ccip-tools`. | + | ./ccip-cli/ccip-cli send | This executes the `send` command of the `ccip-tools`. | | 43113 | This specifies the source blockchain, in this case, *Avalanche Fuji*. | | 0xF694E193200268f9a4868e4Aa017A0118C9a8177 | This specifies the router address on the source blockchain, in this case, *Avalanche Fuji*. | | 11155111 | This specifies the destination blockchain, which is *Ethereum Sepolia* in this case. | @@ -6934,15 +6933,14 @@ Complete the following steps in your terminal: 2. Once you execute the command, you should see the following logs: ``` - $ ./src/index.ts send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ + $ ./ccip-cli/ccip-cli send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ --receiver 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf \ --fee-token 0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846 \ --transfer-tokens 0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4=0.001 \ --gas-limit 0 - Approving 1000000000000000n 0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4 for 0xF694E193200268f9a4868e4Aa017A0118C9a8177 = 0xa3fd8053a74b71f34c4c280f10fdcba51ea105093998f8349db14485473da912 - Approving 23112499163862214n 0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846 for 0xF694E193200268f9a4868e4Aa017A0118C9a8177 = 0xb21d2822c7211a6bd39310ae78f4b59ef54ed6271fea21c949d9be78a30f12a7 - Sending message to 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf @ ethereum-testnet-sepolia , tx_hash = 0x70858cfeadcfbd1404a65dd4116b549801bde3d184eb324f895529286e15249a + Fee: 133133029529487157n = 0.133133029529487157 LINK + 🚀 Sending message to 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf @ ethereum-testnet-sepolia , tx => 0x76a472470de779bef81843abeb3e1d0541bf35d63f23b3229857638764f3e149 , messageId => 0xf6ae12f8cf81d389613a8de82b1fd1b39542a2c99a58a1c580be7b8dc0603f9d Lane: ┌────────────────┬──────────────────────────────────────────────┬────────────────────────────┐ │ (index) │ source │ dest │ @@ -6956,21 +6954,22 @@ Complete the following steps in your terminal: ┌─────────────────┬──────────────────────────────────────────────────────────────────────┐ │ (index) │ Values │ ├─────────────────┼──────────────────────────────────────────────────────────────────────┤ - │ messageId │ '0x934f57925b5d8fbc763c2a06dfe2d003676816f8ea67392d3e7888a45469d4c1' │ + │ messageId │ '0xf6ae12f8cf81d389613a8de82b1fd1b39542a2c99a58a1c580be7b8dc0603f9d' │ │ origin │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA' │ │ sender │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA' │ │ receiver │ '0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf' │ - │ sequenceNumber │ 3859 │ - │ nonce │ 17 │ - │ gasLimit │ 0 │ - │ transactionHash │ '0x70858cfeadcfbd1404a65dd4116b549801bde3d184eb324f895529286e15249a' │ - │ logIndex │ 6 │ - │ blockNumber │ 41234897 │ - │ timestamp │ '2025-06-02 16:19:51 (10s ago)' │ + │ sequenceNumber │ 7388n │ + │ nonce │ 21n │ + │ gasLimit │ 0n │ + │ transactionHash │ '0x76a472470de779bef81843abeb3e1d0541bf35d63f23b3229857638764f3e149' │ + │ logIndex │ 14 │ + │ blockNumber │ 49144482 │ + │ timestamp │ '2025-12-16 14:31:03 (7s ago)' │ │ finalized │ true │ - │ fee │ '0.023112499163862214 LINK' │ + │ fee │ '0.133133029529487157 LINK' │ │ tokens │ '0.001 CCIP-BnM' │ │ data │ '0x' │ + │ strict │ false │ └─────────────────┴──────────────────────────────────────────────────────────────────────┘ ``` @@ -6996,7 +6995,7 @@ For this example, CCIP fees are paid in Avalanche Fuji's native AVAX. To learn h To transfer tokens and pay in native, use the following command: ``` -./src/index.ts send <source> <router> <dest> \ +./ccip-cli/ccip-cli send <source> <router> <dest> \ --receiver <destinationAccount> \ --transfer-tokens <tokenAddress>=<amount> \ --gas-limit 0 @@ -7006,7 +7005,7 @@ To transfer tokens and pay in native, use the following command: If you have Foundry installed and have imported your private key into an encrypted keystore using the [`cast wallet import`](https://book.getfoundry.sh/reference/cast/cast-wallet-import) command, you can pass the path to that keystore file as the value of the `--wallet` flag in your command, like this: ``` - ./src/index.ts send <source> <router> <dest> \ + ./ccip-cli/ccip-cli send <source> <router> <dest> \ --receiver <destinationAccount> \ --transfer-tokens <tokenAddress>=<amount> \ --gas-limit 0 \ @@ -7027,7 +7026,7 @@ Complete the following steps in your terminal: 1. Send 0.001 CCIP-BnM from your EOA on *Avalanche Fuji* to another account on *Ethereum Sepolia*: ``` - ./src/index.ts send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ + ./ccip-cli/ccip-cli send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ --receiver 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf \ --transfer-tokens 0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4=0.001 \ --gas-limit 0 @@ -7037,7 +7036,7 @@ Complete the following steps in your terminal: | Argument | Explanation | | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | ./src/index.ts send | This executes the `send` command of the `ccip-tools`. | + | ./ccip-cli/ccip-cli send | This executes the `send` command of the `ccip-tools`. | | 43113 | This specifies the source blockchain, in this case, *Avalanche Fuji*. | | 0xF694E193200268f9a4868e4Aa017A0118C9a8177 | This specifies the router address on the source blockchain, in this case, *Avalanche Fuji*. | | 11155111 | This specifies the destination blockchain, which is *Ethereum Sepolia* in this case. | @@ -7051,13 +7050,13 @@ Complete the following steps in your terminal: 2. After you execute the command, you should see the following logs: ``` - $ ./src/index.ts send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ + $ ./ccip-cli/ccip-cli send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ --receiver 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf \ --transfer-tokens 0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4=0.001 \ --gas-limit 0 - Approving 1000000000000000n 0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4 for 0xF694E193200268f9a4868e4Aa017A0118C9a8177 = 0x1ea6d165cf627fd4f6856520fc9afa2e08c4e04f79fd78bf7f4ef7da94692503 - Sending message to 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf @ ethereum-testnet-sepolia , tx_hash = 0x0a00f9240b6860e34a0664ad0aa8f8e86877d70b97e9787e08e270bea564edce + Fee: 104497184834156911n = 0.104497184834156911 AVAX + 🚀 Sending message to 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf @ ethereum-testnet-sepolia , tx => 0xcefd14da01d3d607ba98dae33b2941ef07499051eaa61e3a417b5734d91ad021 , messageId => 0xb9672cd93b24b9071c2eee11b27daca00dbdac58239c40bca06c23fbb172e992 Lane: ┌────────────────┬──────────────────────────────────────────────┬────────────────────────────┐ │ (index) │ source │ dest │ @@ -7071,21 +7070,22 @@ Complete the following steps in your terminal: ┌─────────────────┬──────────────────────────────────────────────────────────────────────┐ │ (index) │ Values │ ├─────────────────┼──────────────────────────────────────────────────────────────────────┤ - │ messageId │ '0xd902134a69bff565005c354996386479f9b1204b1810f49e27abc8c413c64312' │ + │ messageId │ '0xb9672cd93b24b9071c2eee11b27daca00dbdac58239c40bca06c23fbb172e992' │ │ origin │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA' │ │ sender │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA' │ │ receiver │ '0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf' │ - │ sequenceNumber │ 3861 │ - │ nonce │ 18 │ - │ gasLimit │ 0 │ - │ transactionHash │ '0x0a00f9240b6860e34a0664ad0aa8f8e86877d70b97e9787e08e270bea564edce' │ - │ logIndex │ 11 │ - │ blockNumber │ 41235059 │ - │ timestamp │ '2025-06-02 16:25:12 (7s ago)' │ + │ sequenceNumber │ 7389n │ + │ nonce │ 22n │ + │ gasLimit │ 0n │ + │ transactionHash │ '0xcefd14da01d3d607ba98dae33b2941ef07499051eaa61e3a417b5734d91ad021' │ + │ logIndex │ 16 │ + │ blockNumber │ 49144702 │ + │ timestamp │ '2025-12-16 14:36:00 (6s ago)' │ │ finalized │ true │ - │ fee │ '0.019124641265363576 WAVAX' │ + │ fee │ '0.104497184834156911 WAVAX' │ │ tokens │ '0.001 CCIP-BnM' │ │ data │ '0x' │ + │ strict │ false │ └─────────────────┴──────────────────────────────────────────────────────────────────────┘ ``` @@ -7108,7 +7108,7 @@ Complete the following steps in your terminal: Source: https://docs.chain.link/ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain Last Updated: 2025-05-19 -In this tutorial, you will learn how to verify the status of a Chainlink CCIP transaction offchain using [CCIP Tools](https://github.com/smartcontractkit/ccip-tools-ts). Starting with a CCIP source transaction hash, you'll execute the [`show`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/README.md#show-default-command) command of the `ccip-tools` to query the current status of a cross-chain message. +In this tutorial, you will learn how to verify the status of a Chainlink CCIP transaction offchain using [CCIP Tools](https://github.com/smartcontractkit/ccip-tools-ts). Starting with a CCIP source transaction hash, you'll execute the [`show`](https://github.com/smartcontractkit/ccip-tools-ts/tree/main/ccip-cli#show-default-command) command of the `ccip-tools` to query the current status of a cross-chain message. ## Before you begin @@ -7117,7 +7117,7 @@ In this tutorial, you will learn how to verify the status of a Chainlink CCIP tr ## Tutorial -This tutorial shows you on how to check the status of a Chainlink CCIP transaction using the [`show`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/README.md#show-default-command) command of the `ccip-tools`. By supplying the command with the source transaction hash, you can verify the current status of your cross-chain message. +This tutorial shows you on how to check the status of a Chainlink CCIP transaction using the [`show`](https://github.com/smartcontractkit/ccip-tools-ts/tree/main/ccip-cli#show-default-command) command of the `ccip-tools`. By supplying the command with the source transaction hash, you can verify the current status of your cross-chain message. **Execute the script in your command line:** @@ -7131,7 +7131,7 @@ This tutorial shows you on how to check the status of a Chainlink CCIP transacti <Aside type="note" title="Note"> The `--page` option is used to limit the number of blocks to search for the message. The default value is `10000` - which could result in an error due to RPC limitations. Setting it to `500` is a good practice to avoid such issues. + which could result in an error due to RPC limitations. Setting it to `10` is a good practice to avoid such issues. </Aside> **Example Usage:** @@ -7139,7 +7139,7 @@ This tutorial shows you on how to check the status of a Chainlink CCIP transacti If you initiated a transaction from *Avalanche Fuji* to *Ethereum Sepolia* and received the source transaction hash, you can check the status of your CCIP message with the following command: ```text -$ ./src/index.ts show 0x980dacf245f9c6919678219e97d6ad20e0c1964795ec3801e688315f1f18defd --page 500 +$ ./ccip-cli/ccip-cli show 0xcefd14da01d3d607ba98dae33b2941ef07499051eaa61e3a417b5734d91ad021 --page 10 Lane: ┌────────────────┬──────────────────────────────────────────────┬────────────────────────────┐ @@ -7154,220 +7154,52 @@ Request (source): ┌─────────────────┬──────────────────────────────────────────────────────────────────────┐ │ (index) │ Values │ ├─────────────────┼──────────────────────────────────────────────────────────────────────┤ -│ messageId │ '0x1ce5213bf9880b18be7f44d5ab1065e603ec3a83eb1bebf76af366ed3c0de0b3' │ +│ messageId │ '0xb9672cd93b24b9071c2eee11b27daca00dbdac58239c40bca06c23fbb172e992' │ │ origin │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA' │ │ sender │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA' │ │ receiver │ '0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf' │ -│ sequenceNumber │ 3835 │ -│ nonce │ 4 │ -│ gasLimit │ 200000 │ -│ transactionHash │ '0x980dacf245f9c6919678219e97d6ad20e0c1964795ec3801e688315f1f18defd' │ -│ logIndex │ 6 │ -│ blockNumber │ 40954056 │ -│ timestamp │ '2025-05-26 16:34:14 (2h8m33s ago)' │ +│ sequenceNumber │ 7389n │ +│ nonce │ 22n │ +│ gasLimit │ 0n │ +│ transactionHash │ '0xcefd14da01d3d607ba98dae33b2941ef07499051eaa61e3a417b5734d91ad021' │ +│ logIndex │ 16 │ +│ blockNumber │ 49144702 │ +│ timestamp │ '2025-12-16 14:36:00 (24m4s ago)' │ │ finalized │ true │ -│ fee │ '0.040903083926519498 LINK' │ +│ fee │ '0.104497184834156911 WAVAX' │ │ tokens │ '0.001 CCIP-BnM' │ │ data │ '0x' │ +│ strict │ false │ └─────────────────┴──────────────────────────────────────────────────────────────────────┘ Commit (dest): ┌─────────────────┬──────────────────────────────────────────────────────────────────────┐ │ (index) │ Values │ ├─────────────────┼──────────────────────────────────────────────────────────────────────┤ -│ merkleRoot │ '0x1ce5213bf9880b18be7f44d5ab1065e603ec3a83eb1bebf76af366ed3c0de0b3' │ -│ min │ 3835 │ -│ max │ 3835 │ -│ origin │ '0x9e587c646d4f4e46B71a02179Fa8951CFB34A382' │ +│ merkleRoot │ '0xb9672cd93b24b9071c2eee11b27daca00dbdac58239c40bca06c23fbb172e992' │ +│ min │ 7389 │ +│ max │ 7389 │ +│ origin │ '0x94193d65DF1f4834081B7F1aF1ecB11CFdECc608' │ │ contract │ '0x139E06b6dBB1a0C41A1686C091795879c943765A' │ -│ transactionHash │ '0xbda1e294e59910e2929e6aec08e52426a9125c1ac20509b9d5b9441789b746b0' │ -│ blockNumber │ 8411619 │ -│ timestamp │ '2025-05-26 16:35:00 (46s after request)' │ +│ transactionHash │ '0x57020e1a913451bb9e44190452252150158ae0d71ff117e2889cf0dc99c77cee' │ +│ blockNumber │ 9853657 │ +│ timestamp │ '2025-12-16 14:36:48 (48s after request)' │ └─────────────────┴──────────────────────────────────────────────────────────────────────┘ Receipts (dest): ┌─────────────────┬──────────────────────────────────────────────────────────────────────┐ │ (index) │ Values │ ├─────────────────┼──────────────────────────────────────────────────────────────────────┤ │ state │ '✅ success' │ -│ returnData │ '0x' │ -│ origin │ '0xdA743Ce0Eb7cC541093F030A3126bF9e3d427E93' │ -│ offRamp │ '0x1DEBa99dC8e2A77832461BD386d83D9FCb133137' │ -│ transactionHash │ '0xe68ae80ed0b77d6e22f066a08c169c873dd22112ef5f27287bbe85e737c6ec60' │ -│ logIndex │ 114 │ -│ blockNumber │ 8411627 │ -│ timestamp │ '2025-05-26 16:36:36 (2m22s after request)' │ +│ origin │ '0x9Fa36294177c7adf9df4cC35fFcF0f47Dd3468D9' │ +│ contract │ '0x1DEBa99dC8e2A77832461BD386d83D9FCb133137' │ +│ transactionHash │ '0x38b5edcc7b7fc24a97120b5ac57f8023308784a5a97c92c251d3a67886197630' │ +│ logIndex │ 3 │ +│ blockNumber │ 9853664 │ +│ timestamp │ '2025-12-16 14:38:12 (2m12s after request)' │ └─────────────────┴──────────────────────────────────────────────────────────────────────┘ ``` --- -# Get Supported Tokens -Source: https://docs.chain.link/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens -Last Updated: 2025-05-19 - -In this tutorial, you will learn how to retrieve the list of supported tokens that can be transferred between chains using Chainlink CCIP, with [CCIP Tools](https://github.com/smartcontractkit/ccip-tools-ts). You'll use the [`getSupportedTokens`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/README.md#getsupportedtokens) command of `ccip-tools` to query the list of supported tokens that can be transferred from a specific source chain to a specific destination chain. - -## Before you begin - -Complete the prerequisite steps of the [Transfer Tokens between EOAs](/ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa#before-you-begin) tutorial. - -## Tutorial - -This tutorial shows you how to retrieve the list of supported tokens that can be transferred between chains using Chainlink CCIP. By supplying the [`getSupportedTokens`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/README.md#getsupportedtokens) command of `ccip-tools` with a source chain, source router address, and a destination chain, you can get the list of supported tokens that can be transferred from the source chain to the destination chain. - -**Execute the script in your command line:** - -```bash -./src/index.ts getSupportedTokens <source> <router> <dest> -``` - -**The script requires the following parameters:** - -- `source`: Chain ID or network name. - - For example, `43113` for *Avalanche Fuji* or `11155111` for *Ethereum Sepolia*. You can also use the network name, such as `avalanche-testnet-fuji` or `ethereum-testnet-sepolia`. - - You can find the supported network names and chain IDs that can be used for `source` in the - [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/src/lib/selectors.ts) file of the - `ccip-tools` repository. - -- `router`: Router contract address on the source network. - - You can find the router contract address in the [CCIP Directory](https://docs.chain.link/ccip/directory) by searching for the relevant network. - -- `dest`: Chain ID or network name. - - For example, `43113` for *Avalanche Fuji* or `11155111` for *Ethereum Sepolia*. You can also use the network name, such as `avalanche-testnet-fuji` or `ethereum-testnet-sepolia`. - - You can find the supported network names and chain IDs that can be used for `dest` in the - [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/src/lib/selectors.ts) file of the - `ccip-tools` repository. - -**Example Usage:** - -If you would like to retrieve the list of supported tokens that can be transferred from *Avalanche Fuji* to *Ethereum Sepolia*, you can run the following command: - -```text -$ ./src/index.ts getSupportedTokens 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 - -[INFO] Starting token discovery for cross-chain transfers -[INFO] Using TokenAdminRegistry 1.5.0 at 0xA92053a4a3922084d992fD2835bdBa4caC6877e6 from router 0xF694E193200268f9a4868e4Aa017A0118C9a8177 -┌────────────────────────────────────┬──────────────────────────────────────────────┐ -│ (index) │ Values │ -├────────────────────────────────────┼──────────────────────────────────────────────┤ -│ address │ '0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4' │ -│ symbol │ 'CCIP-BnM' │ -│ name │ 'CCIP-BnM' │ -│ decimals │ 18 │ -│ pool │ '0x10e3A37ff21c20CD802fdAF0204e2Ff04e5485ee' │ -│ pool.typeAndVersion │ 'BurnMintTokenPool 1.5.1' │ -│ remoteToken │ '0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05' │ -│ remotePools │ '0x4CcbDd6CF18800360161E4D2A519A2047176bDF0' │ -│ rateLimiters.outbound.tokens │ '100000.0' │ -│ rateLimiters.outbound.capacity │ '100000.0' │ -│ rateLimiters.outbound.rate │ '167.0' │ -│ rateLimiters.outbound.timeToRefill │ '9m58s' │ -│ rateLimiters.inbound.tokens │ '100000.0' │ -│ rateLimiters.inbound.capacity │ '100000.0' │ -│ rateLimiters.inbound.rate │ '167.0' │ -│ rateLimiters.inbound.timeToRefill │ '9m58s' │ -└────────────────────────────────────┴──────────────────────────────────────────────┘ -┌────────────────────────────────────┬──────────────────────────────────────────────┐ -│ (index) │ Values │ -├────────────────────────────────────┼──────────────────────────────────────────────┤ -│ address │ '0x70F5c5C40b873EA597776DA2C21929A8282A3b35' │ -│ symbol │ 'clCCIP-LnM' │ -│ name │ 'clCCIP-LnM' │ -│ decimals │ 18 │ -│ pool │ '0x8e35eB0dfb39Ec5F84254C3f863986a913171E0B' │ -│ pool.typeAndVersion │ 'BurnMintTokenPoolAndProxy 1.5.0' │ -│ remoteToken │ '0x466D489b6d36E7E3b824ef491C225F5830E81cC1' │ -│ remotePools │ '0x658FdaC59a197D5166151640b7a673F7dF1Ba324' │ -│ rateLimiters.outbound.tokens │ '100000.0' │ -│ rateLimiters.outbound.capacity │ '100000.0' │ -│ rateLimiters.outbound.rate │ '167.0' │ -│ rateLimiters.outbound.timeToRefill │ '9m58s' │ -│ rateLimiters.inbound.tokens │ '100000.0' │ -│ rateLimiters.inbound.capacity │ '100000.0' │ -│ rateLimiters.inbound.rate │ '167.0' │ -│ rateLimiters.inbound.timeToRefill │ '9m58s' │ -└────────────────────────────────────┴──────────────────────────────────────────────┘ -┌────────────────────────────────────┬──────────────────────────────────────────────┐ -│ (index) │ Values │ -├────────────────────────────────────┼──────────────────────────────────────────────┤ -│ address │ '0x5425890298aed601595a70AB815c96711a31Bc65' │ -│ symbol │ 'USDC' │ -│ name │ 'USD Coin' │ -│ decimals │ 6 │ -│ pool │ '0x5931822f394baBC2AACF4588E98FC77a9f5aa8C9' │ -│ pool.typeAndVersion │ 'USDCTokenPool 1.5.1' │ -│ remoteToken │ '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238' │ -│ remotePools[0] │ '0xb48EacF882dC4899Ae750AF4a6E2892E11866d8D' │ -│ remotePools[1] │ '0xAff3fE524ea94118EF09DaDBE3c77ba6AA0005EC' │ -│ rateLimiters.outbound.tokens │ '100000.0' │ -│ rateLimiters.outbound.capacity │ '100000.0' │ -│ rateLimiters.outbound.rate │ '167.0' │ -│ rateLimiters.outbound.timeToRefill │ '9m58s' │ -│ rateLimiters.inbound.tokens │ '100000.0' │ -│ rateLimiters.inbound.capacity │ '100000.0' │ -│ rateLimiters.inbound.rate │ '167.0' │ -│ rateLimiters.inbound.timeToRefill │ '9m58s' │ -└────────────────────────────────────┴──────────────────────────────────────────────┘ -...... -...... -...... -┌───────────────────────┬──────────────────────────────────────────────┐ -│ (index) │ Values │ -├───────────────────────┼──────────────────────────────────────────────┤ -│ address │ '0x838AB8F15867440A41C4149bcbba6ae402EfAd38' │ -│ symbol │ 'USDf' │ -│ name │ 'Falcon USD' │ -│ decimals │ 18 │ -│ pool │ '0x8210c0634AB8f273806e4b7866E9Db353773c44B' │ -│ pool.typeAndVersion │ 'BurnMintTokenPool 1.5.1' │ -│ remoteToken │ '0x3E34bFC2872534C331b6db2E4b3593FA7eaEddFd' │ -│ remotePools │ '0x21017CEC5f89fEb2c4B0F6C114E55Fa8EFDB00f2' │ -│ rateLimiters.outbound │ 'disabled' │ -│ rateLimiters.inbound │ 'disabled' │ -└───────────────────────┴──────────────────────────────────────────────┘ -┌───────────────────────┬──────────────────────────────────────────────┐ -│ (index) │ Values │ -├───────────────────────┼──────────────────────────────────────────────┤ -│ address │ '0xDA89A6C2c9f6E8d94E4a65d8AEe482908e9D709A' │ -│ symbol │ 'CCTWT' │ -│ name │ 'CCT Wizard Token' │ -│ decimals │ 18 │ -│ pool │ '0x3cD3CFAFb82a1Fd711753bb1a51F06a284bbd972' │ -│ pool.typeAndVersion │ 'BurnMintTokenPool 1.5.1' │ -│ remoteToken │ '0x74Ef0b124f192e0990B5451Ad12A4EC20FCf2B44' │ -│ remotePools │ '0x4dC3aA202138B40CC15867f2ab59153cF6FF83c4' │ -│ rateLimiters.outbound │ 'disabled' │ -│ rateLimiters.inbound │ 'disabled' │ -└───────────────────────┴──────────────────────────────────────────────┘ -┌───────────────────────┬──────────────────────────────────────────────┐ -│ (index) │ Values │ -├───────────────────────┼──────────────────────────────────────────────┤ -│ address │ '0x9BDdEBA9B0c051Ad5C1819D2F2671Af8B4D360B3' │ -│ symbol │ 'TT1' │ -│ name │ 'Test Token 1' │ -│ decimals │ 18 │ -│ pool │ '0x4Fc3534dEB27Bb61AfFFC5c02222594aF3024A61' │ -│ pool.typeAndVersion │ 'BurnMintTokenPool 1.5.1' │ -│ remoteToken │ '0x0325d145398Eeb977a55B39CC7847C48b84D93f5' │ -│ remotePools │ '0x0020267Ef0F96666A8CA236DB592547b14106807' │ -│ rateLimiters.outbound │ 'disabled' │ -│ rateLimiters.inbound │ 'disabled' │ -└───────────────────────┴──────────────────────────────────────────────┘ -Summary: totalTokens = 1070 , supportedTokens = 196 -``` - -<Aside type="note" title="Note"> - The `totalTokens` value represents the complete number of tokens registered or recognized by the system, regardless of their current usability for cross-chain transfers. In contrast, `supportedTokens` refers specifically to the subset of tokens that are currently eligible and configured for cross-chain transfers—meaning they have the necessary pools, remote mappings, and rate limiters set up. - - The difference between these numbers exists because not all tokens in the registry are ready or enabled for cross-chain operations. Some tokens may be inactive, lack required configuration, or are intentionally excluded from cross-chain support for security or operational reasons. As a result, `supportedTokens` is typically less than `totalTokens`. -</Aside> - ---- - # Cross-Chain Token (CCT) Tutorials Source: https://docs.chain.link/ccip/tutorials/evm/cross-chain-tokens Last Updated: 2025-05-19 @@ -10702,7 +10534,7 @@ Chainlink CCIP maintains a consistent [API](/ccip/api-reference/evm/v1.6.1/i-rou - The sender has to interact with the CCIP router to initiate a cross-chain transaction, similar to the process for any other token transfers. See the [Transfer Tokens](/ccip/tutorials/evm/transfer-tokens-from-contract) guide to learn more. - The process uses the same onchain components including the Router, OnRamp, Commit Store, OffRamp, and Token Pool. - The process uses the same offchain components including the Committing DON, Executing DON, and the Risk Management Network. -- USDC transfers also benefit from CCIP additional security provided by the [Risk Management Network](/ccip/concepts/architecture/key-concepts#risk-management-network). +- USDC transfers also benefit from CCIP additional security provided by the Risk Management Network. #### Native USDC (CCTP-enabled) @@ -12150,7 +11982,7 @@ To estimate the gas usage of the `ccipReceive` function within your own Hardhat 2. Create a testing file in your project's `test` directory. -3. Inside the `deployFixture` function, deploy the `MockCCIPRouter` contract and use its address to deploy your CCIP Sender and CCIP Receiver contracts. For more details, check this [example](https://github.com/smartcontractkit/smart-contract-examples/blob/ccip/estimate-gas/hardhat/test/Send-Receive.ts#L14). +3. Inside the `deployFixture` function, deploy the `MockCCIPRouter` contract and use its address to deploy your CCIP Sender and CCIP Receiver contracts. For more details, check this [example](https://github.com/smartcontractkit/smart-contract-examples/blob/main/ccip/estimate-gas/hardhat/test/Send-Receive.ts#L11). 4. In your test cases: 1. Send the CCIP message to the `MockCCIPRouter` contract. For more details, check this [example](https://github.com/smartcontractkit/smart-contract-examples/blob/main/ccip/estimate-gas/hardhat/test/Send-Receive.ts#L77). @@ -12757,7 +12589,7 @@ When implementing CCIP Receivers, follow these best practices: ## Example Implementation -For a complete, audited reference implementation of a CCIP Receiver, you can examine the [example-ccip-receiver](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/example-ccip-receiver) in the Chainlink CCIP repository. This example demonstrates all the security patterns and best practices covered in this guide and can serve as a starting point for your own implementation. +For a complete, audited reference implementation of a CCIP Receiver, you can examine the [example-ccip-receiver](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/example-ccip-receiver) in the Chainlink CCIP repository. This example demonstrates all the security patterns and best practices covered in this guide and can serve as a starting point for your own implementation. <Aside type="caution" title="Educational Example Disclaimer"> This page includes an educational example to use a Chainlink system, product, or service and is provided to @@ -15996,7 +15828,7 @@ This tutorial implements production-grade cross-chain tokens using a three-termi | Terminal | Repository | Purpose | Commands | | -------------- | --------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | ------------- | -| **Terminal 1** | [CCIP Solana base58 Generator](https://github.com/smartcontractkit/ccip-solana-base58-generator) | Generate governance transactions | `pnpm bs58` | +| **Terminal 1** | [CCIP Solana base58 Generator](https://github.com/smartcontractkit/ccip-solana-bs58-generator) | Generate governance transactions | `pnpm bs58` | | **Terminal 2** | [Smart Contract Examples (Hardhat)](https://github.com/smartcontractkit/smart-contract-examples/tree/main/ccip/cct/hardhat) | Deploy EVM components | `npx hardhat` | | **Terminal 3** | [Solana Starter Kit](https://github.com/smartcontractkit/solana-starter-kit) | Test cross-chain transfers | `yarn` | @@ -17105,7 +16937,7 @@ This tutorial implements production-grade cross-chain tokens using a three-termi | Terminal | Repository | Purpose | Commands | | -------------- | --------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | ------------- | -| **Terminal 1** | [CCIP Solana base58 Generator](https://github.com/smartcontractkit/ccip-solana-base58-generator) | Generate governance transactions | `pnpm bs58` | +| **Terminal 1** | [CCIP Solana base58 Generator](https://github.com/smartcontractkit/ccip-solana-bs58-generator) | Generate governance transactions | `pnpm bs58` | | **Terminal 2** | [Smart Contract Examples (Hardhat)](https://github.com/smartcontractkit/smart-contract-examples/tree/main/ccip/cct/hardhat) | Deploy EVM components | `npx hardhat` | | **Terminal 3** | [Solana Starter Kit](https://github.com/smartcontractkit/solana-starter-kit) | Test cross-chain transfers | `yarn` | @@ -19853,7 +19685,7 @@ A programmable token transfer combines the features of a token transfer and an a <Aside title="Disclaimer" type="caution"> The `ccip_message_receiver` module used in this tutorial **should only be used with non-dispatchable tokens**, as it is currently incompatible with [dispatchable - tokens](https://aptosfoundation.org/currents/dispatchable-fungible-assets-101). + tokens](https://aptos.dev/build/smart-contracts/fungible-asset#dispatchable-fungible-asset-advanced). </Aside> This tutorial uses the `ccip_message_receiver` module from the `aptos-starter-kit`. Its `ccip_receive` function contains dispatcher logic. For this tutorial, we will trigger the part of its logic that handles a message containing both tokens and data. @@ -21167,7 +20999,7 @@ Source: https://docs.chain.link/ccip/api-reference/evm/v1.6.1/i-type-and-version An interface that provides type and version information for contracts. -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/interfaces/ITypeAndVersion.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/interfaces/ITypeAndVersion.sol) ## Functions @@ -25375,7 +25207,7 @@ Source: https://docs.chain.link/ccip/api-reference/evm/v1.6.1/burn-mint-erc20 An ERC20-compliant token contract that extends the standard functionality with controlled minting and burning capabilities through role-based access control. -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol) <Aside> Key features of this token contract: @@ -26290,7 +26122,7 @@ Source: https://docs.chain.link/ccip/api-reference/evm/v1.6.1/ownable-2-step A minimal contract that implements 2-step ownership transfer and nothing more. It's made to be minimal to reduce the impact of the bytecode size on any contract that inherits from it. -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/access/Ownable2Step.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/access/Ownable2Step.sol) <Aside type="note"> This contract implements a secure two-step ownership transfer process: @@ -26555,7 +26387,7 @@ A contract that facilitates two-step ownership transfer, providing enhanced secu This prevents accidental transfers to incorrect or inaccessible addresses. </Aside> -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/access/Ownable2StepMsgSender.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/access/Ownable2StepMsgSender.sol) ## Functions @@ -27264,7 +27096,7 @@ Source: https://docs.chain.link/ccip/api-reference/evm/v1.6.0/i-type-and-version An interface that provides type and version information for contracts. -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/interfaces/ITypeAndVersion.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/interfaces/ITypeAndVersion.sol) ## Functions @@ -31448,7 +31280,7 @@ Source: https://docs.chain.link/ccip/api-reference/evm/v1.6.0/burn-mint-erc20 An ERC20-compliant token contract that extends the standard functionality with controlled minting and burning capabilities through role-based access control. -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol) <Aside> Key features of this token contract: @@ -32363,7 +32195,7 @@ Source: https://docs.chain.link/ccip/api-reference/evm/v1.6.0/ownable-2-step A minimal contract that implements 2-step ownership transfer and nothing more. It's made to be minimal to reduce the impact of the bytecode size on any contract that inherits from it. -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/access/Ownable2Step.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/access/Ownable2Step.sol) <Aside type="note"> This contract implements a secure two-step ownership transfer process: @@ -32628,7 +32460,7 @@ A contract that facilitates two-step ownership transfer, providing enhanced secu This prevents accidental transfers to incorrect or inaccessible addresses. </Aside> -[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-release/1.4.0/contracts/src/v0.8/shared/access/Ownable2StepMsgSender.sol) +[Git Source](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/access/Ownable2StepMsgSender.sol) ## Functions @@ -42853,7 +42685,7 @@ Source: https://docs.chain.link/ccip/api-reference/svm/v1.6.0/router ## Router -[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/ccip-router) +[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/ccip-router) Below is a complete API reference for the CCIP Router program instructions. @@ -43297,7 +43129,7 @@ Source: https://docs.chain.link/ccip/api-reference/svm/v1.6.0/receiver ## Receiver -[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/example-ccip-receiver) +[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/example-ccip-receiver) Below is a complete API reference for the `ccip_receive` instruction that must be implemented by any Solana program wishing to receive CCIP messages. @@ -43506,7 +43338,7 @@ Source: https://docs.chain.link/ccip/api-reference/svm/v1.6.0/base-token-pool ## Base Token Pool Library -[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/base-token-pool) +[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/base-token-pool) The Base Token Pool library provides foundational components and shared functionality for CCIP token pool implementations on SVM-based blockchains. This library is not deployable as a standalone program but serves as a dependency for concrete token pool implementations like BurnMint and Lock-Release pools. @@ -43957,7 +43789,7 @@ Source: https://docs.chain.link/ccip/api-reference/svm/v1.6.0/burn-mint-token-po ## BurnMint Token Pool -[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/burnmint-token-pool) +[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/burnmint-token-pool) Below is a complete API reference for the CCIP BurnMint Token Pool program instructions. This pool implementation burns tokens on the source chain and mints them on the destination chain. @@ -44628,7 +44460,7 @@ Source: https://docs.chain.link/ccip/api-reference/svm/v1.6.0/lock-release-token ## Lock-Release Token Pool -[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/lockrelease-token-pool) +[Git Source](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/lockrelease-token-pool) The Lock-Release Token Pool program implements a token pool that uses a lock/release strategy for cross-chain transfers. When tokens are sent cross-chain, they are locked in the pool on the source chain and released from the pool on the destination chain. @@ -61755,7 +61587,6 @@ You can explore several comprehensive guides to learn about cross-chain interope - [Using CCIP CLI](/ccip/tutorials/evm/offchain/ccip-tools) - [Transfer Tokens between EOAs](/ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa) - [Checking CCIP Message Status](/ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain) - - [Get Supported Tokens](/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens) - [Transfer USDC with Data](/ccip/tutorials/evm/usdc) - [Send Arbitrary Data](/ccip/tutorials/evm/send-arbitrary-data) - [Send Arbitrary Data and Receive Transfer Confirmation: A -> B -> A](/ccip/tutorials/evm/send-arbitrary-data-receipt-acknowledgment) @@ -61765,6 +61596,174 @@ You can explore several comprehensive guides to learn about cross-chain interope --- +# Get Supported Tokens +Source: https://docs.chain.link/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens +Last Updated: 2025-05-19 + +In this tutorial, you will learn how to retrieve the list of supported tokens that can be transferred between chains using Chainlink CCIP, with [CCIP Tools](https://github.com/smartcontractkit/ccip-tools-ts). You'll use the [`getSupportedTokens`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/ccip-cli/README.md#getsupportedtokens) command of `ccip-tools` to query the list of supported tokens that can be transferred from a specific source chain to a specific destination chain. + +## Before you begin + +Complete the prerequisite steps of the [Transfer Tokens between EOAs](/ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa#before-you-begin) tutorial. + +## Tutorial + +This tutorial shows you how to retrieve the list of supported tokens that can be transferred between chains using Chainlink CCIP. By supplying the [`getSupportedTokens`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/ccip-cli/README.md#getsupportedtokens) command of `ccip-tools` with a source chain, source router address, and a destination chain, you can get the list of supported tokens that can be transferred from the source chain to the destination chain. + +**Execute the script in your command line:** + +```bash +./ccip-cli/ccip-cli getSupportedTokens <source> <router> <dest> +``` + +**The script requires the following parameters:** + +- `source`: Chain ID or network name. + + For example, `43113` for *Avalanche Fuji* or `11155111` for *Ethereum Sepolia*. You can also use the network name, such as `avalanche-testnet-fuji` or `ethereum-testnet-sepolia`. + + You can find the supported network names and chain IDs that can be used for `source` in the + [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/ccip-sdk/src/selectors.ts) file of the + `ccip-tools` repository. + +- `router`: Router contract address on the source network. + + You can find the router contract address in the [CCIP Directory](https://docs.chain.link/ccip/directory) by searching for the relevant network. + +- `dest`: Chain ID or network name. + + For example, `43113` for *Avalanche Fuji* or `11155111` for *Ethereum Sepolia*. You can also use the network name, such as `avalanche-testnet-fuji` or `ethereum-testnet-sepolia`. + + You can find the supported network names and chain IDs that can be used for `dest` in the + [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/ccip-sdk/src/selectors.ts) file of the + `ccip-tools` repository. + +**Example Usage:** + +If you would like to retrieve the list of supported tokens that can be transferred from *Avalanche Fuji* to *Ethereum Sepolia*, you can run the following command: + +```text +$ ./ccip-cli/ccip-cli getSupportedTokens 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 + +[INFO] Starting token discovery for cross-chain transfers +[INFO] Using TokenAdminRegistry 1.5.0 at 0xA92053a4a3922084d992fD2835bdBa4caC6877e6 from router 0xF694E193200268f9a4868e4Aa017A0118C9a8177 +┌────────────────────────────────────┬──────────────────────────────────────────────┐ +│ (index) │ Values │ +├────────────────────────────────────┼──────────────────────────────────────────────┤ +│ address │ '0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4' │ +│ symbol │ 'CCIP-BnM' │ +│ name │ 'CCIP-BnM' │ +│ decimals │ 18 │ +│ pool │ '0x10e3A37ff21c20CD802fdAF0204e2Ff04e5485ee' │ +│ pool.typeAndVersion │ 'BurnMintTokenPool 1.5.1' │ +│ remoteToken │ '0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05' │ +│ remotePools │ '0x4CcbDd6CF18800360161E4D2A519A2047176bDF0' │ +│ rateLimiters.outbound.tokens │ '100000.0' │ +│ rateLimiters.outbound.capacity │ '100000.0' │ +│ rateLimiters.outbound.rate │ '167.0' │ +│ rateLimiters.outbound.timeToRefill │ '9m58s' │ +│ rateLimiters.inbound.tokens │ '100000.0' │ +│ rateLimiters.inbound.capacity │ '100000.0' │ +│ rateLimiters.inbound.rate │ '167.0' │ +│ rateLimiters.inbound.timeToRefill │ '9m58s' │ +└────────────────────────────────────┴──────────────────────────────────────────────┘ +┌────────────────────────────────────┬──────────────────────────────────────────────┐ +│ (index) │ Values │ +├────────────────────────────────────┼──────────────────────────────────────────────┤ +│ address │ '0x70F5c5C40b873EA597776DA2C21929A8282A3b35' │ +│ symbol │ 'clCCIP-LnM' │ +│ name │ 'clCCIP-LnM' │ +│ decimals │ 18 │ +│ pool │ '0x8e35eB0dfb39Ec5F84254C3f863986a913171E0B' │ +│ pool.typeAndVersion │ 'BurnMintTokenPoolAndProxy 1.5.0' │ +│ remoteToken │ '0x466D489b6d36E7E3b824ef491C225F5830E81cC1' │ +│ remotePools │ '0x658FdaC59a197D5166151640b7a673F7dF1Ba324' │ +│ rateLimiters.outbound.tokens │ '100000.0' │ +│ rateLimiters.outbound.capacity │ '100000.0' │ +│ rateLimiters.outbound.rate │ '167.0' │ +│ rateLimiters.outbound.timeToRefill │ '9m58s' │ +│ rateLimiters.inbound.tokens │ '100000.0' │ +│ rateLimiters.inbound.capacity │ '100000.0' │ +│ rateLimiters.inbound.rate │ '167.0' │ +│ rateLimiters.inbound.timeToRefill │ '9m58s' │ +└────────────────────────────────────┴──────────────────────────────────────────────┘ +┌────────────────────────────────────┬──────────────────────────────────────────────┐ +│ (index) │ Values │ +├────────────────────────────────────┼──────────────────────────────────────────────┤ +│ address │ '0x5425890298aed601595a70AB815c96711a31Bc65' │ +│ symbol │ 'USDC' │ +│ name │ 'USD Coin' │ +│ decimals │ 6 │ +│ pool │ '0x5931822f394baBC2AACF4588E98FC77a9f5aa8C9' │ +│ pool.typeAndVersion │ 'USDCTokenPool 1.5.1' │ +│ remoteToken │ '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238' │ +│ remotePools[0] │ '0xb48EacF882dC4899Ae750AF4a6E2892E11866d8D' │ +│ remotePools[1] │ '0xAff3fE524ea94118EF09DaDBE3c77ba6AA0005EC' │ +│ rateLimiters.outbound.tokens │ '100000.0' │ +│ rateLimiters.outbound.capacity │ '100000.0' │ +│ rateLimiters.outbound.rate │ '167.0' │ +│ rateLimiters.outbound.timeToRefill │ '9m58s' │ +│ rateLimiters.inbound.tokens │ '100000.0' │ +│ rateLimiters.inbound.capacity │ '100000.0' │ +│ rateLimiters.inbound.rate │ '167.0' │ +│ rateLimiters.inbound.timeToRefill │ '9m58s' │ +└────────────────────────────────────┴──────────────────────────────────────────────┘ +...... +...... +...... +┌───────────────────────┬──────────────────────────────────────────────┐ +│ (index) │ Values │ +├───────────────────────┼──────────────────────────────────────────────┤ +│ address │ '0x838AB8F15867440A41C4149bcbba6ae402EfAd38' │ +│ symbol │ 'USDf' │ +│ name │ 'Falcon USD' │ +│ decimals │ 18 │ +│ pool │ '0x8210c0634AB8f273806e4b7866E9Db353773c44B' │ +│ pool.typeAndVersion │ 'BurnMintTokenPool 1.5.1' │ +│ remoteToken │ '0x3E34bFC2872534C331b6db2E4b3593FA7eaEddFd' │ +│ remotePools │ '0x21017CEC5f89fEb2c4B0F6C114E55Fa8EFDB00f2' │ +│ rateLimiters.outbound │ 'disabled' │ +│ rateLimiters.inbound │ 'disabled' │ +└───────────────────────┴──────────────────────────────────────────────┘ +┌───────────────────────┬──────────────────────────────────────────────┐ +│ (index) │ Values │ +├───────────────────────┼──────────────────────────────────────────────┤ +│ address │ '0xDA89A6C2c9f6E8d94E4a65d8AEe482908e9D709A' │ +│ symbol │ 'CCTWT' │ +│ name │ 'CCT Wizard Token' │ +│ decimals │ 18 │ +│ pool │ '0x3cD3CFAFb82a1Fd711753bb1a51F06a284bbd972' │ +│ pool.typeAndVersion │ 'BurnMintTokenPool 1.5.1' │ +│ remoteToken │ '0x74Ef0b124f192e0990B5451Ad12A4EC20FCf2B44' │ +│ remotePools │ '0x4dC3aA202138B40CC15867f2ab59153cF6FF83c4' │ +│ rateLimiters.outbound │ 'disabled' │ +│ rateLimiters.inbound │ 'disabled' │ +└───────────────────────┴──────────────────────────────────────────────┘ +┌───────────────────────┬──────────────────────────────────────────────┐ +│ (index) │ Values │ +├───────────────────────┼──────────────────────────────────────────────┤ +│ address │ '0x9BDdEBA9B0c051Ad5C1819D2F2671Af8B4D360B3' │ +│ symbol │ 'TT1' │ +│ name │ 'Test Token 1' │ +│ decimals │ 18 │ +│ pool │ '0x4Fc3534dEB27Bb61AfFFC5c02222594aF3024A61' │ +│ pool.typeAndVersion │ 'BurnMintTokenPool 1.5.1' │ +│ remoteToken │ '0x0325d145398Eeb977a55B39CC7847C48b84D93f5' │ +│ remotePools │ '0x0020267Ef0F96666A8CA236DB592547b14106807' │ +│ rateLimiters.outbound │ 'disabled' │ +│ rateLimiters.inbound │ 'disabled' │ +└───────────────────────┴──────────────────────────────────────────────┘ +Summary: totalTokens = 1070 , supportedTokens = 196 +``` + +<Aside type="note" title="Note"> + The `totalTokens` value represents the complete number of tokens registered or recognized by the system, regardless of their current usability for cross-chain transfers. In contrast, `supportedTokens` refers specifically to the subset of tokens that are currently eligible and configured for cross-chain transfers—meaning they have the necessary pools, remote mappings, and rate limiters set up. + + The difference between these numbers exists because not all tokens in the registry are ready or enabled for cross-chain operations. Some tokens may be inactive, lack required configuration, or are intentionally excluded from cross-chain support for security or operational reasons. As a result, `supportedTokens` is typically less than `totalTokens`. +</Aside> + +--- + # ChainlinkCCIP Tutorials Source: https://docs.chain.link/ccip/tutorials Last Updated: 2025-05-19 diff --git a/src/content/ccip/tutorials/aptos/destination/programmable-token-transfers.mdx b/src/content/ccip/tutorials/aptos/destination/programmable-token-transfers.mdx index bff311532f2..ed800e9a2e7 100644 --- a/src/content/ccip/tutorials/aptos/destination/programmable-token-transfers.mdx +++ b/src/content/ccip/tutorials/aptos/destination/programmable-token-transfers.mdx @@ -57,7 +57,7 @@ A programmable token transfer combines the features of a token transfer and an a <Aside title="Disclaimer" type="caution"> The `ccip_message_receiver` module used in this tutorial **should only be used with non-dispatchable tokens**, as it is currently incompatible with [dispatchable - tokens](https://aptosfoundation.org/currents/dispatchable-fungible-assets-101). + tokens](https://aptos.dev/build/smart-contracts/fungible-asset#dispatchable-fungible-asset-advanced). </Aside> This tutorial uses the `ccip_message_receiver` module from the `aptos-starter-kit`. Its `ccip_receive` function contains dispatcher logic. For this tutorial, we will trigger the part of its logic that handles a message containing both tokens and data. diff --git a/src/content/ccip/tutorials/evm/ccipreceive-gaslimit.mdx b/src/content/ccip/tutorials/evm/ccipreceive-gaslimit.mdx index e7b48b9fd10..dda635ec85a 100644 --- a/src/content/ccip/tutorials/evm/ccipreceive-gaslimit.mdx +++ b/src/content/ccip/tutorials/evm/ccipreceive-gaslimit.mdx @@ -306,7 +306,7 @@ To estimate the gas usage of the `ccipReceive` function within your own Hardhat **_Note_:** The `MockCCIPRouter` receives the CCIP message from your CCIP Sender, calls the `ccipReceive` function on your CCIP Receiver, and emits the `MsgExecuted` event with the gas used. 1. Create a testing file in your project's `test` directory. -1. Inside the `deployFixture` function, deploy the `MockCCIPRouter` contract and use its address to deploy your CCIP Sender and CCIP Receiver contracts. For more details, check this [example](https://github.com/smartcontractkit/smart-contract-examples/blob/ccip/estimate-gas/hardhat/test/Send-Receive.ts#L14). +1. Inside the `deployFixture` function, deploy the `MockCCIPRouter` contract and use its address to deploy your CCIP Sender and CCIP Receiver contracts. For more details, check this [example](https://github.com/smartcontractkit/smart-contract-examples/blob/main/ccip/estimate-gas/hardhat/test/Send-Receive.ts#L11). 1. In your test cases: 1. Send the CCIP message to the `MockCCIPRouter` contract. For more details, check this [example](https://github.com/smartcontractkit/smart-contract-examples/blob/main/ccip/estimate-gas/hardhat/test/Send-Receive.ts#L77). 1. Parse the logs to find the `MsgExecuted(bool,bytes,uint256)` event and extract the gas used. For more details, check this [example](https://github.com/smartcontractkit/smart-contract-examples/blob/main/ccip/estimate-gas/hardhat/test/Send-Receive.ts#L59). diff --git a/src/content/ccip/tutorials/evm/index.mdx b/src/content/ccip/tutorials/evm/index.mdx index 9e2bccbbc49..c705e23d5b9 100644 --- a/src/content/ccip/tutorials/evm/index.mdx +++ b/src/content/ccip/tutorials/evm/index.mdx @@ -28,7 +28,6 @@ You can explore several comprehensive guides to learn about cross-chain interope - [Using CCIP CLI](/ccip/tutorials/evm/offchain/ccip-tools) - [Transfer Tokens between EOAs](/ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa) - [Checking CCIP Message Status](/ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain) - - [Get Supported Tokens](/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens) - [Transfer USDC with Data](/ccip/tutorials/evm/usdc) - [Send Arbitrary Data](/ccip/tutorials/evm/send-arbitrary-data) - [Send Arbitrary Data and Receive Transfer Confirmation: A -> B -> A](/ccip/tutorials/evm/send-arbitrary-data-receipt-acknowledgment) diff --git a/src/content/ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain.mdx b/src/content/ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain.mdx index 86adb4397e4..fe419a5fd6f 100644 --- a/src/content/ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain.mdx +++ b/src/content/ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain.mdx @@ -10,14 +10,12 @@ metadata: lastModified: "2025-05-19" estimatedTime: "15 minutes" difficulty: "intermediate" -whatsnext: - "Get Supported Tokens": "/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens" --- import { CodeSample, ClickToZoom, CopyText, Aside } from "@components" import CcipCommon from "@features/ccip/CcipCommon.astro" -In this tutorial, you will learn how to verify the status of a Chainlink CCIP transaction offchain using [CCIP Tools](https://github.com/smartcontractkit/ccip-tools-ts). Starting with a CCIP source transaction hash, you'll execute the [`show`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/README.md#show-default-command) command of the `ccip-tools` to query the current status of a cross-chain message. +In this tutorial, you will learn how to verify the status of a Chainlink CCIP transaction offchain using [CCIP Tools](https://github.com/smartcontractkit/ccip-tools-ts). Starting with a CCIP source transaction hash, you'll execute the [`show`](https://github.com/smartcontractkit/ccip-tools-ts/tree/main/ccip-cli#show-default-command) command of the `ccip-tools` to query the current status of a cross-chain message. ## Before you begin @@ -26,7 +24,7 @@ In this tutorial, you will learn how to verify the status of a Chainlink CCIP tr ## Tutorial -This tutorial shows you on how to check the status of a Chainlink CCIP transaction using the [`show`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/README.md#show-default-command) command of the `ccip-tools`. By supplying the command with the source transaction hash, you can verify the current status of your cross-chain message. +This tutorial shows you on how to check the status of a Chainlink CCIP transaction using the [`show`](https://github.com/smartcontractkit/ccip-tools-ts/tree/main/ccip-cli#show-default-command) command of the `ccip-tools`. By supplying the command with the source transaction hash, you can verify the current status of your cross-chain message. **Execute the script in your command line:** @@ -40,7 +38,7 @@ This tutorial shows you on how to check the status of a Chainlink CCIP transacti <Aside type="note" title="Note"> The `--page` option is used to limit the number of blocks to search for the message. The default value is `10000` - which could result in an error due to RPC limitations. Setting it to `500` is a good practice to avoid such issues. + which could result in an error due to RPC limitations. Setting it to `10` is a good practice to avoid such issues. </Aside> **Example Usage:** @@ -48,7 +46,7 @@ This tutorial shows you on how to check the status of a Chainlink CCIP transacti If you initiated a transaction from _Avalanche Fuji_ to _Ethereum Sepolia_ and received the source transaction hash, you can check the status of your CCIP message with the following command: ```text -$ ./src/index.ts show 0x980dacf245f9c6919678219e97d6ad20e0c1964795ec3801e688315f1f18defd --page 500 +$ ./ccip-cli/ccip-cli show 0xcefd14da01d3d607ba98dae33b2941ef07499051eaa61e3a417b5734d91ad021 --page 10 Lane: ┌────────────────┬──────────────────────────────────────────────┬────────────────────────────┐ @@ -63,46 +61,46 @@ Request (source): ┌─────────────────┬──────────────────────────────────────────────────────────────────────┐ │ (index) │ Values │ ├─────────────────┼──────────────────────────────────────────────────────────────────────┤ -│ messageId │ '0x1ce5213bf9880b18be7f44d5ab1065e603ec3a83eb1bebf76af366ed3c0de0b3' │ +│ messageId │ '0xb9672cd93b24b9071c2eee11b27daca00dbdac58239c40bca06c23fbb172e992' │ │ origin │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA' │ │ sender │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA' │ │ receiver │ '0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf' │ -│ sequenceNumber │ 3835 │ -│ nonce │ 4 │ -│ gasLimit │ 200000 │ -│ transactionHash │ '0x980dacf245f9c6919678219e97d6ad20e0c1964795ec3801e688315f1f18defd' │ -│ logIndex │ 6 │ -│ blockNumber │ 40954056 │ -│ timestamp │ '2025-05-26 16:34:14 (2h8m33s ago)' │ +│ sequenceNumber │ 7389n │ +│ nonce │ 22n │ +│ gasLimit │ 0n │ +│ transactionHash │ '0xcefd14da01d3d607ba98dae33b2941ef07499051eaa61e3a417b5734d91ad021' │ +│ logIndex │ 16 │ +│ blockNumber │ 49144702 │ +│ timestamp │ '2025-12-16 14:36:00 (24m4s ago)' │ │ finalized │ true │ -│ fee │ '0.040903083926519498 LINK' │ +│ fee │ '0.104497184834156911 WAVAX' │ │ tokens │ '0.001 CCIP-BnM' │ │ data │ '0x' │ +│ strict │ false │ └─────────────────┴──────────────────────────────────────────────────────────────────────┘ Commit (dest): ┌─────────────────┬──────────────────────────────────────────────────────────────────────┐ │ (index) │ Values │ ├─────────────────┼──────────────────────────────────────────────────────────────────────┤ -│ merkleRoot │ '0x1ce5213bf9880b18be7f44d5ab1065e603ec3a83eb1bebf76af366ed3c0de0b3' │ -│ min │ 3835 │ -│ max │ 3835 │ -│ origin │ '0x9e587c646d4f4e46B71a02179Fa8951CFB34A382' │ +│ merkleRoot │ '0xb9672cd93b24b9071c2eee11b27daca00dbdac58239c40bca06c23fbb172e992' │ +│ min │ 7389 │ +│ max │ 7389 │ +│ origin │ '0x94193d65DF1f4834081B7F1aF1ecB11CFdECc608' │ │ contract │ '0x139E06b6dBB1a0C41A1686C091795879c943765A' │ -│ transactionHash │ '0xbda1e294e59910e2929e6aec08e52426a9125c1ac20509b9d5b9441789b746b0' │ -│ blockNumber │ 8411619 │ -│ timestamp │ '2025-05-26 16:35:00 (46s after request)' │ +│ transactionHash │ '0x57020e1a913451bb9e44190452252150158ae0d71ff117e2889cf0dc99c77cee' │ +│ blockNumber │ 9853657 │ +│ timestamp │ '2025-12-16 14:36:48 (48s after request)' │ └─────────────────┴──────────────────────────────────────────────────────────────────────┘ Receipts (dest): ┌─────────────────┬──────────────────────────────────────────────────────────────────────┐ │ (index) │ Values │ ├─────────────────┼──────────────────────────────────────────────────────────────────────┤ │ state │ '✅ success' │ -│ returnData │ '0x' │ -│ origin │ '0xdA743Ce0Eb7cC541093F030A3126bF9e3d427E93' │ -│ offRamp │ '0x1DEBa99dC8e2A77832461BD386d83D9FCb133137' │ -│ transactionHash │ '0xe68ae80ed0b77d6e22f066a08c169c873dd22112ef5f27287bbe85e737c6ec60' │ -│ logIndex │ 114 │ -│ blockNumber │ 8411627 │ -│ timestamp │ '2025-05-26 16:36:36 (2m22s after request)' │ +│ origin │ '0x9Fa36294177c7adf9df4cC35fFcF0f47Dd3468D9' │ +│ contract │ '0x1DEBa99dC8e2A77832461BD386d83D9FCb133137' │ +│ transactionHash │ '0x38b5edcc7b7fc24a97120b5ac57f8023308784a5a97c92c251d3a67886197630' │ +│ logIndex │ 3 │ +│ blockNumber │ 9853664 │ +│ timestamp │ '2025-12-16 14:38:12 (2m12s after request)' │ └─────────────────┴──────────────────────────────────────────────────────────────────────┘ ``` diff --git a/src/content/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens.mdx b/src/content/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens.mdx index 281b457b685..802e54e23ff 100644 --- a/src/content/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens.mdx +++ b/src/content/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens.mdx @@ -15,7 +15,7 @@ metadata: import { CodeSample, ClickToZoom, CopyText, Aside } from "@components" import CcipCommon from "@features/ccip/CcipCommon.astro" -In this tutorial, you will learn how to retrieve the list of supported tokens that can be transferred between chains using Chainlink CCIP, with [CCIP Tools](https://github.com/smartcontractkit/ccip-tools-ts). You'll use the [`getSupportedTokens`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/README.md#getsupportedtokens) command of `ccip-tools` to query the list of supported tokens that can be transferred from a specific source chain to a specific destination chain. +In this tutorial, you will learn how to retrieve the list of supported tokens that can be transferred between chains using Chainlink CCIP, with [CCIP Tools](https://github.com/smartcontractkit/ccip-tools-ts). You'll use the [`getSupportedTokens`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/ccip-cli/README.md#getsupportedtokens) command of `ccip-tools` to query the list of supported tokens that can be transferred from a specific source chain to a specific destination chain. ## Before you begin @@ -23,12 +23,12 @@ Complete the prerequisite steps of the [Transfer Tokens between EOAs](/ccip/tuto ## Tutorial -This tutorial shows you how to retrieve the list of supported tokens that can be transferred between chains using Chainlink CCIP. By supplying the [`getSupportedTokens`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/README.md#getsupportedtokens) command of `ccip-tools` with a source chain, source router address, and a destination chain, you can get the list of supported tokens that can be transferred from the source chain to the destination chain. +This tutorial shows you how to retrieve the list of supported tokens that can be transferred between chains using Chainlink CCIP. By supplying the [`getSupportedTokens`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/ccip-cli/README.md#getsupportedtokens) command of `ccip-tools` with a source chain, source router address, and a destination chain, you can get the list of supported tokens that can be transferred from the source chain to the destination chain. **Execute the script in your command line:** ```bash -./src/index.ts getSupportedTokens <source> <router> <dest> +./ccip-cli/ccip-cli getSupportedTokens <source> <router> <dest> ``` **The script requires the following parameters:** @@ -38,7 +38,7 @@ This tutorial shows you how to retrieve the list of supported tokens that can be For example, `43113` for _Avalanche Fuji_ or `11155111` for _Ethereum Sepolia_. You can also use the network name, such as `avalanche-testnet-fuji` or `ethereum-testnet-sepolia`. You can find the supported network names and chain IDs that can be used for `source` in the - [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/src/lib/selectors.ts) file of the + [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/ccip-sdk/src/selectors.ts) file of the `ccip-tools` repository. - `router`: Router contract address on the source network. @@ -50,7 +50,7 @@ This tutorial shows you how to retrieve the list of supported tokens that can be For example, `43113` for _Avalanche Fuji_ or `11155111` for _Ethereum Sepolia_. You can also use the network name, such as `avalanche-testnet-fuji` or `ethereum-testnet-sepolia`. You can find the supported network names and chain IDs that can be used for `dest` in the - [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/src/lib/selectors.ts) file of the + [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/ccip-sdk/src/selectors.ts) file of the `ccip-tools` repository. **Example Usage:** @@ -58,7 +58,7 @@ This tutorial shows you how to retrieve the list of supported tokens that can be If you would like to retrieve the list of supported tokens that can be transferred from _Avalanche Fuji_ to _Ethereum Sepolia_, you can run the following command: ```text -$ ./src/index.ts getSupportedTokens 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 +$ ./ccip-cli/ccip-cli getSupportedTokens 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 [INFO] Starting token discovery for cross-chain transfers [INFO] Using TokenAdminRegistry 1.5.0 at 0xA92053a4a3922084d992fD2835bdBa4caC6877e6 from router 0xF694E193200268f9a4868e4Aa017A0118C9a8177 diff --git a/src/content/ccip/tutorials/evm/offchain/ccip-tools/index.mdx b/src/content/ccip/tutorials/evm/offchain/ccip-tools/index.mdx index 8b8df406e74..bfe54fc2a83 100644 --- a/src/content/ccip/tutorials/evm/offchain/ccip-tools/index.mdx +++ b/src/content/ccip/tutorials/evm/offchain/ccip-tools/index.mdx @@ -18,4 +18,3 @@ These tutorials demonstrate how to use [CCIP Tools](https://github.com/smartcont - [Transfer Tokens Between EOAs](/ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa): Learn how to transfer tokens between Externally Owned Accounts (EOAs) across different blockchains using Chainlink CCIP. - [Check CCIP Message Status Off-Chain](/ccip/tutorials/evm/offchain/ccip-tools/get-status-offchain): Learn how to verify the status of Chainlink CCIP messages off-chain. -- [Get Supported Tokens](/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens): Learn how to retrieve the list of supported tokens that can be transferred between chains using Chainlink CCIP. diff --git a/src/content/ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa.mdx b/src/content/ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa.mdx index 08e52b91645..659f9f23c9e 100644 --- a/src/content/ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa.mdx +++ b/src/content/ccip/tutorials/evm/offchain/ccip-tools/transfer-tokens-from-eoa.mdx @@ -28,7 +28,7 @@ In this tutorial, you will use Chainlink CCIP to transfer tokens directly from y ## Before you begin -1. [Install Node.js 18](https://nodejs.org/en/download/). Optionally, you can use the [nvm package](https://www.npmjs.com/package/nvm) to switch between Node.js versions with `nvm use 18`. +1. [Install Node.js 22](https://nodejs.org/en/download/). Optionally, you can use the [nvm package](https://www.npmjs.com/package/nvm) to switch between Node.js versions with `nvm use 22`. ```shell node -v @@ -36,14 +36,14 @@ In this tutorial, you will use Chainlink CCIP to transfer tokens directly from y ```shell $ node -v - v18.7.0 + v22.15.0 ``` 1. Your [EOA (Externally Owned Account)](https://ethereum.org/en/developers/docs/accounts/#types-of-account) must have both AVAX and LINK tokens on _Avalanche Fuji_ to pay for the gas fees and CCIP fees. - [Configure MetaMask to use LINK tokens](/resources/acquire-link#configure-metamask-to-use-link-tokens) - Acquire testnet AVAX and LINK from [faucets.chain.link/fuji](https://faucets.chain.link/fuji) -1. Check the [CCIP Directory](/ccip/directory) to confirm that the tokens you will transfer are supported for your lane. In this example, you will transfer tokens from _Avalanche Fuji_ to _Ethereum Sepolia_ so check the list of supported tokens [here](/ccip/directory/testnet/chain/avalanche-fuji-testnet). Alternatively, you can use the [Get Supported Tokens](/ccip/tutorials/evm/offchain/ccip-tools/get-supported-tokens) tutorial to retrieve the list of supported tokens programmatically. +1. Check the [CCIP Directory](/ccip/directory) to confirm that the tokens you will transfer are supported for your lane. In this example, you will transfer tokens from _Avalanche Fuji_ to _Ethereum Sepolia_ so check the list of supported tokens [here](/ccip/directory/testnet/chain/avalanche-fuji-testnet). 1. Learn how to [acquire CCIP test tokens](/ccip/test-tokens#evm-chains). After following this guide, your [EOA (Externally Owned Account)](https://ethereum.org/en/developers/docs/accounts/#types-of-account) should have CCIP-BnM tokens, and CCIP-BnM should appear in the list of your tokens in MetaMask. @@ -63,7 +63,7 @@ In this tutorial, you will use Chainlink CCIP to transfer tokens directly from y 1. To make sure that the installation is correct and the `ccip-tools` CLI commands are available, run the following command: ```shell - ./dist/ccip-tools-ts --help + ./ccip-cli/ccip-cli --help ``` 1. Inside the project's root folder, i.e., `ccip-tools-ts`, create a `.env` file and add two environment variables to store the RPC URLs: @@ -101,7 +101,7 @@ In this example, you will transfer CCIP-BnM tokens from your EOA on _Avalanche F For this example, CCIP fees are paid in LINK tokens. To learn how to pay CCIP fees in native AVAX, read the [Pay in native](#transfer-tokens-and-pay-in-native) section. To transfer tokens and pay in LINK, use the following command: ``` -./src/index.ts send <source> <router> <dest> \ +./ccip-cli/ccip-cli send <source> <router> <dest> \ --receiver <destinationAccount> \ --fee-token <feeTokenAddress> \ --transfer-tokens <tokenAddress>=<amount> @@ -112,7 +112,7 @@ For this example, CCIP fees are paid in LINK tokens. To learn how to pay CCIP fe If you have Foundry installed and have imported your private key into an encrypted keystore using the [`cast wallet import`](https://book.getfoundry.sh/reference/cast/cast-wallet-import) command, you can pass the path to that keystore file as the value of the `--wallet` flag in your command, like this: ``` -./src/index.ts send <source> <router> <dest> \ +./ccip-cli/ccip-cli send <source> <router> <dest> \ --receiver <destinationAccount> \ --fee-token <feeTokenAddress> \ --transfer-tokens <tokenAddress>=<amount> \ @@ -135,7 +135,7 @@ export USER_KEY_PASSWORD=<YOUR_KEYSTORE_FILE_PASSWORD> For example, `43113` for _Avalanche Fuji_ or `11155111` for _Ethereum Sepolia_. You can also use the network name, such as `avalanche-testnet-fuji` or `ethereum-testnet-sepolia`. You can find the supported network names and chain IDs that can be used for `source` in the - [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/src/lib/selectors.ts) file of the + [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/ccip-sdk/src/selectors.ts) file of the `ccip-tools` repository. - `router`: Router contract address on the source network. @@ -145,7 +145,7 @@ export USER_KEY_PASSWORD=<YOUR_KEYSTORE_FILE_PASSWORD> For example, `43113` for _Avalanche Fuji_ or `11155111` for _Ethereum Sepolia_. You can also use the network name, such as `avalanche-testnet-fuji` or `ethereum-testnet-sepolia`. You can find the supported network names and chain IDs that can be used for `dest` in the - [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/src/lib/selectors.ts) file of the + [`selectors.ts`](https://github.com/smartcontractkit/ccip-tools-ts/blob/main/ccip-sdk/src/selectors.ts) file of the `ccip-tools` repository. - `destinationAccount`: Address of the destination account on the destination network. Skip this argument to use the same address as the source account. @@ -161,7 +161,7 @@ Complete the following steps in your terminal: 1. Send 0.001 CCIP-BnM from your EOA on _Avalanche Fuji_ to another account on _Ethereum Sepolia_: ``` - ./src/index.ts send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ + ./ccip-cli/ccip-cli send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ --receiver 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf \ --fee-token 0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846 \ --transfer-tokens 0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4=0.001 \ @@ -172,7 +172,7 @@ Complete the following steps in your terminal: | Argument | Explanation | | ------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | <CopyText text="./src/index.ts send" code/> | This executes the `send` command of the `ccip-tools`. | + | <CopyText text="./ccip-cli/ccip-cli send" code/> | This executes the `send` command of the `ccip-tools`. | | <CopyText text="43113" code/> | This specifies the source blockchain, in this case, _Avalanche Fuji_. | | <CopyText text="0xF694E193200268f9a4868e4Aa017A0118C9a8177" code/> | This specifies the router address on the source blockchain, in this case, _Avalanche Fuji_. | | <CopyText text="11155111" code/> | This specifies the destination blockchain, which is _Ethereum Sepolia_ in this case. | @@ -188,15 +188,14 @@ Complete the following steps in your terminal: 1. Once you execute the command, you should see the following logs: ``` - $ ./src/index.ts send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ + $ ./ccip-cli/ccip-cli send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ --receiver 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf \ --fee-token 0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846 \ --transfer-tokens 0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4=0.001 \ --gas-limit 0 - Approving 1000000000000000n 0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4 for 0xF694E193200268f9a4868e4Aa017A0118C9a8177 = 0xa3fd8053a74b71f34c4c280f10fdcba51ea105093998f8349db14485473da912 - Approving 23112499163862214n 0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846 for 0xF694E193200268f9a4868e4Aa017A0118C9a8177 = 0xb21d2822c7211a6bd39310ae78f4b59ef54ed6271fea21c949d9be78a30f12a7 - Sending message to 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf @ ethereum-testnet-sepolia , tx_hash = 0x70858cfeadcfbd1404a65dd4116b549801bde3d184eb324f895529286e15249a + Fee: 133133029529487157n = 0.133133029529487157 LINK + 🚀 Sending message to 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf @ ethereum-testnet-sepolia , tx => 0x76a472470de779bef81843abeb3e1d0541bf35d63f23b3229857638764f3e149 , messageId => 0xf6ae12f8cf81d389613a8de82b1fd1b39542a2c99a58a1c580be7b8dc0603f9d Lane: ┌────────────────┬──────────────────────────────────────────────┬────────────────────────────┐ │ (index) │ source │ dest │ @@ -210,21 +209,22 @@ Complete the following steps in your terminal: ┌─────────────────┬──────────────────────────────────────────────────────────────────────┐ │ (index) │ Values │ ├─────────────────┼──────────────────────────────────────────────────────────────────────┤ - │ messageId │ '0x934f57925b5d8fbc763c2a06dfe2d003676816f8ea67392d3e7888a45469d4c1' │ + │ messageId │ '0xf6ae12f8cf81d389613a8de82b1fd1b39542a2c99a58a1c580be7b8dc0603f9d' │ │ origin │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA' │ │ sender │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA' │ │ receiver │ '0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf' │ - │ sequenceNumber │ 3859 │ - │ nonce │ 17 │ - │ gasLimit │ 0 │ - │ transactionHash │ '0x70858cfeadcfbd1404a65dd4116b549801bde3d184eb324f895529286e15249a' │ - │ logIndex │ 6 │ - │ blockNumber │ 41234897 │ - │ timestamp │ '2025-06-02 16:19:51 (10s ago)' │ + │ sequenceNumber │ 7388n │ + │ nonce │ 21n │ + │ gasLimit │ 0n │ + │ transactionHash │ '0x76a472470de779bef81843abeb3e1d0541bf35d63f23b3229857638764f3e149' │ + │ logIndex │ 14 │ + │ blockNumber │ 49144482 │ + │ timestamp │ '2025-12-16 14:31:03 (7s ago)' │ │ finalized │ true │ - │ fee │ '0.023112499163862214 LINK' │ + │ fee │ '0.133133029529487157 LINK' │ │ tokens │ '0.001 CCIP-BnM' │ │ data │ '0x' │ + │ strict │ false │ └─────────────────┴──────────────────────────────────────────────────────────────────────┘ ``` @@ -255,7 +255,7 @@ For this example, CCIP fees are paid in Avalanche Fuji's native AVAX. To learn h To transfer tokens and pay in native, use the following command: ``` -./src/index.ts send <source> <router> <dest> \ +./ccip-cli/ccip-cli send <source> <router> <dest> \ --receiver <destinationAccount> \ --transfer-tokens <tokenAddress>=<amount> \ --gas-limit 0 @@ -265,7 +265,7 @@ To transfer tokens and pay in native, use the following command: If you have Foundry installed and have imported your private key into an encrypted keystore using the [`cast wallet import`](https://book.getfoundry.sh/reference/cast/cast-wallet-import) command, you can pass the path to that keystore file as the value of the `--wallet` flag in your command, like this: ``` -./src/index.ts send <source> <router> <dest> \ +./ccip-cli/ccip-cli send <source> <router> <dest> \ --receiver <destinationAccount> \ --transfer-tokens <tokenAddress>=<amount> \ --gas-limit 0 \ @@ -288,7 +288,7 @@ Complete the following steps in your terminal: 1. Send 0.001 CCIP-BnM from your EOA on _Avalanche Fuji_ to another account on _Ethereum Sepolia_: ``` - ./src/index.ts send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ + ./ccip-cli/ccip-cli send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ --receiver 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf \ --transfer-tokens 0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4=0.001 \ --gas-limit 0 @@ -298,7 +298,7 @@ Complete the following steps in your terminal: | Argument | Explanation | | ------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | <CopyText text="./src/index.ts send" code/> | This executes the `send` command of the `ccip-tools`. | + | <CopyText text="./ccip-cli/ccip-cli send" code/> | This executes the `send` command of the `ccip-tools`. | | <CopyText text="43113" code/> | This specifies the source blockchain, in this case, _Avalanche Fuji_. | | <CopyText text="0xF694E193200268f9a4868e4Aa017A0118C9a8177" code/> | This specifies the router address on the source blockchain, in this case, _Avalanche Fuji_. | | <CopyText text="11155111" code/> | This specifies the destination blockchain, which is _Ethereum Sepolia_ in this case. | @@ -312,13 +312,13 @@ Complete the following steps in your terminal: 1. After you execute the command, you should see the following logs: ``` - $ ./src/index.ts send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ + $ ./ccip-cli/ccip-cli send 43113 0xF694E193200268f9a4868e4Aa017A0118C9a8177 11155111 \ --receiver 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf \ --transfer-tokens 0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4=0.001 \ --gas-limit 0 - Approving 1000000000000000n 0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4 for 0xF694E193200268f9a4868e4Aa017A0118C9a8177 = 0x1ea6d165cf627fd4f6856520fc9afa2e08c4e04f79fd78bf7f4ef7da94692503 - Sending message to 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf @ ethereum-testnet-sepolia , tx_hash = 0x0a00f9240b6860e34a0664ad0aa8f8e86877d70b97e9787e08e270bea564edce + Fee: 104497184834156911n = 0.104497184834156911 AVAX + 🚀 Sending message to 0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf @ ethereum-testnet-sepolia , tx => 0xcefd14da01d3d607ba98dae33b2941ef07499051eaa61e3a417b5734d91ad021 , messageId => 0xb9672cd93b24b9071c2eee11b27daca00dbdac58239c40bca06c23fbb172e992 Lane: ┌────────────────┬──────────────────────────────────────────────┬────────────────────────────┐ │ (index) │ source │ dest │ @@ -332,21 +332,22 @@ Complete the following steps in your terminal: ┌─────────────────┬──────────────────────────────────────────────────────────────────────┐ │ (index) │ Values │ ├─────────────────┼──────────────────────────────────────────────────────────────────────┤ - │ messageId │ '0xd902134a69bff565005c354996386479f9b1204b1810f49e27abc8c413c64312' │ + │ messageId │ '0xb9672cd93b24b9071c2eee11b27daca00dbdac58239c40bca06c23fbb172e992' │ │ origin │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA' │ │ sender │ '0x8C244f0B2164E6A3BED74ab429B0ebd661Bb14CA' │ │ receiver │ '0x27d7A69C878F9c8f51f4e53703abCE9bAcd2D9bf' │ - │ sequenceNumber │ 3861 │ - │ nonce │ 18 │ - │ gasLimit │ 0 │ - │ transactionHash │ '0x0a00f9240b6860e34a0664ad0aa8f8e86877d70b97e9787e08e270bea564edce' │ - │ logIndex │ 11 │ - │ blockNumber │ 41235059 │ - │ timestamp │ '2025-06-02 16:25:12 (7s ago)' │ + │ sequenceNumber │ 7389n │ + │ nonce │ 22n │ + │ gasLimit │ 0n │ + │ transactionHash │ '0xcefd14da01d3d607ba98dae33b2941ef07499051eaa61e3a417b5734d91ad021' │ + │ logIndex │ 16 │ + │ blockNumber │ 49144702 │ + │ timestamp │ '2025-12-16 14:36:00 (6s ago)' │ │ finalized │ true │ - │ fee │ '0.019124641265363576 WAVAX' │ + │ fee │ '0.104497184834156911 WAVAX' │ │ tokens │ '0.001 CCIP-BnM' │ │ data │ '0x' │ + │ strict │ false │ └─────────────────┴──────────────────────────────────────────────────────────────────────┘ ``` diff --git a/src/content/ccip/tutorials/evm/offchain/transfer-tokens-from-eoa.mdx b/src/content/ccip/tutorials/evm/offchain/transfer-tokens-from-eoa.mdx index 43c857739e0..ad7f746b1f0 100644 --- a/src/content/ccip/tutorials/evm/offchain/transfer-tokens-from-eoa.mdx +++ b/src/content/ccip/tutorials/evm/offchain/transfer-tokens-from-eoa.mdx @@ -28,7 +28,7 @@ In this tutorial, you will use Chainlink CCIP to transfer tokens directly from y ## Before you begin -1. [Install Node.js 18](https://nodejs.org/en/download/). Optionally, you can use the [nvm package](https://www.npmjs.com/package/nvm) to switch between Node.js versions with `nvm use 18`. +1. [Install Node.js 22](https://nodejs.org/en/download/). Optionally, you can use the [nvm package](https://www.npmjs.com/package/nvm) to switch between Node.js versions with `nvm use 22`. ```shell node -v @@ -36,7 +36,7 @@ In this tutorial, you will use Chainlink CCIP to transfer tokens directly from y ```shell $ node -v - v18.7.0 + v22.15.0 ``` 1. Your [EOA (Externally Owned Account)](https://ethereum.org/en/developers/docs/accounts/#types-of-account) must have both AVAX and LINK tokens on _Avalanche Fuji_ to pay for the gas fees and CCIP fees. diff --git a/src/content/ccip/tutorials/evm/token-manager.mdx b/src/content/ccip/tutorials/evm/token-manager.mdx index 3048f276956..9751170f3fa 100644 --- a/src/content/ccip/tutorials/evm/token-manager.mdx +++ b/src/content/ccip/tutorials/evm/token-manager.mdx @@ -142,7 +142,7 @@ If you have existing token(s) that you've already deployed, you can use the Toke Before selecting a token pool type, be sure to review [CCIP token handling mechanisms](/ccip/concepts/cross-chain-token/overview#token-handling-mechanisms). -1. On the **Networks** page, select the additional blockchain networks where you'd like to deploy your new token. For additional networks, Token Manager Wizard workflow automatically configures all tokens with the Burn & Mint mechanism. (Refer to the [token contract](https://github.com/smartcontractkit/chainlink/blob/contracts-ccip/v1.6.0-beta.0/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol) and [token pool contract](https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/ccip/pools/BurnMintTokenPool.sol) for the Burn & Mint mechanism.) +1. On the **Networks** page, select the additional blockchain networks where you'd like to deploy your new token. For additional networks, Token Manager Wizard workflow automatically configures all tokens with the Burn & Mint mechanism. (Refer to the [token contract](https://github.com/smartcontractkit/chainlink-evm/blob/contracts-v1.4.0/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol) and [token pool contract](https://github.com/smartcontractkit/chainlink-ccip/tree/contracts-ccip-v1.6.1/chains/evm/contracts/pools/BurnMintTokenPool.sol) for the Burn & Mint mechanism.) 1. On the **Summary** page, each network you've selected appears along with an expandable list of the transactions the Token Manager will guide you through to deploy your token for each network. If you selected more than two networks during the previous step, the _Remove_ links are active, allowing you to remove a network before proceeding. If you only have two networks selected, the _Remove_ links are intentionally not active. If you need to add more networks, navigate back to the **Networks** page. diff --git a/src/content/ccip/tutorials/evm/usdc.mdx b/src/content/ccip/tutorials/evm/usdc.mdx index 3edeb44db87..608347f5778 100644 --- a/src/content/ccip/tutorials/evm/usdc.mdx +++ b/src/content/ccip/tutorials/evm/usdc.mdx @@ -46,7 +46,7 @@ Chainlink CCIP maintains a consistent [API](/ccip/api-reference/evm/v1.6.1/i-rou - The sender has to interact with the CCIP router to initiate a cross-chain transaction, similar to the process for any other token transfers. See the [Transfer Tokens](/ccip/tutorials/evm/transfer-tokens-from-contract) guide to learn more. - The process uses the same onchain components including the Router, OnRamp, Commit Store, OffRamp, and Token Pool. - The process uses the same offchain components including the Committing DON, Executing DON, and the Risk Management Network. -- USDC transfers also benefit from CCIP additional security provided by the [Risk Management Network](/ccip/concepts/architecture/key-concepts#risk-management-network). +- USDC transfers also benefit from CCIP additional security provided by the Risk Management Network. #### Native USDC (CCTP-enabled) diff --git a/src/content/ccip/tutorials/svm/receivers.mdx b/src/content/ccip/tutorials/svm/receivers.mdx index d10406b357b..8072311a03c 100644 --- a/src/content/ccip/tutorials/svm/receivers.mdx +++ b/src/content/ccip/tutorials/svm/receivers.mdx @@ -413,6 +413,6 @@ When implementing CCIP Receivers, follow these best practices: ## Example Implementation -For a complete, audited reference implementation of a CCIP Receiver, you can examine the [example-ccip-receiver](https://github.com/smartcontractkit/chainlink-ccip/tree/v1.6.0-solana/chains/solana/contracts/programs/example-ccip-receiver) in the Chainlink CCIP repository. This example demonstrates all the security patterns and best practices covered in this guide and can serve as a starting point for your own implementation. +For a complete, audited reference implementation of a CCIP Receiver, you can examine the [example-ccip-receiver](https://github.com/smartcontractkit/chainlink-ccip/tree/solana-v1.6.0/chains/solana/contracts/programs/example-ccip-receiver) in the Chainlink CCIP repository. This example demonstrates all the security patterns and best practices covered in this guide and can serve as a starting point for your own implementation. <CcipCommon callout="educationalDisclaimer" /> diff --git a/src/features/ccip/SvmCrossChainTokenProductionPrerequisites.mdx b/src/features/ccip/SvmCrossChainTokenProductionPrerequisites.mdx index 0ffd03021b7..e8ba23b8110 100644 --- a/src/features/ccip/SvmCrossChainTokenProductionPrerequisites.mdx +++ b/src/features/ccip/SvmCrossChainTokenProductionPrerequisites.mdx @@ -205,7 +205,7 @@ This tutorial implements production-grade cross-chain tokens using a three-termi | Terminal | Repository | Purpose | Commands | | -------------- | --------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | ------------- | -| **Terminal 1** | [CCIP Solana base58 Generator](https://github.com/smartcontractkit/ccip-solana-base58-generator) | Generate governance transactions | `pnpm bs58` | +| **Terminal 1** | [CCIP Solana base58 Generator](https://github.com/smartcontractkit/ccip-solana-bs58-generator) | Generate governance transactions | `pnpm bs58` | | **Terminal 2** | [Smart Contract Examples (Hardhat)](https://github.com/smartcontractkit/smart-contract-examples/tree/main/ccip/cct/hardhat) | Deploy EVM components | `npx hardhat` | | **Terminal 3** | [Solana Starter Kit](https://github.com/smartcontractkit/solana-starter-kit) | Test cross-chain transfers | `yarn` | From 73f85924812577aecea7e9a3b57fd05b5e43e7e0 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:34:05 -0600 Subject: [PATCH 070/214] Git ignore reports directory (#3304) * git ignore reports directory * git ignore reports directory --- .gitignore | 1 + reports/llms-report.json | 127 --------------------------------------- 2 files changed, 1 insertion(+), 127 deletions(-) delete mode 100644 reports/llms-report.json 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/reports/llms-report.json b/reports/llms-report.json deleted file mode 100644 index 2181e9fe037..00000000000 --- a/reports/llms-report.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "startedAt": "2025-12-16T18:01:55.280Z", - "siteBase": "https://docs.chain.link", - "sections": [ - { - "section": "cre-go", - "pagesProcessed": 84, - "outputPath": "src/content/cre/llms-full-go.txt", - "bytes": 674210, - "prevBytes": 674210, - "deltaBytes": 0 - }, - { - "section": "cre-ts", - "pagesProcessed": 79, - "outputPath": "src/content/cre/llms-full-ts.txt", - "bytes": 630146, - "prevBytes": 630146, - "deltaBytes": 0 - }, - { - "section": "vrf", - "pagesProcessed": 35, - "outputPath": "src/content/vrf/llms-full.txt", - "bytes": 301005, - "prevBytes": 301005, - "deltaBytes": 0 - }, - { - "section": "ccip", - "pagesProcessed": 260, - "outputPath": "src/content/ccip/llms-full.txt", - "bytes": 2847978, - "prevBytes": 2848574, - "deltaBytes": -596 - }, - { - "section": "data-feeds", - "pagesProcessed": 37, - "outputPath": "src/content/data-feeds/llms-full.txt", - "bytes": 302811, - "prevBytes": 302811, - "deltaBytes": 0 - }, - { - "section": "data-streams", - "pagesProcessed": 55, - "outputPath": "src/content/data-streams/llms-full.txt", - "bytes": 477063, - "prevBytes": 477063, - "deltaBytes": 0 - }, - { - "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": 197667, - "prevBytes": 197667, - "deltaBytes": 0 - }, - { - "section": "resources", - "pagesProcessed": 12, - "outputPath": "src/content/resources/llms-full.txt", - "bytes": 340405, - "prevBytes": 340405, - "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": 297281, - "prevBytes": 297281, - "deltaBytes": 0 - } - ], - "finishedAt": "2025-12-16T18:01:58.921Z" -} From efbd914df9e08fcdb0a74730612e3d3bfb5851fa Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:16:58 -0600 Subject: [PATCH 071/214] Internal Link Checker (#3281) * init * fix links * temp add fragments * fix links + remove fragments check --- .github/workflows/test.yml | 15 ++++++- lychee.toml | 41 +++++++++++++++++++ .../part-4-writing-onchain-go.mdx | 2 +- .../part-4-writing-onchain-ts.mdx | 2 +- .../submitting-reports-onchain.mdx | 2 +- .../using-http-client/get-request-go.mdx | 2 +- .../submitting-reports-http-go.mdx | 2 +- .../submitting-reports-http-ts.mdx | 2 +- .../cre/reference/sdk/consensus-go.mdx | 4 +- .../cre/reference/sdk/consensus-ts.mdx | 2 +- src/content/cre/reference/sdk/core-go.mdx | 2 +- .../templates/running-demo-workflow-go.mdx | 2 +- .../templates/running-demo-workflow-ts.mdx | 2 +- src/content/data-feeds/starknet/index.mdx | 2 +- .../data-streams/supported-networks.mdx | 2 +- .../data-streams/tutorials/rust-sdk-fetch.mdx | 2 +- .../tutorials/rust-sdk-stream.mdx | 2 +- .../quickstarts/vrf-enabled-lootbox-pack.mdx | 4 +- 18 files changed, 73 insertions(+), 19 deletions(-) create mode 100644 lychee.toml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 98ed932ceca..4c2457d3c02 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -135,6 +135,8 @@ jobs: linkcheck-internal: needs: setup runs-on: ubuntu-latest + permissions: + contents: read steps: - name: Checkout Repo uses: actions/checkout@v6 @@ -159,9 +161,20 @@ jobs: echo "node_modules not found, installing dependencies..." npm ci --prefer-offline --no-audit fi + + - name: Build Site + run: npm run build - name: Check Internal Links - run: npm run linkcheck-internal + uses: lycheeverse/lychee-action@a8c4c7cb88f0c7386610c35eb25108e448569cb0 # v2.7.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: 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/src/content/cre/getting-started/part-4-writing-onchain-go.mdx b/src/content/cre/getting-started/part-4-writing-onchain-go.mdx index 1a5be2c1733..89c29c128db 100644 --- a/src/content/cre/getting-started/part-4-writing-onchain-go.mdx +++ b/src/content/cre/getting-started/part-4-writing-onchain-go.mdx @@ -183,7 +183,7 @@ go mod tidy <Aside type="note" title="Funding Your Account"> This step submits an onchain transaction, which requires gas. Before running the simulation, verify that the account associated with the private key from [Part - 1](/cre/getting-started/part-1-project-setup#step-3-configure-the-environment) is funded with sufficient Sepolia ETH. + 1](/cre/getting-started/part-1-project-setup-go#set-up-your-private-key) is funded with sufficient Sepolia ETH. An unfunded account will cause the transaction to fail, often with an error message like `gas required exceeds allowance`. <br/> diff --git a/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx b/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx index 884461f2079..2f488b3e63f 100644 --- a/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx +++ b/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx @@ -184,7 +184,7 @@ These helpers are great for production code, but we use the explicit approach he <Aside type="note" title="Funding Your Account"> This step submits an onchain transaction, which requires gas. Before running the simulation, verify that the account associated with the private key from [Part - 1](/cre/getting-started/part-1-project-setup#step-3-configure-your-workflow) is funded with sufficient Sepolia ETH. + 1](/cre/getting-started/part-1-project-setup-ts#set-up-your-private-key) is funded with sufficient Sepolia ETH. An unfunded account will cause the transaction to fail, often with an error message like `gas required exceeds allowance`. <br/> diff --git a/src/content/cre/guides/workflow/using-evm-client/onchain-write/submitting-reports-onchain.mdx b/src/content/cre/guides/workflow/using-evm-client/onchain-write/submitting-reports-onchain.mdx index 2e108704895..c7a230a597f 100644 --- a/src/content/cre/guides/workflow/using-evm-client/onchain-write/submitting-reports-onchain.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/onchain-write/submitting-reports-onchain.mdx @@ -258,7 +258,7 @@ By default, `cre workflow simulate` performs a dry run without broadcasting tran cre workflow simulate my-workflow --broadcast --target staging-settings ``` -See the [CLI Reference](/cre/reference/cli#cre-workflow-simulate) for more details. +See the [CLI Reference](/cre/reference/cli/workflow#cre-workflow-simulate) for more details. ## Troubleshooting diff --git a/src/content/cre/guides/workflow/using-http-client/get-request-go.mdx b/src/content/cre/guides/workflow/using-http-client/get-request-go.mdx index 79afa8db3db..9560458aaee 100644 --- a/src/content/cre/guides/workflow/using-http-client/get-request-go.mdx +++ b/src/content/cre/guides/workflow/using-http-client/get-request-go.mdx @@ -17,7 +17,7 @@ The `http.Client` is the SDK's interface for the underlying [HTTP Capability](/c All HTTP requests are wrapped in a consensus mechanism to provide a single, reliable result. The SDK provides two ways to do this: - **[`http.SendRequest`](#1-the-httpsendrequest-pattern-recommended):** (Recommended) A high-level helper function that simplifies making requests. -- **[`cre.RunInNodeMode`](#2-the-cre-runinnodemode-pattern-low-level):** The lower-level pattern for more complex scenarios. +- **[`cre.RunInNodeMode`](#2-the-creruninnodemode-pattern-low-level):** The lower-level pattern for more complex scenarios. ## Prerequisites diff --git a/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-go.mdx b/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-go.mdx index 9d7cd4b6e23..33b1f6575ef 100644 --- a/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-go.mdx +++ b/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-go.mdx @@ -129,7 +129,7 @@ Here are common patterns for formatting reports. Choose the one that matches you | Pattern | When to use | | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | | [**Pattern 1: Report in body**](#pattern-1-report-in-body-simplest) | Your API accepts raw binary data and handles decoding | -| [**Pattern 2: Report + signatures in body**](#pattern-2-report-signatures-in-body) | Your API needs everything concatenated in one binary blob | +| [**Pattern 2: Report + signatures in body**](#pattern-2-report--signatures-in-body) | Your API needs everything concatenated in one binary blob | | [**Pattern 3: Report in body, signatures in headers**](#pattern-3-report-in-body-signatures-in-headers) | Your API needs signatures separated for easier parsing | | [**Pattern 4: JSON-formatted report**](#pattern-4-json-formatted-report) | Your API only accepts JSON payloads | diff --git a/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-ts.mdx b/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-ts.mdx index ef060842e5c..0b59b4de97e 100644 --- a/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-ts.mdx +++ b/src/content/cre/guides/workflow/using-http-client/submitting-reports-http-ts.mdx @@ -131,7 +131,7 @@ Here are common patterns for formatting reports. Choose the one that matches you | Pattern | When to use | | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | | [**Pattern 1: Report in body**](#pattern-1-report-in-body-simplest) | Your API accepts raw binary data and handles decoding | -| [**Pattern 2: Report + signatures in body**](#pattern-2-report-signatures-in-body) | Your API needs everything concatenated in one binary blob | +| [**Pattern 2: Report + signatures in body**](#pattern-2-report--signatures-in-body) | Your API needs everything concatenated in one binary blob | | [**Pattern 3: Report in body, signatures in headers**](#pattern-3-report-in-body-signatures-in-headers) | Your API needs signatures separated for easier parsing | | [**Pattern 4: JSON-formatted report**](#pattern-4-json-formatted-report) | Your API only accepts JSON payloads | diff --git a/src/content/cre/reference/sdk/consensus-go.mdx b/src/content/cre/reference/sdk/consensus-go.mdx index 994a0747eef..f7e31fb9fed 100644 --- a/src/content/cre/reference/sdk/consensus-go.mdx +++ b/src/content/cre/reference/sdk/consensus-go.mdx @@ -20,8 +20,8 @@ This is a generic interface passed as the final argument to `cre.RunInNodeMode`. There are two primary ways to specify an aggregation method: -1. [**Using Built-in Functions**](/cre/reference/sdk/consensus-go/#1-built-in-aggregation-functions): For simple types, you can use functions like [`ConsensusMedianAggregation`](/cre/reference/sdk/consensus/#consensusmedianaggregationt). -1. [**Using Struct Tags**](/cre/reference/sdk/consensus-go/#2-aggregation-via-struct-tags): For complex types (structs), you can use [`ConsensusAggregationFromTags`](/cre/reference/sdk/consensus/#aggregation-via-struct-tags). +1. [**Using Built-in Functions**](/cre/reference/sdk/consensus-go/#1-built-in-aggregation-functions): For simple types, you can use functions like [`ConsensusMedianAggregation`](/cre/reference/sdk/consensus-go#consensusmedianaggregationt). +1. [**Using Struct Tags**](/cre/reference/sdk/consensus-go/#2-aggregation-via-struct-tags): For complex types (structs), you can use [`ConsensusAggregationFromTags`](/cre/reference/sdk/consensus-go#2-aggregation-via-struct-tags). ## 1. Built-in aggregation functions diff --git a/src/content/cre/reference/sdk/consensus-ts.mdx b/src/content/cre/reference/sdk/consensus-ts.mdx index 2ee9cfcce98..052b0d2eda0 100644 --- a/src/content/cre/reference/sdk/consensus-ts.mdx +++ b/src/content/cre/reference/sdk/consensus-ts.mdx @@ -21,7 +21,7 @@ This is a generic type passed as the second argument to `runtime.runInNodeMode() There are two primary ways to specify an aggregation method: 1. [**Using built-in functions**](/cre/reference/sdk/consensus-ts#1-built-in-aggregation-functions): For simple types, use functions like [`consensusMedianAggregation()`](#consensusmedianaggregationt). -1. [**Using field-based aggregation**](/cre/reference/sdk/consensus-ts#2-field-based-aggregation-for-objects): For complex types (objects), use [`ConsensusAggregationByFields()`](#consensusaggregationbyfields). +1. [**Using field-based aggregation**](/cre/reference/sdk/consensus-ts#2-field-based-aggregation-for-objects): For complex types (objects), use [`ConsensusAggregationByFields()`](#consensusaggregationbyfieldstfields). ## 1. Built-in aggregation functions diff --git a/src/content/cre/reference/sdk/core-go.mdx b/src/content/cre/reference/sdk/core-go.mdx index 1d48367c108..3e22abf709f 100644 --- a/src/content/cre/reference/sdk/core-go.mdx +++ b/src/content/cre/reference/sdk/core-go.mdx @@ -50,7 +50,7 @@ These interfaces provide access to capabilities and manage the execution context - **`cre.Runtime` ("Easy Mode")**: Passed to your main trigger callback, this represents the **DON's (Decentralized Oracle Network) execution context**. It is used for operations that are already guaranteed to be Byzantine Fault Tolerant (BFT). When you use the `Runtime`, you ask the network to execute something, and CRE handles the underlying complexity to ensure you get back one final, secure, and trustworthy result. A common use case is writing a transaction to a blockchain with the EVM client. -- **`cre.NodeRuntime` ("Manual Mode")**: Represents an **individual node's execution context**. This is used when a BFT guarantee cannot be provided automatically (e.g., calling a third-party API). You tell each node to perform a task on its own, and each node returns its own individual answer. You are then responsible for telling the SDK how to combine them into a single, trusted result by providing a consensus and aggregation algorithm. It is used exclusively inside a [`RunInNodeMode`](#sdkruninnodemode) block and is provided by that function—you do not get this type directly in your handler's callback. +- **`cre.NodeRuntime` ("Manual Mode")**: Represents an **individual node's execution context**. This is used when a BFT guarantee cannot be provided automatically (e.g., calling a third-party API). You tell each node to perform a task on its own, and each node returns its own individual answer. You are then responsible for telling the SDK how to combine them into a single, trusted result by providing a consensus and aggregation algorithm. It is used exclusively inside a [`RunInNodeMode`](#creruninnodemode) block and is provided by that function—you do not get this type directly in your handler's callback. To learn more about how to aggregate results from `NodeRuntime`, see the [Consensus & Aggregation](/cre/reference/sdk/consensus) reference. diff --git a/src/content/cre/templates/running-demo-workflow-go.mdx b/src/content/cre/templates/running-demo-workflow-go.mdx index e3d2a8235d9..7a22e3dca0f 100644 --- a/src/content/cre/templates/running-demo-workflow-go.mdx +++ b/src/content/cre/templates/running-demo-workflow-go.mdx @@ -132,7 +132,7 @@ Now you are ready to compile and run the workflow. The workflow code (`workflow. <Aside type="note" title="Onchain Writes are Dry Runs by Default"> The `--broadcast` flag is included here because this workflow performs an onchain write. By default, the `simulate` command performs a dry run and will not broadcast the transaction without this flag. For more details, see the `cre - workflow simulate` [reference](/cre/reference/cli#cre-workflow-simulate). + workflow simulate` [reference](/cre/reference/cli/workflow#cre-workflow-simulate). </Aside> You will first see a `Workflow compiled` message, followed by the trigger selection menu. diff --git a/src/content/cre/templates/running-demo-workflow-ts.mdx b/src/content/cre/templates/running-demo-workflow-ts.mdx index 9f97a122dd8..df9bc00d75e 100644 --- a/src/content/cre/templates/running-demo-workflow-ts.mdx +++ b/src/content/cre/templates/running-demo-workflow-ts.mdx @@ -123,7 +123,7 @@ Now you are ready to compile and run the workflow. The single `main.ts` file you <Aside type="note" title="Onchain Writes are Dry Runs by Default"> The `--broadcast` flag is included here because this workflow performs an onchain write. By default, the `simulate` command performs a dry run and will not broadcast the transaction without this flag. For more details, see the `cre - workflow simulate` [reference](/cre/reference/cli#cre-workflow-simulate). + workflow simulate` [reference](/cre/reference/cli/workflow#cre-workflow-simulate). </Aside> You will first see a `Workflow compiled` message, followed by the trigger selection menu. diff --git a/src/content/data-feeds/starknet/index.mdx b/src/content/data-feeds/starknet/index.mdx index 40fcede33ec..df75d3235d6 100644 --- a/src/content/data-feeds/starknet/index.mdx +++ b/src/content/data-feeds/starknet/index.mdx @@ -44,7 +44,7 @@ starkli --version 0.2.8 (f59724e) ``` -Follow the official [installation guide](<(https://book.starkli.rs/installation)>) if necessary. +Follow the official [installation guide](https://book.starkli.rs/installation) if necessary. ### Read data from a Chainlink Price Feed diff --git a/src/content/data-streams/supported-networks.mdx b/src/content/data-streams/supported-networks.mdx index b9db36c7471..3e5404e4f45 100644 --- a/src/content/data-streams/supported-networks.mdx +++ b/src/content/data-streams/supported-networks.mdx @@ -23,7 +23,7 @@ The table below lists all networks supported by Data Streams, each with verifier ## Streams Trade implementation (Onchain Lookup) -[Streams Trade](streams-trade), the alternative implementation, allows smart contracts to access Data Streams onchain using the [`StreamsLookup`](/data-streams/getting-started) capability integrated with [Chainlink Automation](/chainlink-automation). +[Streams Trade](/data-streams/streams-trade), the alternative implementation, allows smart contracts to access Data Streams onchain using the [`StreamsLookup`](/data-streams/getting-started) capability integrated with [Chainlink Automation](/chainlink-automation). Streams Trade is currently available on the following networks: diff --git a/src/content/data-streams/tutorials/rust-sdk-fetch.mdx b/src/content/data-streams/tutorials/rust-sdk-fetch.mdx index ecea498a89d..3197cba6fd8 100644 --- a/src/content/data-streams/tutorials/rust-sdk-fetch.mdx +++ b/src/content/data-streams/tutorials/rust-sdk-fetch.mdx @@ -177,7 +177,7 @@ You'll start with the set up of your Rust project, installing the SDK and pastin ).build()?; ``` - This configuration also specifies the `rest_url`, which is the base URL for the API, along with the WebSocket endpoint [for subscribing to a streamed data report](rust-sdk-stream). In this example, both are set to the testnet URLs for Data Streams. + This configuration also specifies the `rest_url`, which is the base URL for the API, along with the WebSocket endpoint [for subscribing to a streamed data report](/data-streams/tutorials/rust-sdk-stream). In this example, both are set to the testnet URLs for Data Streams. See the [Rust SDK Reference](/data-streams/reference/data-streams-api/rust-sdk#configuration-reference) page for more configuration options. diff --git a/src/content/data-streams/tutorials/rust-sdk-stream.mdx b/src/content/data-streams/tutorials/rust-sdk-stream.mdx index 74a7afd8cff..3419e0b7f49 100644 --- a/src/content/data-streams/tutorials/rust-sdk-stream.mdx +++ b/src/content/data-streams/tutorials/rust-sdk-stream.mdx @@ -231,7 +231,7 @@ In this tutorial, you'll learn how to use the [Data Streams SDK](/data-streams/r ).build()?; ``` - This configuration also specifies the `rest_url`, which is the base URL for the API, along with the WebSocket endpoint [for subscribing to a streamed data report](rust-sdk-stream). In this example, both are set to the testnet URLs for Data Streams. + This configuration also specifies the `rest_url`, which is the base URL for the API, along with the WebSocket endpoint for subscribing to a streamed data report. In this example, both are set to the testnet URLs for Data Streams. See the [Rust SDK Reference](/data-streams/reference/data-streams-api/rust-sdk#configuration-reference) page for more configuration options. diff --git a/src/content/quickstarts/vrf-enabled-lootbox-pack.mdx b/src/content/quickstarts/vrf-enabled-lootbox-pack.mdx index bb059ad6251..f11d0c1dc05 100644 --- a/src/content/quickstarts/vrf-enabled-lootbox-pack.mdx +++ b/src/content/quickstarts/vrf-enabled-lootbox-pack.mdx @@ -62,7 +62,7 @@ Your _deployer account_ is the main account that you will use to deploy the loot - Ensure the deployer account owns all the assets you wish to distribute as rewards. - To deploy this contract on testnets, ensure the deployer account has testnet LINK and testnet ETH (Sepolia). Use the [LINK faucet](https://faucets.chain.link/) to retrieve 20 testnet LINK and 0.1 Sepolia ETH. - Ensure the deployer account has enough LINK to fund the [VRF subscription](/vrf/v2/subscription). If you don't already have a VRF subscription, the deployment script will create and fund one for you. - - [Estimate the minimum subscription balance](/vrf/v2/estimating-costs#estimate-minimum-subscription-balance) that VRF requires to process your randomness request. The minimum subscription balance provides a buffer against gas volatility, and only the actual cost of your request will be deducted from your account. If your subscription is underfunded, your VRF request will be [pending](/vrf/v2/subscription/ui#pending) for 24 hours. If that happens, check the [Subscription Manager](https://vrf.chain.link]) to see the additional balance needed. + - [Estimate the minimum subscription balance](/vrf/v2/estimating-costs#estimate-minimum-subscription-balance) that VRF requires to process your randomness request. The minimum subscription balance provides a buffer against gas volatility, and only the actual cost of your request will be deducted from your account. If your subscription is underfunded, your VRF request will be [pending](/vrf/v2/subscription/ui#pending) for 24 hours. If that happens, check the [Subscription Manager](https://vrf.chain.link) to see the additional balance needed. - The initial funding amount is set to 10 LINK. Optionally, you can modify the initial funding amount in [`network-config.ts`](https://github.com/smartcontractkit/quickstarts-lootbox/blob/main/network-config.ts). - [Create a second account in your MetaMask wallet](https://support.metamask.io/hc/en-us/articles/360015289452-How-to-create-an-additional-account-in-your-wallet). This account is called the _receiving account_ in this tutorial, and its address is called the _opener address_. You will use this receiving account to open a test lootbox and receive the rewards as a user. [Configure the account](https://support.metamask.io/hc/en-us/articles/360015489031-How-to-display-tokens-in-MetaMask) to display the rewards that you want to distribute from the lootbox. @@ -236,7 +236,7 @@ The [deploy script](https://github.com/smartcontractkit/quickstarts-lootbox/blob [Estimate the minimum subscription balance](/vrf/v2/estimating-costs#estimate-minimum-subscription-balance) that VRF requires to process your randomness request. The minimum subscription balance provides a buffer against gas volatility, and only the actual cost of your request will be deducted from your account. - If your subscription is underfunded, your VRF request will be [pending](/vrf/v2/subscription/ui#pending) for 24 hours. If this happens, check the [Subscription Manager](https://vrf.chain.link]) to see the additional balance needed. + If your subscription is underfunded, your VRF request will be [pending](/vrf/v2/subscription/ui#pending) for 24 hours. If this happens, check the [Subscription Manager](https://vrf.chain.link) to see the additional balance needed. </Aside> From ca264c19c6699885bccd783ef6f7f2e1a09e9bf3 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Thu, 18 Dec 2025 09:28:30 -0600 Subject: [PATCH 072/214] various updates to SDK reference and examples (#3307) --- .../http-trigger/configuration-go.mdx | 4 +- src/content/cre/llms-full-go.txt | 20 ++-- src/content/cre/llms-full-ts.txt | 92 +++++++++++++++++-- .../cre/reference/sdk/evm-client-ts.mdx | 80 ++++++++++++++++ src/content/cre/reference/sdk/overview-ts.mdx | 4 +- src/content/data-feeds/llms-full.txt | 2 +- src/content/data-streams/llms-full.txt | 6 +- 7 files changed, 184 insertions(+), 24 deletions(-) diff --git a/src/content/cre/guides/workflow/using-triggers/http-trigger/configuration-go.mdx b/src/content/cre/guides/workflow/using-triggers/http-trigger/configuration-go.mdx index b7edb4423f7..8b98565caed 100644 --- a/src/content/cre/guides/workflow/using-triggers/http-trigger/configuration-go.mdx +++ b/src/content/cre/guides/workflow/using-triggers/http-trigger/configuration-go.mdx @@ -44,7 +44,7 @@ func onHttpTrigger(config *Config, runtime cre.Runtime, payload *http.Payload) ( logger := runtime.Logger() // Unmarshal the JSON input from bytes - var requestData map[string]interface{} + var requestData map[string]any if err := json.Unmarshal(payload.Input, &requestData); err != nil { return nil, fmt.Errorf("failed to unmarshal input: %w", err) } @@ -92,7 +92,7 @@ func onHttpTrigger(config *Config, runtime cre.Runtime, payload *http.Payload) ( // The payload.Input is []byte containing JSON data. // Unmarshal it into a map or a custom struct. - var requestData map[string]interface{} + var requestData map[string]any if err := json.Unmarshal(payload.Input, &requestData); err != nil { return nil, fmt.Errorf("failed to unmarshal input: %w", err) } diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 8f68b4320a2..23fcf476d37 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -4174,7 +4174,7 @@ By default, `cre workflow simulate` performs a dry run without broadcasting tran cre workflow simulate my-workflow --broadcast --target staging-settings ``` -See the [CLI Reference](/cre/reference/cli#cre-workflow-simulate) for more details. +See the [CLI Reference](/cre/reference/cli/workflow#cre-workflow-simulate) for more details. ## Troubleshooting @@ -9758,7 +9758,7 @@ go mod tidy <Aside type="note" title="Funding Your Account"> This step submits an onchain transaction, which requires gas. Before running the simulation, verify that the account associated with the private key from [Part - 1](/cre/getting-started/part-1-project-setup#step-3-configure-the-environment) is funded with sufficient Sepolia ETH. + 1](/cre/getting-started/part-1-project-setup-go#set-up-your-private-key) is funded with sufficient Sepolia ETH. An unfunded account will cause the transaction to fail, often with an error message like `gas required exceeds allowance`. @@ -10758,7 +10758,7 @@ The `http.Client` is the SDK's interface for the underlying [HTTP Capability](/c All HTTP requests are wrapped in a consensus mechanism to provide a single, reliable result. The SDK provides two ways to do this: - **[`http.SendRequest`](#1-the-httpsendrequest-pattern-recommended):** (Recommended) A high-level helper function that simplifies making requests. -- **[`cre.RunInNodeMode`](#2-the-cre-runinnodemode-pattern-low-level):** The lower-level pattern for more complex scenarios. +- **[`cre.RunInNodeMode`](#2-the-creruninnodemode-pattern-low-level):** The lower-level pattern for more complex scenarios. ## Prerequisites @@ -11640,7 +11640,7 @@ Here are common patterns for formatting reports. Choose the one that matches you | Pattern | When to use | | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | | [**Pattern 1: Report in body**](#pattern-1-report-in-body-simplest) | Your API accepts raw binary data and handles decoding | -| [**Pattern 2: Report + signatures in body**](#pattern-2-report-signatures-in-body) | Your API needs everything concatenated in one binary blob | +| [**Pattern 2: Report + signatures in body**](#pattern-2-report--signatures-in-body) | Your API needs everything concatenated in one binary blob | | [**Pattern 3: Report in body, signatures in headers**](#pattern-3-report-in-body-signatures-in-headers) | Your API needs signatures separated for easier parsing | | [**Pattern 4: JSON-formatted report**](#pattern-4-json-formatted-report) | Your API only accepts JSON payloads | @@ -12663,7 +12663,7 @@ func onHttpTrigger(config *Config, runtime cre.Runtime, payload *http.Payload) ( logger := runtime.Logger() // Unmarshal the JSON input from bytes - var requestData map[string]interface{} + var requestData map[string]any if err := json.Unmarshal(payload.Input, &requestData); err != nil { return nil, fmt.Errorf("failed to unmarshal input: %w", err) } @@ -12711,7 +12711,7 @@ func onHttpTrigger(config *Config, runtime cre.Runtime, payload *http.Payload) ( // The payload.Input is []byte containing JSON data. // Unmarshal it into a map or a custom struct. - var requestData map[string]interface{} + var requestData map[string]any if err := json.Unmarshal(payload.Input, &requestData); err != nil { return nil, fmt.Errorf("failed to unmarshal input: %w", err) } @@ -13211,8 +13211,8 @@ This is a generic interface passed as the final argument to `cre.RunInNodeMode`. There are two primary ways to specify an aggregation method: -1. [**Using Built-in Functions**](/cre/reference/sdk/consensus-go/#1-built-in-aggregation-functions): For simple types, you can use functions like [`ConsensusMedianAggregation`](/cre/reference/sdk/consensus/#consensusmedianaggregationt). -2. [**Using Struct Tags**](/cre/reference/sdk/consensus-go/#2-aggregation-via-struct-tags): For complex types (structs), you can use [`ConsensusAggregationFromTags`](/cre/reference/sdk/consensus/#aggregation-via-struct-tags). +1. [**Using Built-in Functions**](/cre/reference/sdk/consensus-go/#1-built-in-aggregation-functions): For simple types, you can use functions like [`ConsensusMedianAggregation`](/cre/reference/sdk/consensus-go#consensusmedianaggregationt). +2. [**Using Struct Tags**](/cre/reference/sdk/consensus-go/#2-aggregation-via-struct-tags): For complex types (structs), you can use [`ConsensusAggregationFromTags`](/cre/reference/sdk/consensus-go#2-aggregation-via-struct-tags). ## 1. Built-in aggregation functions @@ -13368,7 +13368,7 @@ These interfaces provide access to capabilities and manage the execution context - **`cre.Runtime` ("Easy Mode")**: Passed to your main trigger callback, this represents the **DON's (Decentralized Oracle Network) execution context**. It is used for operations that are already guaranteed to be Byzantine Fault Tolerant (BFT). When you use the `Runtime`, you ask the network to execute something, and CRE handles the underlying complexity to ensure you get back one final, secure, and trustworthy result. A common use case is writing a transaction to a blockchain with the EVM client. -- **`cre.NodeRuntime` ("Manual Mode")**: Represents an **individual node's execution context**. This is used when a BFT guarantee cannot be provided automatically (e.g., calling a third-party API). You tell each node to perform a task on its own, and each node returns its own individual answer. You are then responsible for telling the SDK how to combine them into a single, trusted result by providing a consensus and aggregation algorithm. It is used exclusively inside a [`RunInNodeMode`](#sdkruninnodemode) block and is provided by that function—you do not get this type directly in your handler's callback. +- **`cre.NodeRuntime` ("Manual Mode")**: Represents an **individual node's execution context**. This is used when a BFT guarantee cannot be provided automatically (e.g., calling a third-party API). You tell each node to perform a task on its own, and each node returns its own individual answer. You are then responsible for telling the SDK how to combine them into a single, trusted result by providing a consensus and aggregation algorithm. It is used exclusively inside a [`RunInNodeMode`](#creruninnodemode) block and is provided by that function—you do not get this type directly in your handler's callback. To learn more about how to aggregate results from `NodeRuntime`, see the [Consensus & Aggregation](/cre/reference/sdk/consensus) reference. @@ -14638,7 +14638,7 @@ Now you are ready to compile and run the workflow. The workflow code (`workflow. <Aside type="note" title="Onchain Writes are Dry Runs by Default"> The `--broadcast` flag is included here because this workflow performs an onchain write. By default, the `simulate` command performs a dry run and will not broadcast the transaction without this flag. For more details, see the `cre - workflow simulate` [reference](/cre/reference/cli#cre-workflow-simulate). + workflow simulate` [reference](/cre/reference/cli/workflow#cre-workflow-simulate). </Aside> You will first see a `Workflow compiled` message, followed by the trigger selection menu. diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index 0d6c952e0b8..4593d21a175 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -8550,7 +8550,7 @@ main() <Aside type="note" title="Funding Your Account"> This step submits an onchain transaction, which requires gas. Before running the simulation, verify that the account associated with the private key from [Part - 1](/cre/getting-started/part-1-project-setup#step-3-configure-your-workflow) is funded with sufficient Sepolia ETH. + 1](/cre/getting-started/part-1-project-setup-ts#set-up-your-private-key) is funded with sufficient Sepolia ETH. An unfunded account will cause the transaction to fail, often with an error message like `gas required exceeds allowance`. @@ -10444,7 +10444,7 @@ Here are common patterns for formatting reports. Choose the one that matches you | Pattern | When to use | | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | | [**Pattern 1: Report in body**](#pattern-1-report-in-body-simplest) | Your API accepts raw binary data and handles decoding | -| [**Pattern 2: Report + signatures in body**](#pattern-2-report-signatures-in-body) | Your API needs everything concatenated in one binary blob | +| [**Pattern 2: Report + signatures in body**](#pattern-2-report--signatures-in-body) | Your API needs everything concatenated in one binary blob | | [**Pattern 3: Report in body, signatures in headers**](#pattern-3-report-in-body-signatures-in-headers) | Your API needs signatures separated for easier parsing | | [**Pattern 4: JSON-formatted report**](#pattern-4-json-formatted-report) | Your API only accepts JSON payloads | @@ -12077,7 +12077,7 @@ This is a generic type passed as the second argument to `runtime.runInNodeMode() There are two primary ways to specify an aggregation method: 1. [**Using built-in functions**](/cre/reference/sdk/consensus-ts#1-built-in-aggregation-functions): For simple types, use functions like [`consensusMedianAggregation()`](#consensusmedianaggregationt). -2. [**Using field-based aggregation**](/cre/reference/sdk/consensus-ts#2-field-based-aggregation-for-objects): For complex types (objects), use [`ConsensusAggregationByFields()`](#consensusaggregationbyfields). +2. [**Using field-based aggregation**](/cre/reference/sdk/consensus-ts#2-field-based-aggregation-for-objects): For complex types (objects), use [`ConsensusAggregationByFields()`](#consensusaggregationbyfieldstfields). ## 1. Built-in aggregation functions @@ -13213,6 +13213,86 @@ function hexToBase64(hex: Hex): string *** +### `protoBigIntToBigint()` + +Converts a protobuf `BigInt` (returned by SDK methods like `headerByNumber`) to a native JavaScript `bigint`. Use this when you need to perform arithmetic on block numbers or other numeric values returned from the blockchain. + +**Signature:** + +```typescript +function protoBigIntToBigint(pb: ProtoBigInt): bigint +``` + +**Parameters:** + +- `pb`: A protobuf `BigInt` object with `absVal` (Uint8Array) and `sign` (bigint) fields + +**Returns:** + +A native JavaScript `bigint` value. + +**Usage:** + +```typescript +import { protoBigIntToBigint } from "@chainlink/cre-sdk" + +// Get the latest block number from the blockchain +const latestHeader = evmClient.headerByNumber(runtime, {}).result() + +// Convert the protobuf BigInt to a native bigint for arithmetic +const latestBlockNum = protoBigIntToBigint(latestHeader.header.blockNumber) +const customBlock = latestBlockNum - 500n // Now you can do arithmetic + +console.log(`Latest block: ${latestBlockNum}`) +console.log(`Custom block (500 blocks ago): ${customBlock}`) +``` + +See [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-ts#custom-block-depths) for a complete example. + +*** + +### `blockNumber()` + +Converts a native `bigint`, `number`, or `string` to the protobuf `BigInt` JSON format required by SDK methods. This is a convenience alias for `bigintToProtoBigInt`. Use this when specifying an explicit block height for contract calls or other blockchain queries. + +**Signature:** + +```typescript +function blockNumber(n: number | bigint | string): BigIntJson +``` + +**Parameters:** + +- `n`: The block number as a native `bigint`, `number`, or `string` + +**Returns:** + +A `BigIntJson` object in the protobuf format expected by SDK methods. + +**Usage:** + +```typescript +import { blockNumber, encodeCallMsg } from "@chainlink/cre-sdk" +import { zeroAddress } from "viem" + +// Read from a specific historical block +const historicalBlock = 9767655n +const contractCall = evmClient + .callContract(runtime, { + call: encodeCallMsg({ + from: zeroAddress, + to: contractAddress, + data: callData, + }), + blockNumber: blockNumber(historicalBlock), + }) + .result() +``` + +See [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-ts#custom-block-depths) for a complete example. + +*** + ### `prepareReportRequest()` Prepares a report request with default EVM encoding parameters for use with `runtime.report()`. This helper simplifies report generation by automatically setting the standard encoding configuration (`evm`, `ecdsa`, `keccak256`) required for EVM-based workflows. @@ -14039,8 +14119,8 @@ const reserveInfo = httpClient Source: https://docs.chain.link/cre/reference/sdk/overview-ts Last Updated: 2025-11-04 -<Aside type="note" title="Required SDK Version: v1.0.0"> - The CRE CLI automatically includes version `v1.0.0` of the `@chainlink/cre-sdk` package when you initialize a new +<Aside type="note" title="Required SDK Version: v1.0.1"> + The CRE CLI automatically includes version `v1.0.1` of the `@chainlink/cre-sdk` package when you initialize a new TypeScript workflow with `cre init`. </Aside> @@ -14845,7 +14925,7 @@ Now you are ready to compile and run the workflow. The single `main.ts` file you <Aside type="note" title="Onchain Writes are Dry Runs by Default"> The `--broadcast` flag is included here because this workflow performs an onchain write. By default, the `simulate` command performs a dry run and will not broadcast the transaction without this flag. For more details, see the `cre - workflow simulate` [reference](/cre/reference/cli#cre-workflow-simulate). + workflow simulate` [reference](/cre/reference/cli/workflow#cre-workflow-simulate). </Aside> You will first see a `Workflow compiled` message, followed by the trigger selection menu. diff --git a/src/content/cre/reference/sdk/evm-client-ts.mdx b/src/content/cre/reference/sdk/evm-client-ts.mdx index 15ec4209239..bc3b606e33a 100644 --- a/src/content/cre/reference/sdk/evm-client-ts.mdx +++ b/src/content/cre/reference/sdk/evm-client-ts.mdx @@ -559,6 +559,86 @@ function hexToBase64(hex: Hex): string --- +### `protoBigIntToBigint()` + +Converts a protobuf `BigInt` (returned by SDK methods like `headerByNumber`) to a native JavaScript `bigint`. Use this when you need to perform arithmetic on block numbers or other numeric values returned from the blockchain. + +**Signature:** + +```typescript +function protoBigIntToBigint(pb: ProtoBigInt): bigint +``` + +**Parameters:** + +- `pb`: A protobuf `BigInt` object with `absVal` (Uint8Array) and `sign` (bigint) fields + +**Returns:** + +A native JavaScript `bigint` value. + +**Usage:** + +```typescript +import { protoBigIntToBigint } from "@chainlink/cre-sdk" + +// Get the latest block number from the blockchain +const latestHeader = evmClient.headerByNumber(runtime, {}).result() + +// Convert the protobuf BigInt to a native bigint for arithmetic +const latestBlockNum = protoBigIntToBigint(latestHeader.header.blockNumber) +const customBlock = latestBlockNum - 500n // Now you can do arithmetic + +console.log(`Latest block: ${latestBlockNum}`) +console.log(`Custom block (500 blocks ago): ${customBlock}`) +``` + +See [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-ts#custom-block-depths) for a complete example. + +--- + +### `blockNumber()` + +Converts a native `bigint`, `number`, or `string` to the protobuf `BigInt` JSON format required by SDK methods. This is a convenience alias for `bigintToProtoBigInt`. Use this when specifying an explicit block height for contract calls or other blockchain queries. + +**Signature:** + +```typescript +function blockNumber(n: number | bigint | string): BigIntJson +``` + +**Parameters:** + +- `n`: The block number as a native `bigint`, `number`, or `string` + +**Returns:** + +A `BigIntJson` object in the protobuf format expected by SDK methods. + +**Usage:** + +```typescript +import { blockNumber, encodeCallMsg } from "@chainlink/cre-sdk" +import { zeroAddress } from "viem" + +// Read from a specific historical block +const historicalBlock = 9767655n +const contractCall = evmClient + .callContract(runtime, { + call: encodeCallMsg({ + from: zeroAddress, + to: contractAddress, + data: callData, + }), + blockNumber: blockNumber(historicalBlock), + }) + .result() +``` + +See [Custom Block Depths](/cre/guides/workflow/using-evm-client/onchain-read-ts#custom-block-depths) for a complete example. + +--- + ### `prepareReportRequest()` Prepares a report request with default EVM encoding parameters for use with `runtime.report()`. This helper simplifies report generation by automatically setting the standard encoding configuration (`evm`, `ecdsa`, `keccak256`) required for EVM-based workflows. diff --git a/src/content/cre/reference/sdk/overview-ts.mdx b/src/content/cre/reference/sdk/overview-ts.mdx index 1e40071364c..3334f69d741 100644 --- a/src/content/cre/reference/sdk/overview-ts.mdx +++ b/src/content/cre/reference/sdk/overview-ts.mdx @@ -12,8 +12,8 @@ metadata: import { Aside } from "@components" -<Aside type="note" title="Required SDK Version: v1.0.0"> - The CRE CLI automatically includes version `v1.0.0` of the `@chainlink/cre-sdk` package when you initialize a new +<Aside type="note" title="Required SDK Version: v1.0.1"> + The CRE CLI automatically includes version `v1.0.1` of the `@chainlink/cre-sdk` package when you initialize a new TypeScript workflow with `cre init`. </Aside> diff --git a/src/content/data-feeds/llms-full.txt b/src/content/data-feeds/llms-full.txt index 9dc79ca85f0..65af3ea6c24 100644 --- a/src/content/data-feeds/llms-full.txt +++ b/src/content/data-feeds/llms-full.txt @@ -4151,7 +4151,7 @@ starkli --version 0.2.8 (f59724e) ``` -Follow the official [installation guide]((https://book.starkli.rs/installation)) if necessary. +Follow the official [installation guide](https://book.starkli.rs/installation) if necessary. ### Read data from a Chainlink Price Feed diff --git a/src/content/data-streams/llms-full.txt b/src/content/data-streams/llms-full.txt index 2ed3dd881c8..c83ac4ed025 100644 --- a/src/content/data-streams/llms-full.txt +++ b/src/content/data-streams/llms-full.txt @@ -5481,7 +5481,7 @@ The table below lists all networks supported by Data Streams, each with verifier ## Streams Trade implementation (Onchain Lookup) -[Streams Trade](streams-trade), the alternative implementation, allows smart contracts to access Data Streams onchain using the [`StreamsLookup`](/data-streams/getting-started) capability integrated with [Chainlink Automation](/chainlink-automation). +[Streams Trade](/data-streams/streams-trade), the alternative implementation, allows smart contracts to access Data Streams onchain using the [`StreamsLookup`](/data-streams/getting-started) capability integrated with [Chainlink Automation](/chainlink-automation). Streams Trade is currently available on the following networks: @@ -6818,7 +6818,7 @@ You'll start with the set up of your Rust project, installing the SDK and pastin ).build()?; ``` - This configuration also specifies the `rest_url`, which is the base URL for the API, along with the WebSocket endpoint [for subscribing to a streamed data report](rust-sdk-stream). In this example, both are set to the testnet URLs for Data Streams. + This configuration also specifies the `rest_url`, which is the base URL for the API, along with the WebSocket endpoint [for subscribing to a streamed data report](/data-streams/tutorials/rust-sdk-stream). In this example, both are set to the testnet URLs for Data Streams. See the [Rust SDK Reference](/data-streams/reference/data-streams-api/rust-sdk#configuration-reference) page for more configuration options. @@ -7185,7 +7185,7 @@ In this tutorial, you'll learn how to use the [Data Streams SDK](/data-streams/r ).build()?; ``` - This configuration also specifies the `rest_url`, which is the base URL for the API, along with the WebSocket endpoint [for subscribing to a streamed data report](rust-sdk-stream). In this example, both are set to the testnet URLs for Data Streams. + This configuration also specifies the `rest_url`, which is the base URL for the API, along with the WebSocket endpoint for subscribing to a streamed data report. In this example, both are set to the testnet URLs for Data Streams. See the [Rust SDK Reference](/data-streams/reference/data-streams-api/rust-sdk#configuration-reference) page for more configuration options. From fd5a047109d22cb9b29374c3fd3ee8a4ed75d5ae Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Thu, 18 Dec 2025 10:36:19 -0600 Subject: [PATCH 073/214] update consensus size limit (#3308) --- src/content/cre/llms-full-go.txt | 10 +++++----- src/content/cre/llms-full-ts.txt | 10 +++++----- src/content/cre/service-quotas.mdx | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 23fcf476d37..610756d9de3 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -249,7 +249,7 @@ The mechanism by which a DON comes to a single, reliable, and tamper-proof resul # Service Quotas Source: https://docs.chain.link/cre/service-quotas -Last Updated: 2025-12-11 +Last Updated: 2025-12-18 This page documents the service quotas for Chainlink Runtime Environment (CRE) workflows. @@ -314,10 +314,10 @@ These quotas apply to each individual workflow. ### Consensus quotas -| Quota Key | Description | Value | -| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ------ | -| <a href="#perworkflow-consensus-observationsizelimit" id="perworkflow-consensus-observationsizelimit">`PerWorkflow.Consensus.ObservationSizeLimit`</a> | Maximum size of data that can be passed to consensus aggregation | 100 KB | -| <a href="#perworkflow-consensus-calllimit" id="perworkflow-consensus-calllimit">`PerWorkflow.Consensus.CallLimit`</a> | Maximum number of consensus calls per workflow execution | 2,000 | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ----- | +| <a href="#perworkflow-consensus-observationsizelimit" id="perworkflow-consensus-observationsizelimit">`PerWorkflow.Consensus.ObservationSizeLimit`</a> | Maximum size of data that can be passed to consensus aggregation | 25 KB | +| <a href="#perworkflow-consensus-calllimit" id="perworkflow-consensus-calllimit">`PerWorkflow.Consensus.CallLimit`</a> | Maximum number of consensus calls per workflow execution | 2,000 | ### Logging quotas diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index 4593d21a175..a6c48dca892 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -249,7 +249,7 @@ The mechanism by which a DON comes to a single, reliable, and tamper-proof resul # Service Quotas Source: https://docs.chain.link/cre/service-quotas -Last Updated: 2025-12-11 +Last Updated: 2025-12-18 This page documents the service quotas for Chainlink Runtime Environment (CRE) workflows. @@ -314,10 +314,10 @@ These quotas apply to each individual workflow. ### Consensus quotas -| Quota Key | Description | Value | -| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ------ | -| <a href="#perworkflow-consensus-observationsizelimit" id="perworkflow-consensus-observationsizelimit">`PerWorkflow.Consensus.ObservationSizeLimit`</a> | Maximum size of data that can be passed to consensus aggregation | 100 KB | -| <a href="#perworkflow-consensus-calllimit" id="perworkflow-consensus-calllimit">`PerWorkflow.Consensus.CallLimit`</a> | Maximum number of consensus calls per workflow execution | 2,000 | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ----- | +| <a href="#perworkflow-consensus-observationsizelimit" id="perworkflow-consensus-observationsizelimit">`PerWorkflow.Consensus.ObservationSizeLimit`</a> | Maximum size of data that can be passed to consensus aggregation | 25 KB | +| <a href="#perworkflow-consensus-calllimit" id="perworkflow-consensus-calllimit">`PerWorkflow.Consensus.CallLimit`</a> | Maximum number of consensus calls per workflow execution | 2,000 | ### Logging quotas diff --git a/src/content/cre/service-quotas.mdx b/src/content/cre/service-quotas.mdx index 8086c84e6e6..630beb53a6e 100644 --- a/src/content/cre/service-quotas.mdx +++ b/src/content/cre/service-quotas.mdx @@ -5,7 +5,7 @@ date: Last Modified metadata: description: "Understand CRE service quotas for your workflows: execution timeouts, trigger rates, WASM resources, and organization constraints." datePublished: "2025-11-04" - lastModified: "2025-12-11" + lastModified: "2025-12-18" --- import { Aside } from "@components" @@ -73,10 +73,10 @@ These quotas apply to each individual workflow. ### Consensus quotas -| Quota Key | Description | Value | -| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ------ | -| <a href="#perworkflow-consensus-observationsizelimit" id="perworkflow-consensus-observationsizelimit">`PerWorkflow.Consensus.ObservationSizeLimit`</a> | Maximum size of data that can be passed to consensus aggregation | 100 KB | -| <a href="#perworkflow-consensus-calllimit" id="perworkflow-consensus-calllimit">`PerWorkflow.Consensus.CallLimit`</a> | Maximum number of consensus calls per workflow execution | 2,000 | +| Quota Key | Description | Value | +| ------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ----- | +| <a href="#perworkflow-consensus-observationsizelimit" id="perworkflow-consensus-observationsizelimit">`PerWorkflow.Consensus.ObservationSizeLimit`</a> | Maximum size of data that can be passed to consensus aggregation | 25 KB | +| <a href="#perworkflow-consensus-calllimit" id="perworkflow-consensus-calllimit">`PerWorkflow.Consensus.CallLimit`</a> | Maximum number of consensus calls per workflow execution | 2,000 | ### Logging quotas From 3824c76ab1194a3e8897dd7c73e20f6205e1a594 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Thu, 18 Dec 2025 18:30:40 -0600 Subject: [PATCH 074/214] add chain family dl (#3310) --- src/components/HeadCommon.astro | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/components/HeadCommon.astro b/src/components/HeadCommon.astro index f2199bba192..c9434d0daa4 100644 --- a/src/components/HeadCommon.astro +++ b/src/components/HeadCommon.astro @@ -81,6 +81,31 @@ const { title } = Astro.props })() </script> +<!-- Set CCIP Chain Family in dataLayer --> +<script is:inline type="text/javascript"> + ;(function () { + if (!window.location.pathname.startsWith("/ccip")) return + + try { + var savedChain = localStorage.getItem("chainlink-docs-chain-type") + // Default to "evm" if not set or invalid + var chainFamily = + savedChain === "solana" || savedChain === '"solana"' + ? "solana" + : savedChain === "aptos" || savedChain === '"aptos"' + ? "aptos" + : "evm" + + window.dataLayer = window.dataLayer || [] + window.dataLayer.push({ + ccip_chain_family: chainFamily, + }) + } catch (e) { + // localStorage unavailable, skip tracking + } + })() +</script> + <!-- Google Tag Manager (lazy init on first interaction or idle) --> <script type="text/javascript"> ;(function (w, d, s, l, i) { From 6a79b0b4030f179672efcd14e8cf5bfc7b217dc5 Mon Sep 17 00:00:00 2001 From: "Mark S. Shenouda" <49324987+markshenouda@users.noreply.github.com> Date: Fri, 19 Dec 2025 10:43:02 +0200 Subject: [PATCH 075/214] [FEAT] API Data integration (#183) * update: Token details page * update: Lane latest data * fix: lint * remove: unused console.log * remove: unused console.log * update: token drawer to include verifiers * refactor: extract realtime data logic into reusable hooks and components - Create custom hooks for data fetching: * useTokenRateLimits - single lane rate limits * useMultiLaneRateLimits - multiple lanes in parallel * useTokenFinality - token finality data - Add RateLimitCell component to replace complex nested ternaries - Create singleton realtimeDataService instance to avoid multiple instantiations - Add rate-limit-formatter utilities for consistent formatting - Update LaneDrawer, TokenDrawer, and TokenChainsTable to use new hooks - Add proper cleanup in useEffect hooks to prevent memory leaks Benefits: - Reduced code duplication (~133 lines removed) - Improved readability with <RateLimitCell> vs 7-level nested ternaries - Better separation of concerns - More testable code - Proper cleanup handling * fix: use enums for tabs * refactor: cleanup Lane's table logic * refactor: token drawer filtering logic * fix: token grid in chain page design * fix: the token card desgin * fix: lint * feat: add verifiers to the search (#184) * feat: add verifiers to the search * refactor: simplify verifiers mapping in Chain component * refactor: simplify verifiers mapping in CCIP components * refactor: optimize token mapping for verifiers in CCIP components * feat: enhance verifiers data handling with token support * fix: typecheck --- src/components/CCIP/Cards/TokenCard.css | 55 +++ src/components/CCIP/Cards/TokenCard.tsx | 45 ++- src/components/CCIP/Chain/Chain.astro | 15 +- src/components/CCIP/Chain/ChainTokenGrid.css | 1 - src/components/CCIP/Chain/ChainTokenGrid.tsx | 1 + src/components/CCIP/ChainHero/ChainHero.tsx | 27 +- src/components/CCIP/Drawer/LaneDrawer.tsx | 186 ++++----- src/components/CCIP/Drawer/TokenDrawer.tsx | 381 ++++++++++++------ src/components/CCIP/Hero/Hero.tsx | 11 +- .../CCIP/Landing/ccip-landing.astro | 9 +- src/components/CCIP/RateLimitCell.tsx | 46 +++ src/components/CCIP/Search/Search.tsx | 60 ++- .../CCIP/Tables/TokenChainsTable.tsx | 43 +- src/components/CCIP/Token/Token.astro | 7 + src/components/CCIP/Verifiers/Verifiers.astro | 32 +- src/hooks/useLaneTokens.ts | 64 +++ src/hooks/useMultiLaneRateLimits.ts | 78 ++++ src/hooks/useTokenFinality.ts | 66 +++ src/hooks/useTokenRateLimits.ts | 65 +++ .../ccip/services/realtime-data-instance.ts | 7 + src/lib/ccip/services/realtime-data.ts | 259 ++++++++++++ src/lib/ccip/utils/rate-limit-formatter.ts | 72 ++++ src/workers/data-worker.ts | 20 +- 23 files changed, 1293 insertions(+), 257 deletions(-) create mode 100644 src/components/CCIP/RateLimitCell.tsx create mode 100644 src/hooks/useLaneTokens.ts create mode 100644 src/hooks/useMultiLaneRateLimits.ts create mode 100644 src/hooks/useTokenFinality.ts create mode 100644 src/hooks/useTokenRateLimits.ts create mode 100644 src/lib/ccip/services/realtime-data-instance.ts create mode 100644 src/lib/ccip/services/realtime-data.ts create mode 100644 src/lib/ccip/utils/rate-limit-formatter.ts diff --git a/src/components/CCIP/Cards/TokenCard.css b/src/components/CCIP/Cards/TokenCard.css index d8e2b7d6e2d..ae035e97a19 100644 --- a/src/components/CCIP/Cards/TokenCard.css +++ b/src/components/CCIP/Cards/TokenCard.css @@ -51,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 7810da7f4f7..51372209112 100644 --- a/src/components/CCIP/Cards/TokenCard.tsx +++ b/src/components/CCIP/Cards/TokenCard.tsx @@ -9,9 +9,17 @@ interface TokenCardProps { link?: string onClick?: () => void totalNetworks?: number + variant?: "default" | "square" } -const TokenCard = memo(function TokenCard({ id, logo, link, onClick, totalNetworks }: TokenCardProps) { +const TokenCard = memo(function TokenCard({ + id, + logo, + link, + onClick, + totalNetworks, + variant = "default", +}: TokenCardProps) { const logoElement = ( <object data={logo} type="image/png" aria-label={`${id} token logo`}> <img src={fallbackTokenIconUrl} alt={`${id} token logo`} loading="lazy" /> @@ -21,6 +29,41 @@ const TokenCard = memo(function TokenCard({ id, logo, link, onClick, totalNetwor const subtitle = totalNetworks !== undefined ? `${totalNetworks} ${totalNetworks === 1 ? "network" : "networks"}` : undefined + if (variant === "square") { + const content = ( + <> + <div className="token-card__square-logo">{logoElement}</div> + <div className="token-card__square-content"> + <h3>{id}</h3> + {subtitle && <p>{subtitle}</p>} + </div> + </> + ) + + if (link) { + return ( + <a href={link} aria-label={`View ${id} token details`}> + <div className="token-card__square-container">{content}</div> + </a> + ) + } + + if (onClick) { + return ( + <button + type="button" + className="token-card__square-container" + onClick={onClick} + aria-label={`View ${id} token details`} + > + {content} + </button> + ) + } + + return <div className="token-card__square-container">{content}</div> + } + return ( <Card logo={logoElement} diff --git a/src/components/CCIP/Chain/Chain.astro b/src/components/CCIP/Chain/Chain.astro index 6a424001c00..c236891c8b8 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, @@ -49,6 +50,11 @@ const lanes = await getAllNetworkLanes({ const searchLanes = getSearchLanes({ environment }) +const allVerifiers = getAllUniqueVerifiers({ + environment, + version: Version.V1_2_0, +}) + // Generate dynamic metadata for this specific chain const environmentText = environment === Environment.Mainnet ? "Mainnet" : "Testnet" const logoPath = network.logo || "" @@ -107,6 +113,7 @@ const chainStructuredData = generateChainStructuredData( network={network} environment={environment} lanes={searchLanes} + verifiers={allVerifiers} client:load /> <section class="layout"> @@ -187,8 +194,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 fd267bcfd56..1459faf37f4 100644 --- a/src/components/CCIP/Chain/ChainTokenGrid.tsx +++ b/src/components/CCIP/Chain/ChainTokenGrid.tsx @@ -36,6 +36,7 @@ function ChainTokenGrid({ tokens, network, environment }: ChainTokenGridProps) { id={token.id} logo={token.logo} key={token.id} + variant="square" onClick={() => { const selectedNetwork = Object.keys(data) .map((key) => { diff --git a/src/components/CCIP/ChainHero/ChainHero.tsx b/src/components/CCIP/ChainHero/ChainHero.tsx index 1b0550380ee..bc4b18ab7c6 100644 --- a/src/components/CCIP/ChainHero/ChainHero.tsx +++ b/src/components/CCIP/ChainHero/ChainHero.tsx @@ -46,6 +46,13 @@ interface ChainHeroProps { } lane: LaneConfig }[] + verifiers?: { + id: string + name: string + type: string + logo: string + totalNetworks: number + }[] network?: Network token?: { id: string @@ -60,7 +67,16 @@ interface ChainHeroProps { }> } -function ChainHero({ chains, tokens, network, token, environment, lanes, breadcrumbItems }: 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 @@ -119,7 +135,14 @@ function ChainHero({ chains, tokens, network, token, environment, lanes, breadcr } /> <div className="ccip-chain-hero__chainSearch"> - <Search chains={chains} tokens={tokens} small environment={environment} lanes={lanes} /> + <Search + chains={chains} + tokens={tokens} + small + environment={environment} + lanes={lanes} + verifiers={verifiers} + /> </div> </div> diff --git a/src/components/CCIP/Drawer/LaneDrawer.tsx b/src/components/CCIP/Drawer/LaneDrawer.tsx index 126f230033e..693277167cf 100644 --- a/src/components/CCIP/Drawer/LaneDrawer.tsx +++ b/src/components/CCIP/Drawer/LaneDrawer.tsx @@ -1,14 +1,17 @@ import Address from "~/components/AddressReact.tsx" import "../Tables/Table.css" -import { Environment, LaneConfig, LaneFilter, Version } from "~/config/data/ccip/types.ts" -import { getNetwork, getTokenData } from "~/config/data/ccip/data.ts" +import { Environment, LaneConfig, LaneFilter } from "~/config/data/ccip/types.ts" +import { getNetwork } from "~/config/data/ccip/data.ts" import { determineTokenMechanism } from "~/config/data/ccip/utils.ts" import { useState } from "react" import LaneDetailsHero from "../ChainHero/LaneDetailsHero.tsx" -import { getExplorerAddressUrl, getTokenIconUrl, fallbackTokenIconUrl } from "~/features/utils/index.ts" +import { getExplorerAddressUrl, fallbackTokenIconUrl } from "~/features/utils/index.ts" import TableSearchInput from "../Tables/TableSearchInput.tsx" import { Tooltip } from "~/features/common/Tooltip/Tooltip.tsx" import { ChainType, ExplorerInfo } from "@config/types.ts" +import { useTokenRateLimits } from "~/hooks/useTokenRateLimits.ts" +import { RateLimitCell } from "~/components/CCIP/RateLimitCell.tsx" +import { useLaneTokens } from "~/hooks/useLaneTokens.ts" function LaneDrawer({ lane, @@ -26,6 +29,7 @@ function LaneDrawer({ inOutbound: LaneFilter }) { const [search, setSearch] = useState("") + const destinationNetworkDetails = getNetwork({ filter: environment, chain: destinationNetwork.key, @@ -36,6 +40,22 @@ function LaneDrawer({ chain: sourceNetwork.key, }) + // Determine source and destination based on inOutbound filter + const source = inOutbound === LaneFilter.Outbound ? sourceNetwork.key : destinationNetwork.key + const destination = inOutbound === LaneFilter.Outbound ? destinationNetwork.key : sourceNetwork.key + + // Fetch rate limits data using custom hook + const { rateLimits, isLoading: isLoadingRateLimits } = useTokenRateLimits(source, destination, environment) + + // Process tokens with hook + const { tokens: processedTokens, count: tokenCount } = useLaneTokens({ + tokens: lane.supportedTokens, + environment, + rateLimitsData: rateLimits, + inOutbound, + searchQuery: search, + }) + return ( <> <h2 className="ccip-table__drawer-heading">Lane Details</h2> @@ -62,7 +82,7 @@ function LaneDrawer({ <div className="ccip-table__filters"> <div> <div className="ccip-table__filters-title"> - Tokens <span>({lane?.supportedTokens ? lane.supportedTokens.length : 0})</span> + Tokens <span>({tokenCount})</span> </div> </div> <TableSearchInput search={search} setSearch={setSearch} /> @@ -172,99 +192,79 @@ function LaneDrawer({ </tr> </thead> <tbody> - {lane.supportedTokens && - lane.supportedTokens - .filter((token) => token.toLowerCase().includes(search.toLowerCase())) - .map((token, index) => { - const data = getTokenData({ - environment, - version: Version.V1_2_0, - tokenId: token || "", - }) - if (!Object.keys(data).length) return null - const logo = getTokenIconUrl(token) - - // TODO: Fetch rate limits from API for both inbound and outbound - // Token pause detection requires rate limiter data from API - // A token is paused when rate limit capacity is 0 - const tokenPaused = false - - return ( - <tr key={index} className={tokenPaused ? "ccip-table__row--paused" : ""}> - <td> - <a href={`/ccip/directory/${environment}/token/${token}`}> - <div - className={`ccip-table__network-name ${tokenPaused ? "ccip-table__network-name--paused" : ""}`} - > - <img - src={logo} - alt={`${token} logo`} - className="ccip-table__logo" - onError={({ currentTarget }) => { - currentTarget.onerror = null // prevents looping - currentTarget.src = fallbackTokenIconUrl - }} - /> - {token} - {tokenPaused && ( - <span className="ccip-table__paused-badge" title="Transfers are currently paused"> - ⏸️ - </span> - )} - </div> - </a> - </td> - <td data-clipboard-type="token"> - <Address - address={data[sourceNetwork.key].tokenAddress} - endLength={6} - contractUrl={getExplorerAddressUrl(explorer)(data[sourceNetwork.key].tokenAddress)} - /> - </td> - <td>{data[sourceNetwork.key].decimals}</td> - <td> - {inOutbound === LaneFilter.Outbound - ? determineTokenMechanism( - data[sourceNetwork.key].pool.type, - data[destinationNetwork.key].pool.type - ) - : determineTokenMechanism( - data[destinationNetwork.key].pool.type, - data[sourceNetwork.key].pool.type - )} - </td> + {processedTokens.map((token, index) => ( + <tr key={index} className={token.isPaused ? "ccip-table__row--paused" : ""}> + <td> + <a href={`/ccip/directory/${environment}/token/${token.id}`}> + <div + className={`ccip-table__network-name ${token.isPaused ? "ccip-table__network-name--paused" : ""}`} + > + <img + src={token.logo} + alt={`${token.id} logo`} + className="ccip-table__logo" + onError={({ currentTarget }) => { + currentTarget.onerror = null // prevents looping + currentTarget.src = fallbackTokenIconUrl + }} + /> + {token.id} + {token.isPaused && ( + <span className="ccip-table__paused-badge" title="Transfers are currently paused"> + ⏸️ + </span> + )} + </div> + </a> + </td> + <td data-clipboard-type="token"> + <Address + address={token.data[sourceNetwork.key].tokenAddress} + endLength={4} + contractUrl={getExplorerAddressUrl(explorer)(token.data[sourceNetwork.key].tokenAddress)} + /> + </td> + <td>{token.data[sourceNetwork.key].decimals}</td> + <td> + {inOutbound === LaneFilter.Outbound + ? determineTokenMechanism( + token.data[sourceNetwork.key].pool.type, + token.data[destinationNetwork.key].pool.type + ) + : determineTokenMechanism( + token.data[destinationNetwork.key].pool.type, + token.data[sourceNetwork.key].pool.type + )} + </td> - <td> - {/* TODO: Fetch rate limits from API for both inbound and outbound - GET /api/ccip/v1/lanes/by-internal-id/{source}/{destination}/supported-tokens?environment={environment} - Response will contain both standard and custom rate limits per token */} - Disabled - </td> - <td className="rate-tooltip-cell"> - {/* TODO: Fetch rate limits from API for both inbound and outbound - Display refill rate from standard.in/out or custom.in/out based on inOutbound filter */} - Disabled - </td> - <td> - {/* Placeholder for FTF Rate limit capacity - data not yet available */} - TBC - </td> - <td> - {/* Placeholder for FTF Rate limit refill rate - data not yet available */} - TBC - </td> - </tr> - ) - })} + <td> + <RateLimitCell + isLoading={isLoadingRateLimits} + rateLimit={token.rateLimits.standard} + type="capacity" + showUnavailableTooltip + /> + </td> + <td className="rate-tooltip-cell"> + <RateLimitCell isLoading={isLoadingRateLimits} rateLimit={token.rateLimits.standard} type="rate" /> + </td> + <td> + <RateLimitCell + isLoading={isLoadingRateLimits} + rateLimit={token.rateLimits.ftf} + type="capacity" + showUnavailableTooltip + /> + </td> + <td> + <RateLimitCell isLoading={isLoadingRateLimits} rateLimit={token.rateLimits.ftf} type="rate" /> + </td> + </tr> + ))} </tbody> </table> </div> - <div className="ccip-table__notFound"> - {lane.supportedTokens && - lane.supportedTokens.filter((token) => token.toLowerCase().includes(search.toLowerCase())).length === 0 && ( - <>No tokens found</> - )} - </div> + <div className="ccip-table__notFound">{processedTokens.length === 0 && <>No tokens found</>}</div> </div> </> ) diff --git a/src/components/CCIP/Drawer/TokenDrawer.tsx b/src/components/CCIP/Drawer/TokenDrawer.tsx index e65ff4f65f9..19d31f1cbbe 100644 --- a/src/components/CCIP/Drawer/TokenDrawer.tsx +++ b/src/components/CCIP/Drawer/TokenDrawer.tsx @@ -12,13 +12,26 @@ import { PoolType, getTokenData, LaneConfig, + getVerifiersByNetwork, + getVerifierTypeDisplay, } from "~/config/data/ccip/index.ts" -import { useState } from "react" +import { useState, useMemo } from "react" import { ChainType, ExplorerInfo, SupportedChain } from "~/config/index.ts" +import { getExplorerAddressUrl } from "~/features/utils/index.ts" +import Address from "~/components/AddressReact.tsx" import LaneDrawer from "../Drawer/LaneDrawer.tsx" import TableSearchInput from "../Tables/TableSearchInput.tsx" import Tabs from "../Tables/Tabs.tsx" import { Tooltip } from "~/features/common/Tooltip/Tooltip.tsx" +import { useMultiLaneRateLimits } from "~/hooks/useMultiLaneRateLimits.ts" +import { RateLimitCell } from "~/components/CCIP/RateLimitCell.tsx" +import { realtimeDataService } from "~/lib/ccip/services/realtime-data-instance.ts" + +enum TokenTab { + Outbound = "outbound", + Inbound = "inbound", + Verifiers = "verifiers", +} function TokenDrawer({ token, @@ -53,7 +66,26 @@ function TokenDrawer({ environment: Environment }) { const [search, setSearch] = useState("") - const [inOutbound, setInOutbound] = useState<LaneFilter>(LaneFilter.Outbound) + const [activeTab, setActiveTab] = useState<TokenTab>(TokenTab.Outbound) + + // Get verifiers for the current network + const verifiers = getVerifiersByNetwork({ + networkId: network.key, + environment, + version: Version.V1_2_0, + }) + + // Filter verifiers based on search + const filteredVerifiers = useMemo(() => { + if (!search) return verifiers + const searchLower = search.toLowerCase() + return verifiers.filter( + (verifier) => + verifier.name.toLowerCase().includes(searchLower) || + verifier.address.toLowerCase().includes(searchLower) || + verifier.type.toLowerCase().includes(searchLower) + ) + }, [verifiers, search]) type LaneRow = { networkDetails: { @@ -65,6 +97,17 @@ function TokenDrawer({ destinationPoolType: PoolType } + // Build lane configurations for fetching rate limits + const laneConfigs = useMemo(() => { + return Object.keys(destinationLanes).map((destinationChain) => ({ + source: activeTab === TokenTab.Outbound ? network.key : destinationChain, + destination: activeTab === TokenTab.Outbound ? destinationChain : network.key, + })) + }, [destinationLanes, network.key, activeTab]) + + // Fetch rate limits for all lanes using custom hook + const { rateLimitsMap, isLoading: isLoadingRateLimits } = useMultiLaneRateLimits(laneConfigs, environment) + const laneRows: LaneRow[] = Object.keys(destinationLanes) .map((destinationChain) => { const networkDetails = getNetwork({ @@ -138,141 +181,212 @@ function TokenDrawer({ tabs={[ { name: "Outbound lanes", - key: LaneFilter.Outbound, + key: TokenTab.Outbound, }, { name: "Inbound lanes", - key: LaneFilter.Inbound, + key: TokenTab.Inbound, + }, + { + name: "Verifiers", + key: TokenTab.Verifiers, }, ]} - onChange={(key) => setInOutbound(key as LaneFilter)} + onChange={(key) => setActiveTab(key as TokenTab)} /> </div> <TableSearchInput search={search} setSearch={setSearch} /> </div> - <div className="ccip-table__wrapper"> - {" "} - <table className="ccip-table"> - <thead> - <tr> - <th>{inOutbound === LaneFilter.Inbound ? "Source" : "Destination"} network</th> - <th> - Rate limit capacity - <Tooltip - label="" - tip="Maximum amount per transaction" - labelStyle={{ - marginRight: "5px", - }} - style={{ - display: "inline-block", - verticalAlign: "middle", - marginBottom: "2px", - }} - /> - </th> - <th> - Rate limit refill rate - <Tooltip - label="" - tip="Rate at which available capacity is replenished" - labelStyle={{ - marginRight: "5px", - }} - style={{ - display: "inline-block", - verticalAlign: "middle", - marginBottom: "2px", - }} - /> - </th> - <th> - Mechanism - <Tooltip - label="" - tip="Token handling mechanism: Lock & Mint, Burn & Mint, Lock & Unlock, Burn & Unlock." - labelStyle={{ - marginRight: "5px", - }} - style={{ - display: "inline-block", - verticalAlign: "middle", - marginBottom: "2px", - }} - /> - </th> - {/* <th>Status</th> */} - </tr> - </thead> - <tbody> - {laneRows - ?.filter( - ({ networkDetails }) => - networkDetails && networkDetails.name.toLowerCase().includes(search.toLowerCase()) - ) - .map(({ networkDetails, laneData, destinationChain, destinationPoolType }) => { - if (!laneData || !networkDetails) return null - - // TODO: Fetch rate limits from API for both inbound and outbound - // Token pause detection requires rate limiter data from API - // A token is paused when rate limit capacity is 0 - const tokenPaused = false - - return ( - <tr key={networkDetails.name} className={tokenPaused ? "ccip-table__row--paused" : ""}> + {activeTab === TokenTab.Verifiers ? ( + <div className="ccip-table__wrapper"> + <table className="ccip-table"> + <thead> + <tr> + <th>Verifier</th> + <th>Verifier address</th> + <th>Verifier type</th> + <th>Threshold amount</th> + </tr> + </thead> + <tbody> + {verifiers.length === 0 ? ( + <tr> + <td colSpan={4} style={{ textAlign: "center", padding: "20px" }}> + No verifiers configured + </td> + </tr> + ) : ( + filteredVerifiers.map((verifier) => ( + <tr key={verifier.address}> <td> - <button - type="button" - className={`ccip-table__network-name ${tokenPaused ? "ccip-table__network-name--paused" : ""}`} - onClick={() => { - drawerWidthStore.set(DrawerWidth.Wide) - drawerContentStore.set(() => ( - <LaneDrawer - environment={environment} - lane={laneData} - sourceNetwork={network} - destinationNetwork={{ - name: networkDetails?.name || "", - logo: networkDetails?.logo || "", - key: destinationChain, - }} - inOutbound={inOutbound} - explorer={network.explorer} - /> - )) - }} - aria-label={`View lane details for ${networkDetails?.name}`} - > + <div style={{ display: "flex", alignItems: "center", gap: "8px" }}> <img - src={networkDetails?.logo} - alt={`${networkDetails?.name} blockchain logo`} + src={verifier.logo} + alt={`${verifier.name} logo`} className="ccip-table__logo" + style={{ width: "24px", height: "24px" }} /> - {networkDetails?.name} - {tokenPaused && ( - <span className="ccip-table__paused-badge" title="Transfers are currently paused"> - ⏸️ - </span> - )} - </button> - </td> - <td> - {/* TODO: Fetch rate limits from API for both inbound and outbound - GET /api/ccip/v1/lanes/by-internal-id/{source}/{destination}/supported-tokens?environment={environment} - Response will contain both standard and custom rate limits per token */} - Disabled + {verifier.name} + </div> </td> <td> - {/* TODO: Fetch rate limits from API for both inbound and outbound - Display refill rate from standard.in/out or custom.in/out based on inOutbound filter */} - Disabled + <Address + contractUrl={getExplorerAddressUrl(network.explorer, network.chainType)(verifier.address)} + address={verifier.address} + endLength={4} + /> </td> - <td> - {inOutbound === LaneFilter.Outbound - ? determineTokenMechanism(network.tokenPoolType, destinationPoolType) - : determineTokenMechanism(destinationPoolType, network.tokenPoolType)} - </td> - {/* <td> + <td>{getVerifierTypeDisplay(verifier.type)}</td> + <td>N/A</td> + </tr> + )) + )} + </tbody> + </table> + </div> + ) : ( + <div className="ccip-table__wrapper"> + {" "} + <table className="ccip-table"> + <thead> + <tr> + <th>{activeTab === TokenTab.Inbound ? "Source" : "Destination"} network</th> + <th> + Rate limit capacity + <Tooltip + label="" + tip="Maximum amount per transaction" + labelStyle={{ + marginRight: "5px", + }} + style={{ + display: "inline-block", + verticalAlign: "middle", + marginBottom: "2px", + }} + /> + </th> + <th> + Rate limit refill rate + <Tooltip + label="" + tip="Rate at which available capacity is replenished" + labelStyle={{ + marginRight: "5px", + }} + style={{ + display: "inline-block", + verticalAlign: "middle", + marginBottom: "2px", + }} + /> + </th> + <th>FTF Rate limit capacity</th> + <th>FTF Rate limit refill rate</th> + <th> + Mechanism + <Tooltip + label="" + tip="Token handling mechanism: Lock & Mint, Burn & Mint, Lock & Unlock, Burn & Unlock." + labelStyle={{ + marginRight: "5px", + }} + style={{ + display: "inline-block", + verticalAlign: "middle", + marginBottom: "2px", + }} + /> + </th> + {/* <th>Status</th> */} + </tr> + </thead> + <tbody> + {laneRows + ?.filter( + ({ networkDetails }) => + networkDetails && networkDetails.name.toLowerCase().includes(search.toLowerCase()) + ) + .map(({ networkDetails, laneData, destinationChain, destinationPoolType }) => { + if (!laneData || !networkDetails) return null + + // Get rate limit data for this lane + const source = activeTab === TokenTab.Outbound ? network.key : destinationChain + const destination = activeTab === TokenTab.Outbound ? destinationChain : network.key + const laneKey = `${source}-${destination}` + const laneRateLimits = rateLimitsMap[laneKey] + const tokenRateLimits = laneRateLimits?.[token.id] + + const direction = activeTab === TokenTab.Outbound ? "out" : "in" + + // Get standard and FTF rate limits + const allLimits = realtimeDataService.getAllRateLimitsForDirection(tokenRateLimits, direction) + + // Token is paused if standard rate limit capacity is 0 + const tokenPaused = allLimits.standard?.capacity === "0" + + return ( + <tr key={networkDetails.name} className={tokenPaused ? "ccip-table__row--paused" : ""}> + <td> + <button + type="button" + className={`ccip-table__network-name ${tokenPaused ? "ccip-table__network-name--paused" : ""}`} + onClick={() => { + drawerWidthStore.set(DrawerWidth.Wide) + drawerContentStore.set(() => ( + <LaneDrawer + environment={environment} + lane={laneData} + sourceNetwork={network} + destinationNetwork={{ + name: networkDetails?.name || "", + logo: networkDetails?.logo || "", + key: destinationChain, + }} + inOutbound={ + activeTab === TokenTab.Outbound ? LaneFilter.Outbound : LaneFilter.Inbound + } + explorer={network.explorer} + /> + )) + }} + aria-label={`View lane details for ${networkDetails?.name}`} + > + <img + src={networkDetails?.logo} + alt={`${networkDetails?.name} blockchain logo`} + className="ccip-table__logo" + /> + {networkDetails?.name} + {tokenPaused && ( + <span className="ccip-table__paused-badge" title="Transfers are currently paused"> + ⏸️ + </span> + )} + </button> + </td> + <td> + <RateLimitCell + isLoading={isLoadingRateLimits} + rateLimit={allLimits.standard} + type="capacity" + /> + </td> + <td> + <RateLimitCell isLoading={isLoadingRateLimits} rateLimit={allLimits.standard} type="rate" /> + </td> + <td> + <RateLimitCell isLoading={isLoadingRateLimits} rateLimit={allLimits.ftf} type="capacity" /> + </td> + <td> + <RateLimitCell isLoading={isLoadingRateLimits} rateLimit={allLimits.ftf} type="rate" /> + </td> + <td> + {activeTab === TokenTab.Outbound + ? determineTokenMechanism(network.tokenPoolType, destinationPoolType) + : determineTokenMechanism(destinationPoolType, network.tokenPoolType)} + </td> + {/* <td> <span className="ccip-table__status"> <svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <path @@ -283,18 +397,21 @@ function TokenDrawer({ Operational </span> </td> */} - </tr> - ) - })} - </tbody> - </table> - </div> + </tr> + ) + })} + </tbody> + </table> + </div> + )} - <div className="ccip-table__notFound"> - {laneRows?.filter( - ({ networkDetails }) => networkDetails && networkDetails.name.toLowerCase().includes(search.toLowerCase()) - ).length === 0 && <>No lanes found</>} - </div> + {activeTab !== TokenTab.Verifiers && ( + <div className="ccip-table__notFound"> + {laneRows?.filter( + ({ networkDetails }) => networkDetails && networkDetails.name.toLowerCase().includes(search.toLowerCase()) + ).length === 0 && <>No lanes found</>} + </div> + )} </div> </div> ) diff --git a/src/components/CCIP/Hero/Hero.tsx b/src/components/CCIP/Hero/Hero.tsx index 5f479f22828..2886a4c2a95 100644 --- a/src/components/CCIP/Hero/Hero.tsx +++ b/src/components/CCIP/Hero/Hero.tsx @@ -33,17 +33,24 @@ interface HeroProps { } lane: LaneConfig }[] + verifiers?: { + id: string + name: string + type: string + logo: string + totalNetworks: number + }[] environment: Environment } -function Hero({ chains, tokens, environment, lanes }: HeroProps) { +function Hero({ chains, tokens, environment, lanes, verifiers = [] }: HeroProps) { return ( <section className="ccip-hero"> <div className="ccip-hero__content"> <Typography variant="h1" className="ccip-hero__heading"> CCIP Directory </Typography> - <Search chains={chains} tokens={tokens} environment={environment} lanes={lanes} /> + <Search chains={chains} tokens={tokens} environment={environment} lanes={lanes} verifiers={verifiers} /> </div> </section> ) diff --git a/src/components/CCIP/Landing/ccip-landing.astro b/src/components/CCIP/Landing/ccip-landing.astro index 4e101df4cbe..f65de34c258 100644 --- a/src/components/CCIP/Landing/ccip-landing.astro +++ b/src/components/CCIP/Landing/ccip-landing.astro @@ -72,7 +72,14 @@ const directoryStructuredData = generateDirectoryStructuredData(environment, net }} suppressDefaultStructuredData={true} > - <Hero chains={networks} tokens={allTokens} environment={environment} client:visible lanes={searchLanes} /> + <Hero + chains={networks} + tokens={allTokens} + environment={environment} + client:visible + lanes={searchLanes} + verifiers={allVerifiers} + /> <section class="layout"> <div> <div class="ccip-heading"> diff --git a/src/components/CCIP/RateLimitCell.tsx b/src/components/CCIP/RateLimitCell.tsx new file mode 100644 index 00000000000..61a4a8c7aa1 --- /dev/null +++ b/src/components/CCIP/RateLimitCell.tsx @@ -0,0 +1,46 @@ +import { Tooltip } from "~/features/common/Tooltip/Tooltip.tsx" +import type { RateLimiterConfig } from "~/lib/ccip/types/index.ts" +import { formatRateLimit } from "~/lib/ccip/utils/rate-limit-formatter.ts" + +interface RateLimitCellProps { + isLoading: boolean + rateLimit: RateLimiterConfig | null | undefined + type: "capacity" | "rate" + showUnavailableTooltip?: boolean +} + +/** + * Component for displaying rate limit values in table cells + * Handles loading, disabled, unavailable, and value states + */ +export function RateLimitCell({ isLoading, rateLimit, type, showUnavailableTooltip = false }: RateLimitCellProps) { + if (isLoading) { + return <>Loading...</> + } + + if (!rateLimit) { + if (showUnavailableTooltip) { + return ( + <span style={{ display: "inline-flex", alignItems: "center", gap: "4px" }}> + Unavailable + <Tooltip + label="" + tip="Rate limit data is currently unavailable. You can find the Token Pool rate limit by reading the Token Pool contract directly on the relevant blockchain." + style={{ + display: "inline-block", + verticalAlign: "middle", + }} + /> + </span> + ) + } + return <>N/A</> + } + + if (!rateLimit.isEnabled) { + return <>Disabled</> + } + + const value = type === "capacity" ? rateLimit.capacity : rateLimit.rate + return <>{formatRateLimit(value)}</> +} diff --git a/src/components/CCIP/Search/Search.tsx b/src/components/CCIP/Search/Search.tsx index b53ab4cdbfc..7d908596af7 100644 --- a/src/components/CCIP/Search/Search.tsx +++ b/src/components/CCIP/Search/Search.tsx @@ -38,11 +38,18 @@ interface SearchProps { } lane: LaneConfig }[] + verifiers?: { + id: string + name: string + type: string + logo: string + totalNetworks: number + }[] small?: boolean environment: Environment } -function Search({ chains, tokens, small, environment, lanes }: SearchProps) { +function Search({ chains, tokens, small, environment, lanes, verifiers = [] }: SearchProps) { const [search, setSearch] = useState("") const [debouncedSearch, setDebouncedSearch] = useState("") const [openSearchMenu, setOpenSearchMenu] = useState(false) @@ -50,6 +57,7 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) { const [networksResults, setNetworksResults] = useState<typeof chains>([]) const [tokensResults, setTokensResults] = useState<typeof tokens>([]) const [lanesResults, setLanesResults] = useState<typeof lanes>([]) + const [verifiersResults, setVerifiersResults] = useState<typeof verifiers>([]) const searchRef = useRef<HTMLDivElement>(null) const workerRef = useRef<Worker | null>(null) const workerReadyRef = useRef(false) @@ -59,10 +67,11 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) { if (workerReadyRef.current || typeof window === "undefined") return workerRef.current = new Worker(new URL("~/workers/data-worker.ts", import.meta.url), { type: "module" }) workerRef.current.onmessage = (event: MessageEvent<WorkerResponse>) => { - const { networks, tokens: workerTokens, lanes: workerLanes } = event.data + const { networks, tokens: workerTokens, lanes: workerLanes, verifiers: workerVerifiers } = event.data setNetworksResults(networks || []) setTokensResults(workerTokens || []) setLanesResults(workerLanes || []) + setVerifiersResults(workerVerifiers || []) } workerReadyRef.current = true } @@ -90,6 +99,7 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) { setNetworksResults([]) setTokensResults([]) setLanesResults([]) + setVerifiersResults([]) return } @@ -102,11 +112,12 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) { chains, tokens, lanes, + verifiers, }, } workerRef.current.postMessage(message) } - }, [debouncedSearch, chains, tokens, lanes]) + }, [debouncedSearch, chains, tokens, lanes, verifiers]) // Handle menu visibility useEffect(() => { @@ -146,7 +157,7 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) { <img src="/assets/icons/search.svg" alt="Search icon" /> <input type="search" - placeholder="Network/Token/Lane" + placeholder="Network/Token/Lane/Verifier" value={search} onChange={(e) => setSearch(e.target.value)} onFocus={() => { @@ -154,7 +165,7 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) { ensureWorker() }} onBlur={() => setIsActive(false)} - aria-label="Search networks, tokens, and lanes" + aria-label="Search networks, tokens, lanes, and verifiers" aria-describedby={openSearchMenu ? "search-results" : undefined} /> {openSearchMenu && ( @@ -167,9 +178,12 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) { aria-live="polite" aria-label="Search results" > - {networksResults.length === 0 && tokensResults.length === 0 && ( - <span className="ccip-hero__search-results__no-result">No results found</span> - )} + {networksResults.length === 0 && + tokensResults.length === 0 && + lanesResults.length === 0 && + verifiersResults.length === 0 && ( + <span className="ccip-hero__search-results__no-result">No results found</span> + )} {networksResults.length > 0 && ( <> <span className="ccip-hero__search-results__title">Networks</span> @@ -284,6 +298,36 @@ function Search({ chains, tokens, small, environment, lanes }: SearchProps) { </ul> </> )} + + {verifiersResults.length > 0 && ( + <> + <span className="ccip-hero__search-results__title">Verifiers</span> + <ul aria-label="Verifiers"> + {verifiersResults.map((verifier) => ( + <li key={verifier.id}> + <a href={`/ccip/directory/${environment}/verifiers#${verifier.id}`}> + <img + src={verifier.logo} + alt={`${verifier.name} verifier logo`} + loading="lazy" + onError={({ currentTarget }) => { + currentTarget.onerror = null // prevents looping + currentTarget.src = fallbackTokenIconUrl + }} + /> + {verifier.name} + {!small && ( + <span> + {verifier.totalNetworks} {verifier.totalNetworks > 1 ? "networks" : "network"} |{" "} + {verifier.type} + </span> + )} + </a> + </li> + ))} + </ul> + </> + )} </div> )} </div> diff --git a/src/components/CCIP/Tables/TokenChainsTable.tsx b/src/components/CCIP/Tables/TokenChainsTable.tsx index 5cc4c24778b..7614b0b32d4 100644 --- a/src/components/CCIP/Tables/TokenChainsTable.tsx +++ b/src/components/CCIP/Tables/TokenChainsTable.tsx @@ -8,6 +8,8 @@ import TableSearchInput from "./TableSearchInput.tsx" import { useState } from "react" import { getExplorerAddressUrl, fallbackTokenIconUrl } from "~/features/utils/index.ts" import TokenDrawer from "../Drawer/TokenDrawer.tsx" +import { Tooltip } from "~/features/common/Tooltip/Tooltip.tsx" +import { useTokenFinality } from "~/hooks/useTokenFinality.ts" interface TableProps { networks: { @@ -42,6 +44,10 @@ interface TableProps { function TokenChainsTable({ networks, token, lanes, environment }: TableProps) { const [search, setSearch] = useState("") + + // Fetch finality data using custom hook + const { finalityData, isLoading: loading } = useTokenFinality(token.id, environment, "internal_id") + return ( <> <div className="ccip-table__filters"> @@ -145,15 +151,38 @@ function TokenChainsTable({ networks, token, lanes, environment }: TableProps) { </td> <td>{network.tokenPoolVersion}</td> <td> - {/* TODO: Fetch from API - GET /api/ccip/v1/tokens/{tokenCanonicalSymbol}/finality?environment={environment} - Custom finality is derived from minBlockConfirmation > 0 - Display: "Yes" | "No" | "N/A" (with tooltip for unavailable) */} - - + {loading ? ( + "-" + ) : finalityData[network.key] ? ( + finalityData[network.key].hasCustomFinality === null ? ( + <Tooltip + label="N/A" + tip="Custom finality data is currently unavailable. You can find the custom finality settings by reading the Token Pool contract directly on the relevant blockchain." + labelStyle={{ marginRight: "5px" }} + style={{ display: "inline-block", verticalAlign: "middle" }} + /> + ) : finalityData[network.key].hasCustomFinality ? ( + "Yes" + ) : ( + "No" + ) + ) : ( + <Tooltip + label="N/A" + tip="Custom finality data is currently unavailable. You can find the custom finality settings by reading the Token Pool contract directly on the relevant blockchain." + labelStyle={{ marginRight: "5px" }} + style={{ display: "inline-block", verticalAlign: "middle" }} + /> + )} </td> <td> - {/* TODO: Fetch from API - GET /api/ccip/v1/tokens/{tokenCanonicalSymbol}/finality?environment={environment} - Display minBlockConfirmation value or "-" if custom finality is disabled/unavailable */} - - + {loading + ? "-" + : finalityData[network.key] + ? finalityData[network.key].minBlockConfirmation === null + ? "-" + : finalityData[network.key].minBlockConfirmation + : "-"} </td> </tr> ) diff --git a/src/components/CCIP/Token/Token.astro b/src/components/CCIP/Token/Token.astro index 7d82846121e..874fbdc18f2 100644 --- a/src/components/CCIP/Token/Token.astro +++ b/src/components/CCIP/Token/Token.astro @@ -5,6 +5,7 @@ import { getAllNetworks, getAllSupportedTokens, getAllTokenLanes, + getAllUniqueVerifiers, getChainsOfToken, getSearchLanes, getTokenData, @@ -76,6 +77,11 @@ const tokenLanes = getAllTokenLanes({ const searchLanes = getSearchLanes({ environment }) +const allVerifiers = getAllUniqueVerifiers({ + environment, + version: Version.V1_2_0, +}) + // Generate dynamic metadata for this specific token const environmentText = environment === Environment.Mainnet ? "Mainnet" : "Testnet" const tokenMetadata = { @@ -117,6 +123,7 @@ const tokenStructuredData = generateTokenStructuredData(token, environment, chai tokens={allTokens} client:load lanes={searchLanes} + verifiers={allVerifiers} token={{ id: token, name: data[firstSupportedChain]?.name || "", diff --git a/src/components/CCIP/Verifiers/Verifiers.astro b/src/components/CCIP/Verifiers/Verifiers.astro index 2672f983332..dd3dc730de4 100644 --- a/src/components/CCIP/Verifiers/Verifiers.astro +++ b/src/components/CCIP/Verifiers/Verifiers.astro @@ -1,11 +1,20 @@ --- import CcipDirectoryLayout from "~/layouts/CcipDirectoryLayout.astro" import { getEntry, render } from "astro:content" -import { getAllNetworks, getAllVerifiers, getSearchLanes, Version, Environment } from "~/config/data/ccip" +import { + getAllNetworks, + getAllVerifiers, + getSearchLanes, + Version, + Environment, + getAllSupportedTokens, + getChainsOfToken, +} from "~/config/data/ccip" import Table from "~/components/CCIP/Tables/VerifiersTable" import { getAllUniqueVerifiers } from "~/config/data/ccip/data.ts" import { DOCS_BASE_URL } from "~/utils/structuredData" import ChainHero from "~/components/CCIP/ChainHero/ChainHero" +import { getTokenIconUrl } from "~/features/utils" import "./Verifiers.css" interface Props { @@ -35,6 +44,20 @@ const uniqueVerifiers = getAllUniqueVerifiers({ const searchLanes = getSearchLanes({ environment }) +const supportedTokens = getAllSupportedTokens({ + environment, + version: Version.V1_2_0, +}) +const tokens = Object.keys(supportedTokens).sort((a, b) => a.localeCompare(b, undefined, { sensitivity: "base" })) +const allTokens = tokens.map((token) => { + const logo = getTokenIconUrl(token) || "" + return { + id: token, + logo, + totalNetworks: getChainsOfToken({ token, filter: environment }).length, + } +}) + // Generate dynamic metadata for verifiers page const environmentText = environment === Environment.Mainnet ? "Mainnet" : "Testnet" const verifiersMetadata = { @@ -70,12 +93,9 @@ const canonicalForJsonLd = `${DOCS_BASE_URL}${currentPath}` > <ChainHero chains={networks} - tokens={uniqueVerifiers.map((verifier) => ({ - id: verifier.id, - totalNetworks: verifier.totalNetworks, - logo: verifier.logo, - }))} + tokens={allTokens} lanes={searchLanes} + verifiers={uniqueVerifiers} environment={environment} breadcrumbItems={[ { diff --git a/src/hooks/useLaneTokens.ts b/src/hooks/useLaneTokens.ts new file mode 100644 index 00000000000..12fcdc3e808 --- /dev/null +++ b/src/hooks/useLaneTokens.ts @@ -0,0 +1,64 @@ +import { useMemo } from "react" +import { Environment, LaneFilter, Version } from "~/config/data/ccip/types.ts" +import { getTokenData } from "~/config/data/ccip/data.ts" +import { getTokenIconUrl } from "~/features/utils/index.ts" +import { realtimeDataService } from "~/lib/ccip/services/realtime-data-instance.ts" + +export interface ProcessedToken { + id: string + data: ReturnType<typeof getTokenData> + logo: string + rateLimits: { + standard: { capacity: string; rate: string; isEnabled: boolean } | null + ftf: { capacity: string; rate: string; isEnabled: boolean } | null + } + isPaused: boolean +} + +interface UseLaneTokensParams { + tokens: string[] | undefined + environment: Environment + rateLimitsData: Record<string, any> + inOutbound: LaneFilter + searchQuery: string +} + +export function useLaneTokens({ tokens, environment, rateLimitsData, inOutbound, searchQuery }: UseLaneTokensParams) { + const processedTokens = useMemo(() => { + if (!tokens) return [] + + const direction = inOutbound === LaneFilter.Outbound ? "out" : "in" + + return tokens + .filter((token) => token.toLowerCase().includes(searchQuery.toLowerCase())) + .map((token) => { + const data = getTokenData({ + environment, + version: Version.V1_2_0, + tokenId: token || "", + }) + + // Skip tokens with no data + if (!Object.keys(data).length) return null + + const logo = getTokenIconUrl(token) + const tokenRateLimits = rateLimitsData[token] + const allLimits = realtimeDataService.getAllRateLimitsForDirection(tokenRateLimits, direction) + const isPaused = allLimits.standard?.capacity === "0" + + return { + id: token, + data, + logo, + rateLimits: allLimits, + isPaused, + } + }) + .filter((token): token is ProcessedToken => token !== null) + }, [tokens, environment, rateLimitsData, inOutbound, searchQuery]) + + return { + tokens: processedTokens, + count: tokens?.length ?? 0, + } +} diff --git a/src/hooks/useMultiLaneRateLimits.ts b/src/hooks/useMultiLaneRateLimits.ts new file mode 100644 index 00000000000..2f0274e810f --- /dev/null +++ b/src/hooks/useMultiLaneRateLimits.ts @@ -0,0 +1,78 @@ +import { useState, useEffect } from "react" +import type { TokenRateLimits, Environment } from "~/lib/ccip/types/index.ts" +import { realtimeDataService } from "~/lib/ccip/services/realtime-data-instance.ts" + +interface LaneConfig { + source: string + destination: string +} + +interface UseMultiLaneRateLimitsResult { + rateLimitsMap: Record<string, Record<string, TokenRateLimits>> + 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<Record<string, Record<string, TokenRateLimits>>>({}) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState<Error | null>(null) + + useEffect(() => { + let isMounted = true + + const fetchAllRateLimits = async () => { + setIsLoading(true) + setError(null) + + try { + const newRateLimits: Record<string, Record<string, TokenRateLimits>> = {} + + // 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/useTokenFinality.ts b/src/hooks/useTokenFinality.ts new file mode 100644 index 00000000000..5036a3848f0 --- /dev/null +++ b/src/hooks/useTokenFinality.ts @@ -0,0 +1,66 @@ +import { useState, useEffect } from "react" +import type { TokenFinalityData, Environment, OutputKeyType } from "~/lib/ccip/types/index.ts" +import { realtimeDataService } from "~/lib/ccip/services/realtime-data-instance.ts" + +interface UseTokenFinalityResult { + finalityData: Record<string, TokenFinalityData> + 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<Record<string, TokenFinalityData>>({}) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState<Error | null>(null) + + useEffect(() => { + let isMounted = true + + const fetchFinalityData = async () => { + setIsLoading(true) + setError(null) + + try { + const result = await realtimeDataService.getTokenFinality(tokenCanonicalSymbol, environment, outputKey) + + if (isMounted) { + if (result?.data) { + setFinalityData(result.data) + } else { + console.warn("[useTokenFinality] No data received") + setFinalityData({}) + } + } + } catch (err) { + if (isMounted) { + console.error("Failed to fetch token finality data:", err) + setError(err instanceof Error ? err : new Error("Failed to fetch token finality")) + setFinalityData({}) + } + } finally { + if (isMounted) { + setIsLoading(false) + } + } + } + + fetchFinalityData() + + return () => { + isMounted = false + } + }, [tokenCanonicalSymbol, environment, outputKey]) + + return { finalityData, isLoading, error } +} diff --git a/src/hooks/useTokenRateLimits.ts b/src/hooks/useTokenRateLimits.ts new file mode 100644 index 00000000000..cbfd8ce04df --- /dev/null +++ b/src/hooks/useTokenRateLimits.ts @@ -0,0 +1,65 @@ +import { useState, useEffect } from "react" +import type { TokenRateLimits, Environment } from "~/lib/ccip/types/index.ts" +import { realtimeDataService } from "~/lib/ccip/services/realtime-data-instance.ts" + +interface UseTokenRateLimitsResult { + rateLimits: Record<string, TokenRateLimits> + 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<Record<string, TokenRateLimits>>({}) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState<Error | null>(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/lib/ccip/services/realtime-data-instance.ts b/src/lib/ccip/services/realtime-data-instance.ts new file mode 100644 index 00000000000..b1ac8df61bd --- /dev/null +++ b/src/lib/ccip/services/realtime-data-instance.ts @@ -0,0 +1,7 @@ +import { RealtimeDataService } from "./realtime-data.ts" + +/** + * Singleton instance of RealtimeDataService + * Use this shared instance across all components to avoid creating multiple instances + */ +export const realtimeDataService = new RealtimeDataService() diff --git a/src/lib/ccip/services/realtime-data.ts b/src/lib/ccip/services/realtime-data.ts new file mode 100644 index 00000000000..a0b7a84b470 --- /dev/null +++ b/src/lib/ccip/services/realtime-data.ts @@ -0,0 +1,259 @@ +import { Environment } from "~/lib/ccip/types/index.ts" +import type { + TokenRateLimits, + RateLimiterEntry, + RateLimiterConfig, + TokenFinalityData, + OutputKeyType, +} from "~/lib/ccip/types/index.ts" + +export const prerender = false + +/** + * Base URL for CCIP realtime API + * For client-side calls, use relative URLs to hit the local API endpoints + */ +const getApiBaseUrl = () => { + // In browser context, use relative URLs + if (typeof window !== "undefined") { + return "" + } + // In server context, use environment variable or default + return process.env.CCIP_REALTIME_API_BASE_URL || "https://api.ccip.chainlink.com" +} + +/** + * Response structure for lane supported tokens endpoint + */ +export interface LaneSupportedTokensResponse { + metadata: { + environment: Environment + timestamp: string + requestId: string + sourceChain: string + destinationChain: string + tokenCount: number + } + data: Record<string, TokenRateLimits> +} + +/** + * Response structure for token finality endpoint + */ +export interface TokenFinalityResponse { + metadata: { + environment: Environment + timestamp: string + requestId: string + tokenSymbol: string + chainCount: number + } + data: Record<string, TokenFinalityData> +} + +/** + * 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<LaneSupportedTokensResponse | null> { + try { + const baseUrl = getApiBaseUrl() + const url = `${baseUrl}/api/ccip/v1/lanes/by-internal-id/${sourceInternalId}/${destinationInternalId}/supported-tokens?environment=${environment}` + + const response = await fetch(url) + + if (!response.ok) { + return null + } + + const data = await response.json() + return data + } catch (error) { + console.error("Error fetching lane supported tokens:", error) + return null + } + } + + /** + * Fetches token finality details across all chains + * + * @param tokenCanonicalSymbol - Token canonical symbol (e.g., "BETS", "LINK") + * @param environment - Network environment (mainnet/testnet) + * @param outputKey - Format to use for displaying chain keys (optional) + * @returns Token finality data for all chains + */ + async getTokenFinality( + tokenCanonicalSymbol: string, + environment: Environment, + outputKey?: OutputKeyType + ): Promise<TokenFinalityResponse | null> { + try { + const baseUrl = getApiBaseUrl() + let url = `${baseUrl}/api/ccip/v1/tokens/${tokenCanonicalSymbol}/finality?environment=${environment}` + + if (outputKey) { + url += `&output_key=${outputKey}` + } + + const response = await fetch(url) + + if (!response.ok) { + console.error("Failed to fetch token finality:", response.status) + return null + } + + const data = await response.json() + return data + } catch (error) { + console.error("Error fetching token finality:", error) + return null + } + } + + /** + * Checks if rate limiter data is unavailable (null) + * + * @param entry - Rate limiter entry to check + * @returns True if unavailable (null) + */ + isRateLimiterUnavailable(entry: RateLimiterEntry): entry is null { + return entry === null + } + + /** + * Checks if rate limiter is enabled + * + * @param config - Rate limiter configuration + * @returns True if enabled + */ + isRateLimiterEnabled(config: RateLimiterConfig): boolean { + return config.isEnabled + } + + /** + * Gets the request ID for this service instance + */ + getRequestId(): string { + return this.requestId + } + + /** + * Extracts FTF (custom) rate limit data for a specific token and direction + * + * @param tokenRateLimits - Token rate limits containing standard and custom entries + * @param direction - Direction ("in" for inbound, "out" for outbound) + * @returns FTF rate limiter config or null if unavailable + */ + getFTFRateLimit(tokenRateLimits: TokenRateLimits, direction: "in" | "out"): RateLimiterConfig | null { + if (!tokenRateLimits.custom || this.isRateLimiterUnavailable(tokenRateLimits.custom)) { + return null + } + + const customEntry = tokenRateLimits.custom + return customEntry[direction] || null + } + + /** + * Gets FTF capacity for a specific token and direction + * + * @param tokenRateLimits - Token rate limits containing standard and custom entries + * @param direction - Direction ("in" for inbound, "out" for outbound) + * @returns FTF capacity value or null if unavailable + */ + getFTFCapacity(tokenRateLimits: TokenRateLimits, direction: "in" | "out"): string | null { + const ftfLimit = this.getFTFRateLimit(tokenRateLimits, direction) + return ftfLimit?.capacity || null + } + + /** + * Gets FTF refill rate for a specific token and direction + * + * @param tokenRateLimits - Token rate limits containing standard and custom entries + * @param direction - Direction ("in" for inbound, "out" for outbound) + * @returns FTF refill rate value or null if unavailable + */ + getFTFRefillRate(tokenRateLimits: TokenRateLimits, direction: "in" | "out"): string | null { + const ftfLimit = this.getFTFRateLimit(tokenRateLimits, direction) + return ftfLimit?.rate || null + } + + /** + * Checks if FTF rate limiting is enabled for a specific token and direction + * + * @param tokenRateLimits - Token rate limits containing standard and custom entries + * @param direction - Direction ("in" for inbound, "out" for outbound) + * @returns True if FTF is enabled, false otherwise + */ + isFTFEnabled(tokenRateLimits: TokenRateLimits, direction: "in" | "out"): boolean { + const ftfLimit = this.getFTFRateLimit(tokenRateLimits, direction) + return ftfLimit?.isEnabled || false + } + + /** + * Gets both standard and FTF rate limits for a specific token and direction + * + * @param tokenRateLimits - Token rate limits containing standard and custom entries (can be null/undefined) + * @param direction - Direction ("in" for inbound, "out" for outbound) + * @returns Object containing both standard and FTF rate limits + */ + getAllRateLimitsForDirection( + tokenRateLimits: TokenRateLimits | null | undefined, + direction: "in" | "out" + ): { + standard: RateLimiterConfig | null + ftf: RateLimiterConfig | null + } { + if (!tokenRateLimits) { + return { standard: null, ftf: null } + } + + const standardLimit = + tokenRateLimits.standard && !this.isRateLimiterUnavailable(tokenRateLimits.standard) + ? tokenRateLimits.standard[direction] || null + : null + + const ftfLimit = this.getFTFRateLimit(tokenRateLimits, direction) + + return { + standard: standardLimit, + ftf: ftfLimit, + } + } + + /** + * Checks if a token has FTF rate limiting available + * + * @param tokenRateLimits - Token rate limits to check + * @returns True if FTF data is available (not null/unavailable) + */ + hasFTFRateLimits(tokenRateLimits: TokenRateLimits): boolean { + return tokenRateLimits.custom !== null && !this.isRateLimiterUnavailable(tokenRateLimits.custom) + } +} diff --git a/src/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/workers/data-worker.ts b/src/workers/data-worker.ts index ac75689d4ba..db3cf94b45f 100644 --- a/src/workers/data-worker.ts +++ b/src/workers/data-worker.ts @@ -33,6 +33,13 @@ interface SearchData { } lane: LaneConfig }> + verifiers: Array<{ + id: string + name: string + type: string + logo: string + totalNetworks: number + }> } interface WorkerMessage { @@ -44,6 +51,7 @@ interface WorkerResponse { networks: SearchData["chains"] tokens: SearchData["tokens"] lanes: SearchData["lanes"] + verifiers: SearchData["verifiers"] } self.onmessage = (event: MessageEvent<WorkerMessage>) => { @@ -51,7 +59,7 @@ self.onmessage = (event: MessageEvent<WorkerMessage>) => { const { search, data } = event.data if (!search || !data) { - self.postMessage({ networks: [], tokens: [], lanes: [] } as WorkerResponse) + self.postMessage({ networks: [], tokens: [], lanes: [], verifiers: [] } as WorkerResponse) return } @@ -74,7 +82,15 @@ self.onmessage = (event: MessageEvent<WorkerMessage>) => { return matchesNetwork && hasTokens }) - self.postMessage({ networks, tokens, lanes } as WorkerResponse) + // Filter verifiers + const verifiers = data.verifiers.filter( + (verifier) => + verifier.name.toLowerCase().includes(searchLower) || + verifier.id.toLowerCase().includes(searchLower) || + verifier.type.toLowerCase().includes(searchLower) + ) + + self.postMessage({ networks, tokens, lanes, verifiers } as WorkerResponse) } // Export types for use in main thread From 526ba3abf1ff70aff3895d065287b0bd859910fc Mon Sep 17 00:00:00 2001 From: Simone Cuomo <simone@thisdot.co> Date: Fri, 19 Dec 2025 09:12:58 +0000 Subject: [PATCH 076/214] Add placeholder image to avoid long dev building time --- public/assets/icons/generic-verifier.svg | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 public/assets/icons/generic-verifier.svg 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 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_3210_17742)"> +<path d="M8 16C12.4334 16 16 12.4334 16 8C16 3.56664 12.4334 0 8 0C3.56664 0 0 3.56664 0 8C0 12.4334 3.56664 16 8 16Z" fill="#E4E8ED"/> +<path d="M7.5502 3H6.4502V4.14158C5.12466 4.73793 4.25 6.09009 4.25 8C4.25 9.90992 5.12466 11.2621 6.4502 11.8584V13L7.5502 12.9991V12.1645C7.73345 12.1881 7.92163 12.2 8.114 12.2C8.22842 12.2 8.34051 12.1958 8.4502 12.1875V13L9.5502 12.9991V11.9426C10.7158 11.4861 11.4508 10.4647 11.618 9.224H10.37C10.178 10.4 9.29 11.084 8.102 11.084C6.566 11.084 5.51 9.956 5.51 8.204V7.796C5.51 6.044 6.566 4.916 8.102 4.916C9.29 4.916 10.178 5.6 10.37 6.776H11.618C11.4508 5.52649 10.7158 4.50926 9.5502 4.05553V3H8.4502V3.81243C8.34051 3.8042 8.22842 3.8 8.114 3.8C7.92163 3.8 7.73345 3.81194 7.5502 3.83546V3Z" fill="#6C7585"/> +</g> +<defs> +<clipPath id="clip0_3210_17742"> +<rect width="16" height="16" fill="white"/> +</clipPath> +</defs> +</svg> From 60532efebf273ed2c78c9d63bb1fe66796ea67c3 Mon Sep 17 00:00:00 2001 From: Simone Cuomo <simone@thisdot.co> Date: Fri, 19 Dec 2025 13:37:47 +0000 Subject: [PATCH 077/214] Fix build --- src/content/ccip/index.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/content/ccip/index.mdx b/src/content/ccip/index.mdx index d8b9780c843..8cd03f72240 100644 --- a/src/content/ccip/index.mdx +++ b/src/content/ccip/index.mdx @@ -29,6 +29,7 @@ import { SvgCrossChain, SvgBulletList, } from "@chainlink/blocks" +import { ClickToZoom } from "@components" export const toolsAndUtilities = [ { From 8dbc784e65d62a1d3e5584d00e9d4f8226eefe53 Mon Sep 17 00:00:00 2001 From: gfletcher-cll <grace.fletcher@smartcontract.com> Date: Fri, 19 Dec 2025 10:34:53 -0800 Subject: [PATCH 078/214] new ccip chains 12/19 (#3309) * new ccip chains 12/19 * llms * update --------- Co-authored-by: aelmanaa <aelmanaa@gmail.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> --- public/changelog.json | 15 + .../data/ccip/v1_2_0/mainnet/lanes.json | 400 ++++++++++++++---- .../data/ccip/v1_2_0/mainnet/tokens.json | 116 +++-- .../data/ccip/v1_2_0/testnet/chains.json | 20 + .../data/ccip/v1_2_0/testnet/lanes.json | 84 ++++ .../data/ccip/v1_2_0/testnet/tokens.json | 34 ++ src/config/data/chain-to-technology.json | 1 + src/config/data/chains.json | 14 +- src/config/types.ts | 1 + src/config/web3Providers.ts | 1 + .../resources/link-token-contracts.mdx | 15 + src/content/resources/llms-full.txt | 15 + src/features/utils/index.ts | 4 + src/scripts/reference/chains.json | 43 +- src/scripts/reference/linkNameSymbol.json | 4 + 15 files changed, 638 insertions(+), 129 deletions(-) diff --git a/public/changelog.json b/public/changelog.json index 327433d0d50..ebb915c19fc 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -358,6 +358,21 @@ } }, "data": [ + { + "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", diff --git a/src/config/data/ccip/v1_2_0/mainnet/lanes.json b/src/config/data/ccip/v1_2_0/mainnet/lanes.json index b92bfa8e2fc..e7b6dc3a9bc 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/mainnet/lanes.json @@ -832,20 +832,6 @@ } } }, - "GRT": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - } - } - }, "LEND": { "rateLimiterConfig": { "in": { @@ -1069,20 +1055,6 @@ } } }, - "GRT": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - } - } - }, "LBTC": { "rateLimiterConfig": { "in": { @@ -5191,6 +5163,20 @@ } } }, + "RAIN": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RIZE": { "rateLimiterConfig": { "in": { @@ -5560,6 +5546,22 @@ "address": "0x94Cbb3011f87f0A14D19caaEc155D5985E58E259", "enforceOutOfOrder": false, "version": "1.5.0" + }, + "supportedTokens": { + "VOOI": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } } }, "ethereum-mainnet-mode-1": { @@ -6106,6 +6108,20 @@ } } }, + "RAIN": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RIZE": { "rateLimiterConfig": { "in": { @@ -6679,6 +6695,20 @@ } } }, + "RAIN": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RIZE": { "rateLimiterConfig": { "in": { @@ -7077,6 +7107,20 @@ } } }, + "USD1": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "USELESS": { "rateLimiterConfig": { "in": { @@ -7904,20 +7948,6 @@ } } }, - "GRT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, "LEND": { "rateLimiterConfig": { "in": { @@ -8633,20 +8663,6 @@ } } }, - "GRT": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - } - } - }, "hyETH": { "rateLimiterConfig": { "in": { @@ -11429,20 +11445,6 @@ } } }, - "GRT": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - } - } - }, "LBTC": { "rateLimiterConfig": { "in": { @@ -11885,6 +11887,20 @@ } } }, + "RAIN": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RIZE": { "rateLimiterConfig": { "in": { @@ -12258,20 +12274,6 @@ } } }, - "GRT": { - "rateLimiterConfig": { - "in": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - }, - "out": { - "capacity": "1000000000000000000000000", - "isEnabled": true, - "rate": "11574074070000000000" - } - } - }, "hyETH": { "rateLimiterConfig": { "in": { @@ -13900,6 +13902,20 @@ } } }, + "RAIN": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RIZE": { "rateLimiterConfig": { "in": { @@ -14613,6 +14629,34 @@ } } }, + "QUICK": { + "rateLimiterConfig": { + "in": { + "capacity": "110000000000000000000000", + "isEnabled": true, + "rate": "305555555555555555554" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "277777777777777777777" + } + } + }, + "RAIN": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RIZE": { "rateLimiterConfig": { "in": { @@ -17463,6 +17507,22 @@ "address": "0xB608c110c35f2871c0e1ED30DA1848603bC18694", "enforceOutOfOrder": false, "version": "1.5.0" + }, + "supportedTokens": { + "VOOI": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } } }, "ethereum-mainnet-arbitrum-1": { @@ -17586,6 +17646,20 @@ "rate": "0" } } + }, + "VOOI": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } } @@ -22671,6 +22745,20 @@ } } }, + "RAIN": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RIZE": { "rateLimiterConfig": { "in": { @@ -24939,6 +25027,20 @@ } } }, + "RAIN": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RIZE": { "rateLimiterConfig": { "in": { @@ -25993,9 +26095,9 @@ "rate": "9250000000000000" }, "out": { - "capacity": "30000000000000000000", + "capacity": "2", "isEnabled": true, - "rate": "8333333333333333" + "rate": "1" } } }, @@ -26137,6 +26239,20 @@ "rate": "0" } } + }, + "VOOI": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } }, @@ -27491,6 +27607,20 @@ } } }, + "RAIN": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "REG": { "rateLimiterConfig": { "in": { @@ -27774,6 +27904,20 @@ "version": "1.6.0" }, "supportedTokens": { + "aprMON": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "BTC.b": { "rateLimiterConfig": { "in": { @@ -29853,6 +29997,20 @@ } } }, + "RAIN": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RIZE": { "rateLimiterConfig": { "in": { @@ -30349,6 +30507,34 @@ } } }, + "QUICK": { + "rateLimiterConfig": { + "in": { + "capacity": "110000000000000000000000", + "isEnabled": true, + "rate": "305555555555555555554" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "277777777777777777777" + } + } + }, + "RAIN": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "RIZE": { "rateLimiterConfig": { "in": { @@ -30914,6 +31100,20 @@ } } }, + "RAIN": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "REG": { "rateLimiterConfig": { "in": { @@ -31719,6 +31919,20 @@ "version": "1.6.0" }, "supportedTokens": { + "aprMON": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "BTC.b": { "rateLimiterConfig": { "in": { @@ -34053,6 +34267,20 @@ } } }, + "USD1": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + }, "USELESS": { "rateLimiterConfig": { "in": { diff --git a/src/config/data/ccip/v1_2_0/mainnet/tokens.json b/src/config/data/ccip/v1_2_0/mainnet/tokens.json index fc4b245f65b..e901f932c1c 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/mainnet/tokens.json @@ -115,6 +115,26 @@ "tokenAddress": "0xF80132FC0A86ADd011BffCe3AedD60A86E3d704D" } }, + "aprMON": { + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "aPriori LST", + "poolAddress": "0x3a138a2bA7DBA72ACBCdb2DCFBaF02ce311e5d0F", + "poolType": "burnMint", + "symbol": "aprMON", + "tokenAddress": "0x93783ccd94763e11B9a57394e63Ddd9CeedaD925" + }, + "monad-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "aPriori Monad LST", + "poolAddress": "0x3AaFf16d7f8c9163AF6e0f14Ec46CbA5bdc8C6C3", + "poolType": "lockRelease", + "symbol": "aprMON", + "tokenAddress": "0x0c65A0BC65a5D819235B71F554D210D3F80E0852" + } + }, "APRS": { "mainnet": { "allowListEnabled": false, @@ -1941,35 +1961,6 @@ "tokenAddress": "0xfc421aD3C883Bf9E7C4f42dE845C4e4405799e73" } }, - "GRT": { - "avalanche-mainnet": { - "allowListEnabled": false, - "decimals": 18, - "name": "Graph Token", - "poolAddress": "0xf0b6E11fB42fA8874cCB422C22D8036b1742B783", - "poolType": "burnMint", - "symbol": "GRT", - "tokenAddress": "0x408A6A9E7aFa805B92953e5E92D93d5DCCa2B4a2" - }, - "ethereum-mainnet-arbitrum-1": { - "allowListEnabled": false, - "decimals": 18, - "name": "Graph Token", - "poolAddress": "0x318Ec96df83AccC18B5EAD5D23e0F022F7Eb5503", - "poolType": "lockRelease", - "symbol": "GRT", - "tokenAddress": "0x9623063377AD1B27544C965cCd7342f7EA7e88C7" - }, - "ethereum-mainnet-base-1": { - "allowListEnabled": false, - "decimals": 18, - "name": "Graph Token", - "poolAddress": "0xC1E69F1b34E7F8d05919965Fc81FC7aDB546A52b", - "poolType": "burnMint", - "symbol": "GRT", - "tokenAddress": "0x7CCC78a24C3311eB6f6806f6fcf2c07CAe78CfE3" - } - }, "hyETH": { "ethereum-mainnet-arbitrum-1": { "allowListEnabled": false, @@ -4154,6 +4145,64 @@ "tokenAddress": "0x6c460b2c6D6719562D5dA43E5152B375e79B9A8B" } }, + "QUICK": { + "ethereum-mainnet-base-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "QuickSwap", + "poolAddress": "0xf7C2DbFF4dFEc28eaf52CAAc8FdA22FbA19199ce", + "poolType": "lockRelease", + "symbol": "QUICK", + "tokenAddress": "0x7094c27f342DBAdfbbeD005b219431595E33b305" + }, + "matic-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "QuickSwap", + "poolAddress": "0x8D89611841D3389711ea3c74538f953F8dffA427", + "poolType": "lockRelease", + "symbol": "QUICK", + "tokenAddress": "0xB5C064F955D8e7F38fE0460C556a72987494eE17" + } + }, + "RAIN": { + "bsc-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Rain Coin", + "poolAddress": "0xa71433A266dB0B15cF127dE74B3Fa33Cbe730526", + "poolType": "burnMint", + "symbol": "RAIN", + "tokenAddress": "0x24b1C3f935DfFcADb606920022BA8C703BB065D7" + }, + "ethereum-mainnet-base-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "Rain Coin", + "poolAddress": "0xDca466bE13e06659CfED0f0467c370FCAbE46F32", + "poolType": "burnMint", + "symbol": "RAIN", + "tokenAddress": "0x4E21eABf4fC4cF66f10a93395E4B0e2438de81a6" + }, + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Rain Coin", + "poolAddress": "0x390735D3b3C3805F71644154e5Fba82E0e542e76", + "poolType": "burnMint", + "symbol": "RAIN", + "tokenAddress": "0x59DB93D135F16585ED90b8C942d4f8AE0DcFBFc0" + }, + "matic-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped Rain Coin", + "poolAddress": "0x3D9C216B971C82B95106ec98F6ade87F6a56915C", + "poolType": "lockRelease", + "symbol": "RAIN", + "tokenAddress": "0x2b72C03feAf5f6B624Db83974054848C9dF2c8e7" + } + }, "RDP": { "bsc-mainnet": { "allowListEnabled": false, @@ -6783,6 +6832,15 @@ "symbol": "VOOI", "tokenAddress": "0x876cEcb73c9ED1B1526F8e35C6a5a51a31BCF341" }, + "ethereum-mainnet-mantle-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "VOOI", + "poolAddress": "0xE43F2F7A4A6010AC3C07B06081Dfbf0255137912", + "poolType": "burnMint", + "symbol": "VOOI", + "tokenAddress": "0xd81a4aDea9932a6BDba0bDBc8C5Fd4C78e5A09f1" + }, "mainnet": { "allowListEnabled": false, "decimals": 18, diff --git a/src/config/data/ccip/v1_2_0/testnet/chains.json b/src/config/data/ccip/v1_2_0/testnet/chains.json index 82b8a07f411..2c687c01178 100644 --- a/src/config/data/ccip/v1_2_0/testnet/chains.json +++ b/src/config/data/ccip/v1_2_0/testnet/chains.json @@ -470,6 +470,26 @@ "version": "1.5.1" } }, + "ethereum-testnet-hoodi": { + "armProxy": { + "address": "0xEB5D23FD0CFcd7EB3D16ac6F3A58CAdaF44c2324", + "version": "1.0.0" + }, + "chainSelector": "10380998176179737091", + "feeTokens": ["LINK", "WETH"], + "registryModule": { + "address": "0x19e696e75ccbB3155EEbB579BFa555Fab22293bA", + "version": "1.6.0" + }, + "router": { + "address": "0xc93Dac3422660A41500a24C94BF14616995e3CA6", + "version": "1.2.0" + }, + "tokenAdminRegistry": { + "address": "0x073b3C71eb4630c4C88F1f72954fdFff30cf3f8D", + "version": "1.5.0" + } + }, "ethereum-testnet-hoodi-morph": { "armProxy": { "address": "0x9A60462e4CA802E3E945663930Be0d162e662091", diff --git a/src/config/data/ccip/v1_2_0/testnet/lanes.json b/src/config/data/ccip/v1_2_0/testnet/lanes.json index 921ba9770a2..cb22f214cc2 100644 --- a/src/config/data/ccip/v1_2_0/testnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/testnet/lanes.json @@ -1007,6 +1007,20 @@ "rate": "167000000000000000000" } } + }, + "syrupUSDT": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } }, @@ -1563,6 +1577,35 @@ } } }, + "ethereum-testnet-hoodi": { + "ethereum-testnet-sepolia": { + "offRamp": { + "address": "0x13090F92dd97d5eb6E2C42f3a4709A3a923236d4", + "version": "1.6.0" + }, + "onRamp": { + "address": "0xE11e310ebb56996669E1A2AA189f54C581a2a6bC", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "CCIP-BnM": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + } + }, "ethereum-testnet-hoodi-morph": { "ethereum-testnet-sepolia": { "offRamp": { @@ -1914,6 +1957,20 @@ "rate": "167000000000000000000" } } + }, + "syrupUSDT": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } } } }, @@ -2061,6 +2118,33 @@ } } }, + "ethereum-testnet-hoodi": { + "offRamp": { + "address": "0x0820f975ce90EE5c508657F0C58b71D1fcc85cE0", + "version": "1.6.0" + }, + "onRamp": { + "address": "0x23a5084Fa78104F3DF11C63Ae59fcac4f6AD9DeE", + "enforceOutOfOrder": false, + "version": "1.6.0" + }, + "supportedTokens": { + "CCIP-BnM": { + "rateLimiterConfig": { + "in": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + }, + "out": { + "capacity": "0", + "isEnabled": false, + "rate": "0" + } + } + } + } + }, "ethereum-testnet-hoodi-morph": { "offRamp": { "address": "0x0820f975ce90EE5c508657F0C58b71D1fcc85cE0", diff --git a/src/config/data/ccip/v1_2_0/testnet/tokens.json b/src/config/data/ccip/v1_2_0/testnet/tokens.json index 3368863cb64..d79187a7ab0 100644 --- a/src/config/data/ccip/v1_2_0/testnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/testnet/tokens.json @@ -147,6 +147,15 @@ "symbol": "CCIP-BnM", "tokenAddress": "0x54B50385e417469dbdb697f40651e8864664D992" }, + "ethereum-testnet-hoodi": { + "allowListEnabled": false, + "decimals": 18, + "name": "CCIP-BnM", + "poolAddress": "0xb7E0D638cE82ba6AdC88D7FeBD5E06e549bAC4b6", + "poolType": "burnMint", + "symbol": "CCIP-BnM", + "tokenAddress": "0xAA3450998528E43322698a914D0b756B98292A3b" + }, "ethereum-testnet-hoodi-morph": { "allowListEnabled": false, "decimals": 18, @@ -833,6 +842,14 @@ "symbol": "LINK", "tokenAddress": "0x01fcdEedbA59bc68b0914D92277678dAB6827e2c" }, + "ethereum-testnet-hoodi": { + "allowListEnabled": false, + "decimals": 18, + "name": "ChainLink Token", + "poolType": "feeTokenOnly", + "symbol": "LINK", + "tokenAddress": "0x76c00B055414de203B79B4955E28119BF459033e" + }, "ethereum-testnet-hoodi-morph": { "allowListEnabled": false, "decimals": 18, @@ -1323,6 +1340,15 @@ } }, "syrupUSDT": { + "bsc-testnet": { + "allowListEnabled": false, + "decimals": 6, + "name": "Syrup USDT", + "poolAddress": "0xC35b5f794ba3Fd629E642Eb0d80e0ecc84da7B96", + "poolType": "burnMint", + "symbol": "syrupUSDT", + "tokenAddress": "0x7e4Df3e1bB9b5E42dc334670F1844cD6037b8685" + }, "ethereum-testnet-sepolia": { "allowListEnabled": false, "decimals": 6, @@ -1600,6 +1626,14 @@ "symbol": "WETH", "tokenAddress": "0xae2C46ddb314B9Ba743C6dEE4878F151881333D9" }, + "ethereum-testnet-hoodi": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped ETH", + "poolType": "feeTokenOnly", + "symbol": "WETH", + "tokenAddress": "0xF0b60c40554fE9d385EB5F1Ec03471f0d66EC589" + }, "ethereum-testnet-hoodi-morph": { "allowListEnabled": false, "decimals": 18, diff --git a/src/config/data/chain-to-technology.json b/src/config/data/chain-to-technology.json index 4266991e631..a2e6b964436 100644 --- a/src/config/data/chain-to-technology.json +++ b/src/config/data/chain-to-technology.json @@ -54,6 +54,7 @@ "CORN_MAINNET": "CORN", "CORN_TESTNET": "CORN", "ETHEREUM_HOLESKY": "ETHEREUM", + "ETHEREUM_HOODI": "ETHEREUM", "ASTAR_MAINNET": "ASTAR", "ASTAR_SHIBUYA": "ASTAR", "ZIRCUIT_MAINNET": "ZIRCUIT", diff --git a/src/config/data/chains.json b/src/config/data/chains.json index 91f1ec77ca3..b202bfbf5eb 100644 --- a/src/config/data/chains.json +++ b/src/config/data/chains.json @@ -39,6 +39,18 @@ "symbol": "ETH", "decimals": 18 } + }, + "ETHEREUM_HOODI": { + "chainId": 560048, + "title": "Ethereum Hoodi", + "explorer": { + "baseUrl": "https://hoodi.etherscan.io/" + }, + "nativeCurrency": { + "name": "Hoodi Ether", + "symbol": "ETH", + "decimals": 18 + } } } }, @@ -2441,7 +2453,7 @@ "chainId": 964, "title": "Bittensor EVM", "explorer": { - "baseUrl": "https://taostats.io/" + "baseUrl": "https://evm.taostats.io/" }, "nativeCurrency": { "name": "TAO", diff --git a/src/config/types.ts b/src/config/types.ts index c4ace27a0b0..6025a95dc8e 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -90,6 +90,7 @@ export type SupportedChain = | "ETHEREUM_MAINNET" | "ETHEREUM_SEPOLIA" | "ETHEREUM_HOLESKY" + | "ETHEREUM_HOODI" | "BNB_MAINNET" | "BNB_TESTNET" | "POLYGON_MAINNET" diff --git a/src/config/web3Providers.ts b/src/config/web3Providers.ts index ab57ddc34a4..4fb50a83b7d 100644 --- a/src/config/web3Providers.ts +++ b/src/config/web3Providers.ts @@ -48,6 +48,7 @@ export const chainToProvider: Record<SupportedChain, () => Provider> = { SONEIUM_MAINNET: () => new JsonRpcProvider("https://rpc.soneium.org"), SONEIUM_MINATO: () => new JsonRpcProvider("https://rpc.minato.soneium.org"), ETHEREUM_HOLESKY: () => new JsonRpcProvider("https://ethereum-holesky-rpc.publicnode.com"), + ETHEREUM_HOODI: () => new JsonRpcProvider("https://rpc.hoodi.ethpandaops.io"), ASTAR_MAINNET: () => new JsonRpcProvider("https://rpc.astar.network"), ASTAR_SHIBUYA: () => new JsonRpcProvider("https://evm.shibuya.astar.network/"), ZIRCUIT_MAINNET: () => new JsonRpcProvider("https://zircuit1-mainnet.liquify.com"), diff --git a/src/content/resources/link-token-contracts.mdx b/src/content/resources/link-token-contracts.mdx index 0acdcd9c46d..dd91f634dd4 100644 --- a/src/content/resources/link-token-contracts.mdx +++ b/src/content/resources/link-token-contracts.mdx @@ -580,6 +580,21 @@ Testnet ETH and LINK are available at [faucets.chain.link/holesky](https://fauce | Decimals | 18 | | Network status | [etherscan.freshstatus.io](https://etherscan.freshstatus.io/) | +### Ethereum Hoodi Testnet + +Testnet ETH is used to pay for transactions on Hoodi. + +Testnet ETH and LINK are available at [faucets.chain.link/hoodi](https://faucets.chain.link/hoodi). + +| Parameter | Value | +| :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Chain ID | `560048` | +| Address | <Address contractUrl="https://hoodi.etherscan.io/token/0x76c00B055414de203B79B4955E28119BF459033e" urlId="560048_0x76c00B055414de203B79B4955E28119BF459033e" urlClass="erc-token-address"/> | +| Name | Chainlink Token on Ethereum Hoodi Testnet | +| Symbol | LINK | +| Decimals | 18 | +| Network status | [etherscan.freshstatus.io](https://etherscan.freshstatus.io/) | + ## <img src="/assets/chains/etherlink.svg" style="height: 24px; width: auto; margin-right: 8px;" />Etherlink ### Etherlink Mainnet diff --git a/src/content/resources/llms-full.txt b/src/content/resources/llms-full.txt index 042aab4c712..46063c25b0f 100644 --- a/src/content/resources/llms-full.txt +++ b/src/content/resources/llms-full.txt @@ -1338,6 +1338,21 @@ Testnet ETH and LINK are available at [faucets.chain.link/holesky](https://fauce | Decimals | 18 | | Network status | [etherscan.freshstatus.io](https://etherscan.freshstatus.io/) | +### Ethereum Hoodi Testnet + +Testnet ETH is used to pay for transactions on Hoodi. + +Testnet ETH and LINK are available at [faucets.chain.link/hoodi](https://faucets.chain.link/hoodi). + +| Parameter | Value | +| :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `560048` | +| Address | <Address contractUrl="https://hoodi.etherscan.io/token/0x76c00B055414de203B79B4955E28119BF459033e" urlId="560048_0x76c00B055414de203B79B4955E28119BF459033e" urlClass="erc-token-address" /> | +| Name | Chainlink Token on Ethereum Hoodi Testnet | +| Symbol | LINK | +| Decimals | 18 | +| Network status | [etherscan.freshstatus.io](https://etherscan.freshstatus.io/) | + ## <img src="/assets/chains/etherlink.svg" style="height: 24px; width: auto; margin-right: 8px;" />Etherlink ### Etherlink Mainnet diff --git a/src/features/utils/index.ts b/src/features/utils/index.ts index 4d8032b2970..04e34724572 100644 --- a/src/features/utils/index.ts +++ b/src/features/utils/index.ts @@ -276,6 +276,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": @@ -609,6 +611,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": diff --git a/src/scripts/reference/chains.json b/src/scripts/reference/chains.json index 31a1b71f82e..bb34b953b35 100644 --- a/src/scripts/reference/chains.json +++ b/src/scripts/reference/chains.json @@ -856,7 +856,8 @@ "chainId": 964, "networkId": 964, "slip44": 1005, - "icon": "bittensor" + "icon": "bittensor", + "explorers": [{ "name": "Bittensor EVM Explorer", "url": "https://evm.taostats.io/", "standard": "EIP3091" }] }, { "name": "Stable Mainnet", @@ -1533,18 +1534,6 @@ "chainId": 4326, "networkId": 4326 }, - { - "name": "Tempo Testnet", - "chain": "ETH", - "nativeCurrency": { "name": "USD", "symbol": "USD", "decimals": 18 }, - "rpc": ["https://rpc.testnet.tempo.xyz"], - "faucets": [], - "explorers": [{ "name": "Tempo Explorer", "url": "https://explore.tempo.xyz", "standard": "none" }], - "infoURL": "https://tempo.xyz/", - "shortName": "megaeth", - "chainId": 42429, - "networkId": 42429 - }, { "name": "World Chain Sepolia Testnet", "chain": "ETH", @@ -1974,6 +1963,18 @@ { "name": "blockscout", "url": "https://explorer.celo.org", "standard": "none" } ] }, + { + "name": "Tempo Testnet", + "chain": "ETH", + "nativeCurrency": { "name": "USD", "symbol": "USD", "decimals": 18 }, + "rpc": ["https://rpc.testnet.tempo.xyz"], + "faucets": [], + "explorers": [{ "name": "Tempo Explorer", "url": "https://explore.tempo.xyz", "standard": "none" }], + "infoURL": "https://tempo.xyz/", + "shortName": "megaeth", + "chainId": 42429, + "networkId": 42429 + }, { "name": "Etherlink Mainnet", "chain": "Etherlink", @@ -2643,6 +2644,22 @@ "explorers": [{ "name": "Scrollscan", "url": "https://scrollscan.com", "standard": "EIP3091" }], "parent": { "type": "L2", "chain": "eip155-1", "bridges": [{ "url": "https://scroll.io/bridge" }] } }, + { + "name": "Ethereum Hoodi", + "title": "Ethereum Testnet Hoodi", + "chain": "ETH", + "icon": "ethereum", + "rpc": ["https://rpc.hoodi.ethpandaops.io"], + "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], + "faucets": ["https://faucet.hoodi.ethpandaops.io", "https://hoodi-faucet.pk910.de/"], + "nativeCurrency": { "name": "Hoodi Ether", "symbol": "ETH", "decimals": 18 }, + "infoURL": "https://hoodi.ethpandaops.io", + "shortName": "hoe", + "chainId": 560048, + "networkId": 560048, + "slip44": 1, + "explorers": [{ "name": "Hoodi", "url": "https://hoodi.etherscan.io/", "standard": "none" }] + }, { "name": "Merlin Testnet", "chainId": 686868, diff --git a/src/scripts/reference/linkNameSymbol.json b/src/scripts/reference/linkNameSymbol.json index ffddeec33f0..9e00315059e 100644 --- a/src/scripts/reference/linkNameSymbol.json +++ b/src/scripts/reference/linkNameSymbol.json @@ -651,5 +651,9 @@ "4326": { "name": "ChainLink Token", "symbol": "LINK" + }, + "560048": { + "name": "ChainLink Token", + "symbol": "LINK" } } From 0883c0f8a87c7a222c4ea139b4b1aa30c7c66644 Mon Sep 17 00:00:00 2001 From: "Amine E." <aelmanaa@users.noreply.github.com> Date: Fri, 19 Dec 2025 20:01:43 +0100 Subject: [PATCH 079/214] correct symbol (#3312) --- src/config/data/ccip/v1_2_0/mainnet/tokens.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/data/ccip/v1_2_0/mainnet/tokens.json b/src/config/data/ccip/v1_2_0/mainnet/tokens.json index e901f932c1c..588f9704857 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/mainnet/tokens.json @@ -3531,7 +3531,7 @@ "solana-mainnet": { "allowListEnabled": false, "decimals": 6, - "name": "michi", + "name": "Michi", "poolAddress": "ATyY7SaiayLnp3teH3c4jRBGiPinSSZyt2gHNNN9C6BV", "poolType": "lockRelease", "symbol": "$michi", @@ -4199,7 +4199,7 @@ "name": "Wrapped Rain Coin", "poolAddress": "0x3D9C216B971C82B95106ec98F6ade87F6a56915C", "poolType": "lockRelease", - "symbol": "RAIN", + "symbol": "wRAIN", "tokenAddress": "0x2b72C03feAf5f6B624Db83974054848C9dF2c8e7" } }, From 54219ba65103cc5e3cd2a12dae985b0121574c2b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 09:52:13 +0000 Subject: [PATCH 080/214] Bump @supabase/supabase-js from 2.87.1 to 2.89.0 (#3320) * Bump @supabase/supabase-js from 2.87.1 to 2.89.0 Bumps [@supabase/supabase-js](https://github.com/supabase/supabase-js/tree/HEAD/packages/core/supabase-js) from 2.87.1 to 2.89.0. - [Release notes](https://github.com/supabase/supabase-js/releases) - [Changelog](https://github.com/supabase/supabase-js/blob/master/packages/core/supabase-js/CHANGELOG.md) - [Commits](https://github.com/supabase/supabase-js/commits/v2.89.0/packages/core/supabase-js) --- updated-dependencies: - dependency-name: "@supabase/supabase-js" dependency-version: 2.89.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * update --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 140 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 71 insertions(+), 71 deletions(-) diff --git a/package-lock.json b/package-lock.json index f2744fc5444..290327eab70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "@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.87.1", + "@supabase/supabase-js": "^2.89.0", "astro": "^5.16.5", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", @@ -11938,9 +11938,9 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/assets-registry": { - "version": "0.83.0", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.0.tgz", - "integrity": "sha512-EmGSKDvmnEnBrTK75T+0Syt6gy/HACOTfziw5+392Kr1Bb28Rv26GyOIkvptnT+bb2VDHU0hx9G0vSy5/S3rmQ==", + "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, @@ -11949,9 +11949,9 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/codegen": { - "version": "0.83.0", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.0.tgz", - "integrity": "sha512-3fvMi/pSJHhikjwMZQplU4Ar9ANoR2GSBxotbkKIMI6iNduh+ln1FTvB2me69FA68aHtVZOO+cO+QpGCcvgaMA==", + "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, @@ -11972,14 +11972,14 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/community-cli-plugin": { - "version": "0.83.0", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.0.tgz", - "integrity": "sha512-bJD5pLURgKY2YK0R6gUsFWHiblSAFt1Xyc2fsyCL8XBnB7kJfVhLAKGItk6j1QZbwm1Io41ekZxBmZdyQqIDrg==", + "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.0", + "@react-native/dev-middleware": "0.83.1", "debug": "^4.4.0", "invariant": "^2.2.4", "metro": "^0.83.3", @@ -12004,9 +12004,9 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/debugger-frontend": { - "version": "0.83.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.0.tgz", - "integrity": "sha512-7XVbkH8nCjLKLe8z5DS37LNP62/QNNya/YuLlVoLfsiB54nR/kNZij5UU7rS0npAZ3WN7LR0anqLlYnzDd0JHA==", + "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, @@ -12015,9 +12015,9 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/debugger-shell": { - "version": "0.83.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.0.tgz", - "integrity": "sha512-rJJxRRLLsKW+cqd0ALSBoqwL5SQTmwpd5SGl6rq9sY+fInCUKfkLEIc5HWQ0ppqoPyDteQVWbQ3a5VN84aJaNg==", + "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, @@ -12030,16 +12030,16 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/dev-middleware": { - "version": "0.83.0", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.0.tgz", - "integrity": "sha512-HWn42tbp0h8RWttua6d6PjseaSr3IdwkaoqVxhiM9kVDY7Ro00eO7tdlVgSzZzhIibdVS2b2C3x+sFoWhag1fA==", + "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.0", - "@react-native/debugger-shell": "0.83.0", + "@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", @@ -12055,9 +12055,9 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/gradle-plugin": { - "version": "0.83.0", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.0.tgz", - "integrity": "sha512-BXZRmfsbgPhEPkrRPjk2njA2AzhSelBqhuoklnv3DdLTdxaRjKYW+LW0zpKo1k3qPKj7kG1YGI3miol6l1GB5g==", + "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, @@ -12066,9 +12066,9 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/js-polyfills": { - "version": "0.83.0", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.0.tgz", - "integrity": "sha512-cVB9BMqlfbQR0v4Wxi5M2yDhZoKiNqWgiEXpp7ChdZIXI0SEnj8WwLwE3bDkyOfF8tCHdytpInXyg/al2O+dLQ==", + "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, @@ -12077,17 +12077,17 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/@react-native/normalize-colors": { - "version": "0.83.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.0.tgz", - "integrity": "sha512-DG1ELOqQ6RS82R1zEUGTWa/pfSPOf+vwAnQB7Ao1vRuhW/xdd2OPQJyqx5a5QWMYpGrlkCb7ERxEVX6p2QODCA==", + "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.83.0", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.0.tgz", - "integrity": "sha512-AVnDppwPidQrPrzA4ETr4o9W+40yuijg3EVgFt2hnMldMZkqwPRrgJL2GSreQjCYe1NfM5Yn4Egyy4Kd0yp4Lw==", + "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, @@ -12342,21 +12342,21 @@ } }, "node_modules/@solana-mobile/wallet-adapter-mobile/node_modules/react-native": { - "version": "0.83.0", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.83.0.tgz", - "integrity": "sha512-a8wPjGfkktb1+Mjvzkky3d0u6j6zdWAzftZ2LdQtgRgqkMMfgQxD9S+ri3RNlfAFQpuCAOYUIyrNHiVkUQChxA==", + "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.83.0", - "@react-native/codegen": "0.83.0", - "@react-native/community-cli-plugin": "0.83.0", - "@react-native/gradle-plugin": "0.83.0", - "@react-native/js-polyfills": "0.83.0", - "@react-native/normalize-colors": "0.83.0", - "@react-native/virtualized-lists": "0.83.0", + "@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", @@ -14346,9 +14346,9 @@ "license": "MIT" }, "node_modules/@supabase/auth-js": { - "version": "2.87.1", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.87.1.tgz", - "integrity": "sha512-6RDeOf5TVoaXFtEstN188ykp3pXLZaU9qoAWfx8dc50FFAAqt+kcFJ96V0IvSmcpb4mDAWcpTJ7BegmVDn/WIw==", + "version": "2.89.0", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.89.0.tgz", + "integrity": "sha512-wiWZdz8WMad8LQdJMWYDZ2SJtZP5MwMqzQq3ehtW2ngiI3UTgbKiFrvMUUS3KADiVlk4LiGfODB2mrYx7w2f8w==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14358,9 +14358,9 @@ } }, "node_modules/@supabase/functions-js": { - "version": "2.87.1", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.87.1.tgz", - "integrity": "sha512-rWmYo4gRD0XAjMhYDlz7IH67bp4TIQ1UE4VqwIQtl1gGPwtLDq6wcRnu7jLKlXx0Gtrknw/eoiHYG9//XrCTzQ==", + "version": "2.89.0", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.89.0.tgz", + "integrity": "sha512-XEueaC5gMe5NufNYfBh9kPwJlP5M2f+Ogr8rvhmRDAZNHgY6mI35RCkYDijd92pMcNM7g8pUUJov93UGUnqfyw==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14370,9 +14370,9 @@ } }, "node_modules/@supabase/postgrest-js": { - "version": "2.87.1", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.87.1.tgz", - "integrity": "sha512-Yzu5eL3iGmZW0C/8x+vEojAOou63FI9oVw8HI8YOq63+5yM8g8aGh7Y1E2vbXFb7+gHGsPqLnaC6dPhrYt7qBA==", + "version": "2.89.0", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.89.0.tgz", + "integrity": "sha512-/b0fKrxV9i7RNOEXMno/I1862RsYhuUo+Q6m6z3ar1f4ulTMXnDfv0y4YYxK2POcgrOXQOgKYQx1eArybyNvtg==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14382,9 +14382,9 @@ } }, "node_modules/@supabase/realtime-js": { - "version": "2.87.1", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.87.1.tgz", - "integrity": "sha512-XvLtEznxmYZXA7LYuy5zbSXpSYjDLJq2wQeRh3MzON2OR4U8Kq+RtPz2E2Wi8HEzvBfsc+nNu1TG8LQ9+3DRkA==", + "version": "2.89.0", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.89.0.tgz", + "integrity": "sha512-aMOvfDb2a52u6PX6jrrjvACHXGV3zsOlWRzZsTIOAJa0hOVvRp01AwC1+nLTGUzxzezejrYeCX+KnnM1xHdl+w==", "license": "MIT", "dependencies": { "@types/phoenix": "^1.6.6", @@ -14397,9 +14397,9 @@ } }, "node_modules/@supabase/storage-js": { - "version": "2.87.1", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.87.1.tgz", - "integrity": "sha512-0Uc8tNV4yzkNNmp1inpXru0RB4a7ECq05G2S6BDvSpMxTxJrDVJ4vVDwyhqB8ZZ+O9+8prHaQYoByQeuDnwpFQ==", + "version": "2.89.0", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.89.0.tgz", + "integrity": "sha512-6zKcXofk/M/4Eato7iqpRh+B+vnxeiTumCIP+Tz26xEqIiywzD9JxHq+udRrDuv6hXE+pmetvJd8n5wcf4MFRQ==", "license": "MIT", "dependencies": { "iceberg-js": "^0.8.1", @@ -14410,16 +14410,16 @@ } }, "node_modules/@supabase/supabase-js": { - "version": "2.87.1", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.87.1.tgz", - "integrity": "sha512-tVgqZqnHZVum584KuUKSQZgcy6ZkhVd6gG8QWg2QfIXH9HmXdamauxdVsLXwaNPJxEdOyfAfwIyi5XUsiVYWtg==", + "version": "2.89.0", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.89.0.tgz", + "integrity": "sha512-KlaRwSfFA0fD73PYVMHj5/iXFtQGCcX7PSx0FdQwYEEw9b2wqM7GxadY+5YwcmuEhalmjFB/YvqaoNVF+sWUlg==", "license": "MIT", "dependencies": { - "@supabase/auth-js": "2.87.1", - "@supabase/functions-js": "2.87.1", - "@supabase/postgrest-js": "2.87.1", - "@supabase/realtime-js": "2.87.1", - "@supabase/storage-js": "2.87.1" + "@supabase/auth-js": "2.89.0", + "@supabase/functions-js": "2.89.0", + "@supabase/postgrest-js": "2.89.0", + "@supabase/realtime-js": "2.89.0", + "@supabase/storage-js": "2.89.0" }, "engines": { "node": ">=20.0.0" @@ -17830,9 +17830,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, diff --git a/package.json b/package.json index af8e3b4291d..faf52aa68cc 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@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.87.1", + "@supabase/supabase-js": "^2.89.0", "astro": "^5.16.5", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", From 7e2ad5bdab3aab9a46f59bf8cc0c41c248c668e2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 09:58:49 +0000 Subject: [PATCH 081/214] CCT: Update changelog with new tokens (#3316) Co-authored-by: khadni <98668332+khadni@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> --- public/changelog.json | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/public/changelog.json b/public/changelog.json index ebb915c19fc..9dd28565806 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -358,6 +358,33 @@ } }, "data": [ + { + "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-19", From 363eed839e890a83d5aea443913024304ff7a839 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 10:06:22 +0000 Subject: [PATCH 082/214] Bump knip from 5.73.4 to 5.76.2 in the linting-tools group (#3319) * Bump knip from 5.73.4 to 5.76.2 in the linting-tools group Bumps the linting-tools group with 1 update: [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip). Updates `knip` from 5.73.4 to 5.76.2 - [Release notes](https://github.com/webpro-nl/knip/releases) - [Commits](https://github.com/webpro-nl/knip/commits/5.76.2/packages/knip) --- updated-dependencies: - dependency-name: knip dependency-version: 5.76.2 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: linting-tools ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 290327eab70..7077bea9144 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,7 +93,7 @@ "eslint-plugin-promise": "^6.1.1", "husky": "^9.1.7", "jest-yaml-transform": "^0.2.0", - "knip": "^5.73.4", + "knip": "^5.76.3", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", "pino-pretty": "^13.1.3", @@ -27225,9 +27225,9 @@ } }, "node_modules/knip": { - "version": "5.73.4", - "resolved": "https://registry.npmjs.org/knip/-/knip-5.73.4.tgz", - "integrity": "sha512-q0DDgqsRMa4z2IMEPEblns0igitG8Fu7exkvEgQx1QMLKEqSvcvKP9fMk+C1Ehy+Ux6oayl6zfAEGt6DvFtidw==", + "version": "5.76.3", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.76.3.tgz", + "integrity": "sha512-YLCCzOFzkuNgyL9LdrwFBstV9gpmvPCuolRzs9W++of0mtPH1D3ehE3M4okgayksgq7tWkkMAmyjrDrXxX6aAQ==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index faf52aa68cc..b234af8b05b 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,7 @@ "eslint-plugin-promise": "^6.1.1", "husky": "^9.1.7", "jest-yaml-transform": "^0.2.0", - "knip": "^5.73.4", + "knip": "^5.76.3", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", "pino-pretty": "^13.1.3", From c7f7cf293ab521dac3ea9e48c6bc597c2b473371 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 10:20:18 +0000 Subject: [PATCH 083/214] Bump solhint from 6.0.1 to 6.0.2 in the blockchain group (#3318) * Bump solhint from 6.0.1 to 6.0.2 in the blockchain group Bumps the blockchain group with 1 update: [solhint](https://github.com/protofire/solhint). Updates `solhint` from 6.0.1 to 6.0.2 - [Release notes](https://github.com/protofire/solhint/releases) - [Changelog](https://github.com/protofire/solhint/blob/develop/CHANGELOG.md) - [Commits](https://github.com/protofire/solhint/compare/v6.0.1...v6.0.2) --- updated-dependencies: - dependency-name: solhint dependency-version: 6.0.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: blockchain ... Signed-off-by: dependabot[bot] <support@github.com> * Bump solhint from 6.0.1 to 6.0.2 in the blockchain group Bumps the blockchain group with 1 update: [solhint](https://github.com/protofire/solhint). Updates `solhint` from 6.0.1 to 6.0.2 - [Release notes](https://github.com/protofire/solhint/releases) - [Changelog](https://github.com/protofire/solhint/blob/develop/CHANGELOG.md) - [Commits](https://github.com/protofire/solhint/compare/v6.0.1...v6.0.2) --- updated-dependencies: - dependency-name: solhint dependency-version: 6.0.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: blockchain ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7077bea9144..7dbab6e7c73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -103,7 +103,7 @@ "remark-mdx": "^3.1.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", - "solhint": "^6.0.1", + "solhint": "^6.0.2", "solhint-plugin-chainlink-solidity": "github:smartcontractkit/chainlink-solhint-rules#v1.3.0", "ts-jest": "^29.4.6", "tsconfig-paths": "^4.2.0", @@ -34083,9 +34083,9 @@ "license": "MIT" }, "node_modules/solhint": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/solhint/-/solhint-6.0.1.tgz", - "integrity": "sha512-Lew5nhmkXqHPybzBzkMzvvWkpOJSSLTkfTZwRriWvfR2naS4YW2PsjVGaoX9tZFmHh7SuS+e2GEGo5FPYYmJ8g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-6.0.2.tgz", + "integrity": "sha512-RInN0tz9FVR4eYlyLS0Pk8iJP3WdfVmmMJR9FIUxe9bKHgAPE8OYUXcMd5PGi5fO5BnZw32e0qMYcJZgH9MiBg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index b234af8b05b..d0759bb880a 100644 --- a/package.json +++ b/package.json @@ -148,7 +148,7 @@ "remark-mdx": "^3.1.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", - "solhint": "^6.0.1", + "solhint": "^6.0.2", "solhint-plugin-chainlink-solidity": "github:smartcontractkit/chainlink-solhint-rules#v1.3.0", "ts-jest": "^29.4.6", "tsconfig-paths": "^4.2.0", From 3fe806569d46da52ab7c5d37f572bcfbd2941705 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 10:27:47 +0000 Subject: [PATCH 084/214] Bump astro from 5.16.5 to 5.16.6 in the astro-framework group (#3317) * Bump astro from 5.16.5 to 5.16.6 in the astro-framework group Bumps the astro-framework group with 1 update: [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro). Updates `astro` from 5.16.5 to 5.16.6 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/astro@5.16.6/packages/astro) --- updated-dependencies: - dependency-name: astro dependency-version: 5.16.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: astro-framework ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7dbab6e7c73..6b0618d96c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "@solana/wallet-adapter-solflare": "^0.6.32", "@solana/wallet-adapter-trust": "^0.1.17", "@supabase/supabase-js": "^2.89.0", - "astro": "^5.16.5", + "astro": "^5.16.6", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", "clipboard": "^2.0.11", @@ -16917,9 +16917,9 @@ } }, "node_modules/astro": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.5.tgz", - "integrity": "sha512-QeuM4xzTR0QuXFDNlGVW0BW7rcquKFIkylaPeM4ufii0/RRiPTYtwxDYVZ3KfiMRuuc+nbLD0214kMKTvz/yvQ==", + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.6.tgz", + "integrity": "sha512-6mF/YrvwwRxLTu+aMEa5pwzKUNl5ZetWbTyZCs9Um0F12HUmxUiF5UHiZPy4rifzU3gtpM3xP2DfdmkNX9eZRg==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.13.0", diff --git a/package.json b/package.json index d0759bb880a..9d05c7ff816 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "@solana/wallet-adapter-solflare": "^0.6.32", "@solana/wallet-adapter-trust": "^0.1.17", "@supabase/supabase-js": "^2.89.0", - "astro": "^5.16.5", + "astro": "^5.16.6", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", "clipboard": "^2.0.11", From 1d09923e744eda6df755c64505d19bbf7531daca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 13:37:03 +0000 Subject: [PATCH 085/214] Changelog Update: New data found (#3315) * Data: Update changelog for new data items * fix feeds * test signed commit --------- Co-authored-by: khadni <98668332+khadni@users.noreply.github.com> --- .github/scripts/data/baseline.json | 9 +++- public/changelog.json | 76 ++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/.github/scripts/data/baseline.json b/.github/scripts/data/baseline.json index 7dd097a06e3..d2e11056aca 100644 --- a/.github/scripts/data/baseline.json +++ b/.github/scripts/data/baseline.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-14T21:03:22Z", + "timestamp": "2025-12-21T21:03:33Z", "knownIds": [ "aptos-apt-usd", "aptos-btc-usd", @@ -607,6 +607,7 @@ "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", @@ -822,6 +823,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", @@ -840,9 +842,11 @@ "base-doge-usd", "base-dola-usd", "base-eth-usd", + "base-eth-usd-shared-svr", "base-eth-usd-svr", "base-eur-usd", "base-eurc-usd", + "base-eurc-usd-shared-svr", "base-eurc-usd-svr", "base-ezeth-eth", "base-ezeth-eth-exchange-rate", @@ -921,11 +925,13 @@ "base-unibtc-btc-exchange-rate", "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-usr-usd", "base-virtual-usd", @@ -1916,6 +1922,7 @@ "polygon-pln-usd", "polygon-qnt-usd", "polygon-quick-usd", + "polygon-rcusd+-nav", "polygon-rdnt-usd", "polygon-ryt-nav", "polygon-ryt-polygon", diff --git a/public/changelog.json b/public/changelog.json index 9dd28565806..2c3c69d873a 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -385,6 +385,82 @@ "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", From c110d656925426794c51b86558f2d1f4f50275fe Mon Sep 17 00:00:00 2001 From: devin distefano <devin.distefano@smartcontract.com> Date: Mon, 29 Dec 2025 11:20:38 -0800 Subject: [PATCH 086/214] Chainlink Node v2.3.1 (#3328) * bump chainlink node version * various cleanup * changelog fix: 2.3.1->2.31 + backfill * changelog fix: 2.3.1->2.31 + backfill * nit --- public/changelog.json | 14 + .../chainlink-nodes/v1/node-config.mdx | 451 +++++++++++++----- 2 files changed, 342 insertions(+), 123 deletions(-) diff --git a/public/changelog.json b/public/changelog.json index 2c3c69d873a..fe19c73d76a 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -772,6 +772,13 @@ "title": "CCIP Expands to Tempo Testnet", "topic": "CCIP" }, + { + "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", @@ -1416,6 +1423,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", diff --git a/src/content/chainlink-nodes/v1/node-config.mdx b/src/content/chainlink-nodes/v1/node-config.mdx index f18aa574631..759a146ce19 100644 --- a/src/content/chainlink-nodes/v1/node-config.mdx +++ b/src/content/chainlink-nodes/v1/node-config.mdx @@ -342,6 +342,7 @@ MaxBatchSize = 50 # Default SendInterval = '500ms' # Default SendTimeout = '10s' # Default UseBatchSend = true # Default +ChipIngressEnabled = false # Default ``` ### UniConn @@ -400,6 +401,14 @@ UseBatchSend = true # Default UseBatchSend toggles sending telemetry to the ingress server using the batch client. +### ChipIngressEnabled + +```toml +ChipIngressEnabled = false # Default +``` + +ChipIngressEnabled enables sending telemetry to CHIP Ingress. + ## TelemetryIngress.Endpoints ```toml @@ -1268,6 +1277,7 @@ AllowNoBootstrappers = false # Default DefaultTransactionQueueDepth = 1 # Default SimulateTransactions = false # Default TraceLogging = false # Default +SampleTelemetry = false # Default KeyValueStoreRootDir = '~/.chainlink-data' # Default ``` @@ -1417,6 +1427,14 @@ TraceLogging = false # Default TraceLogging enables trace level logging. +### SampleTelemetry + +```toml +SampleTelemetry = false # Default +``` + +SampleTelemetry enables telemetry sampling. + ### KeyValueStoreRootDir ```toml @@ -1560,6 +1578,7 @@ IncomingMessageBufferSize = 10 # Default OutgoingMessageBufferSize = 10 # Default PeerID = '12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw' # Example TraceLogging = false # Default +EnableExperimentalRageP2P = false # Default ``` P2P has a versioned networking stack. Currently only `[P2P.V2]` is supported. @@ -1604,6 +1623,14 @@ TraceLogging = false # Default TraceLogging enables trace level logging. +### EnableExperimentalRageP2P + +```toml +EnableExperimentalRageP2P = false # Default +``` + +EnableExperimentalRageP2P needs to be enabled for ocr3.1 components + ## P2P.V2 ```toml @@ -1984,6 +2011,7 @@ IncomingMessageBufferSize = 10 # Default OutgoingMessageBufferSize = 10 # Default PeerID = '12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw' # Example TraceLogging = false # Default +EnableExperimentalRageP2P = false # Default ``` ### IncomingMessageBufferSize @@ -2025,6 +2053,14 @@ TraceLogging = false # Default TraceLogging enables trace level logging. +### EnableExperimentalRageP2P + +```toml +EnableExperimentalRageP2P = false # Default +``` + +EnableExperimentalRageP2P needs to be enabled for ocr3.1 components + ## Capabilities.Peering.V2 ```toml @@ -2882,11 +2918,17 @@ InsecureConnection = false # Default TraceSampleRatio = 0.01 # Default EmitterBatchProcessor = true # Default EmitterExportTimeout = '1s' # Default +AuthHeadersTTL = '0s' # Default ChipIngressEndpoint = '' # Default ChipIngressInsecureConnection = false # Default HeartbeatInterval = '1s' # Default LogLevel = "info" # Default LogStreamingEnabled = false # Default +LogBatchProcessor = true # Default +LogExportTimeout = '1s' # Default +LogExportMaxBatchSize = 512 # Default +LogExportInterval = '1s' # Default +LogMaxQueueSize = 2048 # Default ``` Telemetry holds OTEL settings. @@ -2951,6 +2993,15 @@ EmitterExportTimeout = '1s' # Default EmitterExportTimeout sets timeout for exporting telemetry events +### AuthHeadersTTL + +```toml +AuthHeadersTTL = '0s' # Default +``` + +AuthHeadersTTL is the time-to-live for rotating authentication headers used with telemetry endpoints. +Set to 0 to use static authentication headers. + ### ChipIngressEndpoint ```toml @@ -2991,6 +3042,46 @@ LogStreamingEnabled = false # Default LogStreamingEnabled enables log streaming to the OTel log exporter +### LogBatchProcessor + +```toml +LogBatchProcessor = true # Default +``` + +LogBatchProcessor enables batching for telemetry logs + +### LogExportTimeout + +```toml +LogExportTimeout = '1s' # Default +``` + +LogExportTimeout sets timeout for exporting telemetry logs + +### LogExportMaxBatchSize + +```toml +LogExportMaxBatchSize = 512 # Default +``` + +LogExportMaxBatchSize sets the maximum batch size of every batch export + +### LogExportInterval + +```toml +LogExportInterval = '1s' # Default +``` + +LogExportInterval sets the maximum duration between batched exports + +### LogMaxQueueSize + +```toml +LogMaxQueueSize = 2048 # Default +``` + +LogMaxQueueSize sets the maximum queue size used by the batcher + ## Telemetry.ResourceAttributes ```toml @@ -3273,7 +3364,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3388,7 +3479,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3503,7 +3594,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3618,7 +3709,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3738,7 +3829,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -3854,7 +3945,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -3969,7 +4060,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4083,7 +4174,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4197,7 +4288,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4312,7 +4403,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4427,7 +4518,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4543,7 +4634,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4658,7 +4749,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4773,7 +4864,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -4893,7 +4984,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -5008,7 +5099,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -5123,7 +5214,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -5238,7 +5329,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -5358,7 +5449,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -5475,7 +5566,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -5592,7 +5683,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -5712,7 +5803,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -5830,7 +5921,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -5949,7 +6040,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6064,7 +6155,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6178,7 +6269,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6298,7 +6389,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -6417,7 +6508,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6533,7 +6624,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6649,7 +6740,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6768,7 +6859,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -6887,7 +6978,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -7007,7 +7098,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -7127,7 +7218,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -7242,7 +7333,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -7358,7 +7449,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -7478,7 +7569,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -7592,7 +7683,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -7712,7 +7803,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -7829,7 +7920,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -7945,7 +8036,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -8061,7 +8152,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -8176,7 +8267,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8290,7 +8381,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8410,7 +8501,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8530,7 +8621,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8644,7 +8735,7 @@ EnforceRepeatableRead = false DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -8764,7 +8855,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -8884,7 +8975,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -8999,7 +9090,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9114,7 +9205,121 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 + +[OCR] +ContractConfirmations = 4 +ContractTransmitterTransmitTimeout = '10s' +DatabaseTimeout = '10s' +DeltaCOverride = '168h0m0s' +DeltaCJitterOverride = '1h0m0s' +ObservationGracePeriod = '1s' + +[OCR2] +[OCR2.Automation] +GasLimit = 5400000 + +[Workflow] +GasLimitDefault = 400000 +TxAcceptanceState = 2 +PollPeriod = '2s' +AcceptanceTimeout = '30s' +``` + +### Private Testnet Andesite (2024) + +```toml +AutoCreateKey = true +BlockBackfillDepth = 10 +BlockBackfillSkip = false +FinalityDepth = 1 +SafeDepth = 0 +FinalityTagEnabled = false +SafeTagSupported = true +LogBackfillBatchSize = 1000 +LogPollInterval = '15s' +LogKeepBlocksDepth = 100000 +LogPrunePageSize = 0 +BackupLogPollerBlockDelay = 100 +MinIncomingConfirmations = 3 +MinContractPayment = '0.00001 link' +NonceAutoSync = true +NoNewHeadsThreshold = '3m0s' +LogBroadcasterEnabled = false +RPCDefaultBatchSize = 250 +RPCBlockQueryDelay = 1 +FinalizedBlockOffset = 0 +NoNewFinalizedHeadsThreshold = '0s' + +[Transactions] +Enabled = true +ForwardersEnabled = false +MaxInFlight = 16 +MaxQueued = 250 +ReaperInterval = '1h0m0s' +ReaperThreshold = '168h0m0s' +ResendAfterThreshold = '1m0s' +ConfirmationTimeout = '1m0s' + +[Transactions.AutoPurge] +Enabled = false + +[Transactions.TransactionManagerV2] +Enabled = false + +[BalanceMonitor] +Enabled = false + +[GasEstimator] +Mode = 'SuggestedPrice' +PriceDefault = '0' +PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' +PriceMin = '0' +LimitDefault = 250000000 +LimitMax = 250000000 +LimitMultiplier = '4' +LimitTransfer = 21000 +EstimateLimit = false +BumpMin = '5 gwei' +BumpPercent = 20 +BumpThreshold = 3 +EIP1559DynamicFees = false +FeeCapDefault = '0' +TipCapDefault = '0' +TipCapMin = '0' + +[GasEstimator.BlockHistory] +BatchSize = 25 +BlockHistorySize = 8 +CheckInclusionBlocks = 12 +CheckInclusionPercentile = 90 +TransactionPercentile = 60 + +[GasEstimator.FeeHistory] +CacheTimeout = '10s' + +[HeadTracker] +HistoryDepth = 100 +MaxBufferSize = 3 +SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = false +PersistenceEnabled = false +PersistenceBatchSize = 100 + +[NodePool] +PollFailureThreshold = 5 +PollInterval = '10s' +SelectionMode = 'HighestHead' +SyncThreshold = 5 +LeaseDuration = '0s' +NodeIsSyncingEnabled = false +FinalizedBlockPollInterval = '5s' +EnforceRepeatableRead = true +DeathDeclarationDelay = '1m0s' +NewHeadsPollInterval = '0s' +VerifyChainID = true +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9234,7 +9439,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -9351,7 +9556,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -9465,7 +9670,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9580,7 +9785,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9695,7 +9900,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9810,7 +10015,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9926,7 +10131,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -10046,7 +10251,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10167,7 +10372,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10288,7 +10493,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10402,7 +10607,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -10522,7 +10727,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -10636,7 +10841,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '4s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10752,7 +10957,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10871,7 +11076,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -10990,7 +11195,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11105,7 +11310,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -11225,7 +11430,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -11344,7 +11549,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [NodePool.Errors] TerminallyUnderpriced = '(?:: |^)(max fee per gas less than block base fee|virtual machine entered unexpected state. (?:P|p)lease contact developers and provide transaction details that caused this error. Error description: (?:The operator included transaction with an unacceptable gas price|Assertion error: Fair pubdata price too high)) @@ -11448,7 +11653,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11564,7 +11769,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11683,7 +11888,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '4s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -11798,7 +12003,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11913,7 +12118,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -12029,7 +12234,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -12151,7 +12356,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -12273,7 +12478,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -12388,7 +12593,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12508,7 +12713,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12622,7 +12827,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12739,7 +12944,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12856,7 +13061,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12976,7 +13181,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -13096,7 +13301,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13214,7 +13419,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13329,7 +13534,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13444,7 +13649,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13559,7 +13764,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13674,7 +13879,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13794,7 +13999,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13913,7 +14118,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -14033,7 +14238,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -14147,7 +14352,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14261,7 +14466,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14380,7 +14585,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14494,7 +14699,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -14608,7 +14813,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -14727,7 +14932,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14842,7 +15047,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14957,7 +15162,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -15076,7 +15281,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15195,7 +15400,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15314,7 +15519,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15435,7 +15640,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15556,7 +15761,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15672,7 +15877,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15791,7 +15996,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '4s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15910,7 +16115,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16030,7 +16235,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16150,7 +16355,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16268,7 +16473,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16383,7 +16588,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16503,7 +16708,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -16622,7 +16827,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16741,7 +16946,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16861,7 +17066,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16976,7 +17181,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -17091,7 +17296,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -17309,7 +17514,7 @@ BackupLogPollerDelay=0 will disable Backup LogPoller (_not recommended for produ MinContractPayment = '10000000000000 juels' # Default ``` -MinContractPayment is the minimum payment in LINK required to execute a direct request job. This can be overridden on a per-job basis. +MinContractPayment is the minimum payment in LINK required to execute a direct request job. This can be overriden on a per-job basis. ### MinIncomingConfirmations @@ -18180,7 +18385,7 @@ EnforceRepeatableRead = true # Default DeathDeclarationDelay = '1m' # Default NewHeadsPollInterval = '0s' # Default VerifyChainID = true # Default -ExternalRequestMaxResponseSize = 50000 # Default +ExternalRequestMaxResponseSize = 1000000 # Default ``` The node pool manages multiple RPC endpoints. @@ -18315,7 +18520,7 @@ VerifyChainID enforces RPC Client ChainIDs to match configured ChainID ### ExternalRequestMaxResponseSize ```toml -ExternalRequestMaxResponseSize = 50000 # Default +ExternalRequestMaxResponseSize = 1000000 # Default ``` ExternalRequestMaxResponseSize sets the maximum allowed size (in bytes) for responses to external requests. @@ -19066,7 +19271,7 @@ Ensure the value is greater than the number of blocks that would be produced bet ComputeUnitLimitDefault = 200_000 # Default ``` -ComputeUnitLimitDefault is the compute units limit applied to transactions unless overridden during the txm enqueue +ComputeUnitLimitDefault is the compute units limit applied to transactions unless overriden during the txm enqueue ### EstimateComputeUnitLimit From 3d7c7ae94f2c07a31894f5dfe50706b6fbc60f5e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 29 Dec 2025 19:25:19 +0000 Subject: [PATCH 087/214] Changelog Update: New data found (#3324) * Data: Update changelog for new data items * nit --------- Co-authored-by: khadni <98668332+khadni@users.noreply.github.com> --- .github/scripts/data/baseline.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/scripts/data/baseline.json b/.github/scripts/data/baseline.json index d2e11056aca..df3b9633ce5 100644 --- a/.github/scripts/data/baseline.json +++ b/.github/scripts/data/baseline.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-21T21:03:33Z", + "timestamp": "2025-12-28T21:03:24Z", "knownIds": [ "aptos-apt-usd", "aptos-btc-usd", @@ -1511,6 +1511,7 @@ "hyperevm-khype-usd", "hyperevm-lhype-khype-exchange-rate", "hyperevm-lhype-sthype-exchange-rate", + "hyperevm-purr-usd", "hyperevm-sol-usd", "hyperevm-susde-usd", "hyperevm-thbill-usd", @@ -1519,6 +1520,7 @@ "hyperevm-usdc-usd", "hyperevm-usde-usd", "hyperevm-usdh-usd", + "hyperevm-usdhl-usd", "hyperevm-usdt-usd", "hyperevm-usol-usd", "hyperevm-usr-usd", @@ -1830,6 +1832,7 @@ "polygon-aave-eth", "polygon-aave-usd", "polygon-ada-usd", + "polygon-ageur-usd", "polygon-alcx-usd", "polygon-algo-usd", "polygon-amzn-usd", From 85d38b57de00efd16feeb577d204546eba1a01ef Mon Sep 17 00:00:00 2001 From: devin distefano <devin.distefano@smartcontract.com> Date: Wed, 31 Dec 2025 08:31:34 -0600 Subject: [PATCH 088/214] candlestick updates (#3330) --- public/changelog.json | 7 ++ .../reference/candlestick-api/index.mdx | 95 +++++++++++++++---- 2 files changed, 84 insertions(+), 18 deletions(-) diff --git a/public/changelog.json b/public/changelog.json index fe19c73d76a..0c2389ad9bb 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -358,6 +358,13 @@ } }, "data": [ + { + "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", diff --git a/src/content/data-streams/reference/candlestick-api/index.mdx b/src/content/data-streams/reference/candlestick-api/index.mdx index 0149066cd4a..64478531221 100644 --- a/src/content/data-streams/reference/candlestick-api/index.mdx +++ b/src/content/data-streams/reference/candlestick-api/index.mdx @@ -82,9 +82,9 @@ curl -X POST \ **`/api/v1/symbol_info`** -| Type | Description | Parameter(s) | -| :------- | :------------------------------------------------------- | :----------------------------------------------------------------------------------------------- | -| HTTP GET | Gets a list of all supported symbols on the environment. | <ul><li>`group` (optional): Filter symbols by group. Currently only supports "crypto".</li></ul> | +| Type | Description | Parameter(s) | +| :------- | :------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | +| HTTP GET | Gets a list of all supported symbols on the environment. | <ul><li>`group` (optional): Filter symbols by group. See [`/groups`](#get-list-of-supported-groups) for available groups.</li></ul> | ##### Sample request @@ -121,26 +121,85 @@ curl -X GET \ | `401` | `Unauthorized - Authorization header is required \|\| Invalid authorization header format \|\| token signature is invalid: signature is invalid \|\| ...` | The authorization header was missing or invalid. | | `500` | `Error - Something went wrong` | An unexpected server error occurred. | +### Get list of supported groups + +##### Endpoint + +**`/api/v1/groups`** + +| Type | Description | Parameter(s) | +| :------- | :-------------------------------------------------------------------------------------------------------------------------------------------- | :----------- | +| HTTP GET | Gets a list of all supported symbol types on the environment. Any group name returned can be used as a filter in the `/symbol_info` endpoint. | None | + +##### Sample request + +```bash +curl -X GET \ + -H "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \ + https://priceapi.testnet-dataengine.chain.link/api/v1/groups +``` + +##### Response + +- **Status**: `200` + + ```json + { + "s": "ok", + "d": { + "groups": [{ "id": "crypto" }, { "id": "equities" }, { "id": "forex" }, { "id": "equity" }] + } + } + ``` + + | Field | Type | Description | + | :------- | :------- | :--------------------------------- | + | `s` | `string` | The status of the request. | + | `d` | `object` | The data returned by the API call. | + | `groups` | `array` | Array of supported groups. | + +##### Error Responses + +| Status Code | Error Message | Description | +| :---------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------- | +| `401` | `Unauthorized - Authorization header is required \|\| Invalid authorization header format \|\| token signature is invalid: signature is invalid \|\| ...` | The authorization header was missing or invalid. | +| `500` | `Error - Something went wrong` | An unexpected server error occurred. | + ### Get candlestick data (column format) ##### Endpoint **`/api/v1/history`** -| Type | Description | Parameter(s) | -| :------- | :-------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| HTTP GET | Gets candlestick data in column format. | <ul><li>`symbol`: The symbol to query.</li><li>`resolution`: Resolution of the data (required but not used, use "1m").</li><li>`from`: Unix timestamp of the leftmost required bar (inclusive).</li><li>`to`: Unix timestamp of the rightmost required bar (inclusive).</li></ul> | +| Type | Description | Parameter(s) | +| :------- | :-------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| HTTP GET | Gets candlestick data in column format. | <ul><li>`symbol`: The symbol to query.</li><li>`resolution`: Resolution of the data. E.g., "1m". Must match [supported resolutions](#supported-resolutions).</li><li>`from`: Unix timestamp of the leftmost required bar (inclusive).</li><li>`to`: Unix timestamp of the rightmost required bar (inclusive).</li></ul> | + +#### Supported resolutions + +The resolution you provide must be within the supported boundaries for the given time window size: + +| Time window size | Supported resolutions | +| :------------------------ | :------------------------------- | +| 1 min - 24 hours | 1 minute - 24 hours (1m - 24h) | +| 1 - 5 days | 5 minutes - 5 days (5m - 5d) | +| 5 - 30 days | 30 minutes - 30 days (30m - 30d) | +| 30 - 90 days | 1 hour - 90 days (1h - 90d) | +| 90 - 180 days | 2 hours - 180 days (2h - 6M) | +| 180 - 365 days | 24 hours - 365 days (24h - 1y) | +| 365 - 1825 days (1-5 yrs) | 1 week - 5 years (1w - 5y) | +| Over 1825 days (> 5 yrs) | Over 1 month | -**Note**: The resolution of the data is currently based on the size of the time window: +Resolutions can be provided in the following units: -| Max time window size | Resolution of candles | -| :------------------- | :-------------------- | -| \<= 24 hours | 1 minute | -| \<= 5 days | 5 minutes | -| \<= 30 days | 30 minutes | -| \<= 90 days | 1 hour | -| \<= 6 months | 2 hours | -| > 6 months | 1 day | +| Name | Unit | Example | +| :------ | :--- | :------ | +| minutes | m | 5m | +| hours | h | 3h | +| days | d | 1d | +| weeks | w | 2w | +| months | M | 6M | +| years | y | 2y | ##### Sample request @@ -193,9 +252,9 @@ curl -X GET \ **`/api/v1/history/rows`** -| Type | Description | Parameter(s) | -| :------- | :----------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| HTTP GET | Gets candlestick data in row format. | <ul><li>`symbol`: The symbol to query.</li><li>`resolution`: Resolution of the data (required but not used, use "1m").</li><li>`from`: Unix timestamp of the leftmost required bar (inclusive).</li><li>`to`: Unix timestamp of the rightmost required bar (inclusive).</li></ul> | +| Type | Description | Parameter(s) | +| :------- | :----------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| HTTP GET | Gets candlestick data in row format. | <ul><li>`symbol`: The symbol to query.</li><li>`resolution`: Resolution of the data. E.g., "1m". Must match [supported resolutions](#supported-resolutions).</li><li>`from`: Unix timestamp of the leftmost required bar (inclusive).</li><li>`to`: Unix timestamp of the rightmost required bar (inclusive).</li></ul> | ##### Sample request From c397c2c9986aacb3e11448e2917c0764af611069 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Wed, 31 Dec 2025 09:58:26 -0500 Subject: [PATCH 089/214] increase nodejs heap memory for gh builds (#3331) --- .github/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4c2457d3c02..ec0f39ae127 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -164,6 +164,8 @@ jobs: - name: Build Site run: npm run build + env: + NODE_OPTIONS: '--max-old-space-size=8192' - name: Check Internal Links uses: lycheeverse/lychee-action@a8c4c7cb88f0c7386610c35eb25108e448569cb0 # v2.7.0 From b7e0a5b619983c01613464abd10edb99dbd4021d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 13:02:11 +0000 Subject: [PATCH 090/214] Bump preact from 10.28.0 to 10.28.1 in the ui-frameworks group (#3325) * Bump preact from 10.28.0 to 10.28.1 in the ui-frameworks group Bumps the ui-frameworks group with 1 update: [preact](https://github.com/preactjs/preact). Updates `preact` from 10.28.0 to 10.28.1 - [Release notes](https://github.com/preactjs/preact/releases) - [Commits](https://github.com/preactjs/preact/compare/10.28.0...10.28.1) --- updated-dependencies: - dependency-name: preact dependency-version: 10.28.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: ui-frameworks ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b0618d96c7..5181dffff97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ "nanostores": "^0.11.4", "next": "14.2.35", "pino": "^9.14.0", - "preact": "^10.28.0", + "preact": "^10.28.1", "react-instantsearch": "^7.21.0", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", @@ -31388,9 +31388,9 @@ "license": "MIT" }, "node_modules/preact": { - "version": "10.28.0", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.0.tgz", - "integrity": "sha512-rytDAoiXr3+t6OIP3WGlDd0ouCUG1iCWzkcY3++Nreuoi17y6T5i/zRhe6uYfoVcxq6YU+sBtJouuRDsq8vvqA==", + "version": "10.28.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.1.tgz", + "integrity": "sha512-u1/ixq/lVQI0CakKNvLDEcW5zfCjUQfZdK9qqWuIJtsezuyG6pk9TWj75GMuI/EzRSZB/VAE43sNWWZfiy8psw==", "license": "MIT", "funding": { "type": "opencollective", diff --git a/package.json b/package.json index 9d05c7ff816..7733aa4a9e9 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "nanostores": "^0.11.4", "next": "14.2.35", "pino": "^9.14.0", - "preact": "^10.28.0", + "preact": "^10.28.1", "react-instantsearch": "^7.21.0", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", From 92e0435408a5bf92068fb599d7a499040f0d921a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 13:09:08 +0000 Subject: [PATCH 091/214] Bump knip from 5.76.3 to 5.78.0 in the linting-tools group (#3326) * Bump knip from 5.76.3 to 5.78.0 in the linting-tools group Bumps the linting-tools group with 1 update: [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip). Updates `knip` from 5.76.3 to 5.78.0 - [Release notes](https://github.com/webpro-nl/knip/releases) - [Commits](https://github.com/webpro-nl/knip/commits/knip@5.78.0/packages/knip) --- updated-dependencies: - dependency-name: knip dependency-version: 5.78.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: linting-tools ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5181dffff97..0c2019c0880 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,7 +93,7 @@ "eslint-plugin-promise": "^6.1.1", "husky": "^9.1.7", "jest-yaml-transform": "^0.2.0", - "knip": "^5.76.3", + "knip": "^5.79.0", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", "pino-pretty": "^13.1.3", @@ -27225,9 +27225,9 @@ } }, "node_modules/knip": { - "version": "5.76.3", - "resolved": "https://registry.npmjs.org/knip/-/knip-5.76.3.tgz", - "integrity": "sha512-YLCCzOFzkuNgyL9LdrwFBstV9gpmvPCuolRzs9W++of0mtPH1D3ehE3M4okgayksgq7tWkkMAmyjrDrXxX6aAQ==", + "version": "5.79.0", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.79.0.tgz", + "integrity": "sha512-rcg+mNdqm6UiTuRVyy6UuuHw1n4ABMpNXDtrfGaCeUtJoRBAvAENIebr8YMtOz6XE7iVHZ8+rY7skgEtosczhQ==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index 7733aa4a9e9..41473ebae9f 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,7 @@ "eslint-plugin-promise": "^6.1.1", "husky": "^9.1.7", "jest-yaml-transform": "^0.2.0", - "knip": "^5.76.3", + "knip": "^5.79.0", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", "pino-pretty": "^13.1.3", From 0ccd67aa15e1d78790c085bb9c360a96e6d7da79 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 13:16:49 +0000 Subject: [PATCH 092/214] Bump @astro-community/astro-embed-youtube from 0.5.9 to 0.5.10 in the astro-framework group (#3334) * Bump @astro-community/astro-embed-youtube in the astro-framework group Bumps the astro-framework group with 1 update: [@astro-community/astro-embed-youtube](https://github.com/delucis/astro-embed/tree/HEAD/packages/astro-embed-youtube). Updates `@astro-community/astro-embed-youtube` from 0.5.9 to 0.5.10 - [Release notes](https://github.com/delucis/astro-embed/releases) - [Changelog](https://github.com/delucis/astro-embed/blob/main/packages/astro-embed-youtube/CHANGELOG.md) - [Commits](https://github.com/delucis/astro-embed/commits/@astro-community/astro-embed-youtube@0.5.10/packages/astro-embed-youtube) --- updated-dependencies: - dependency-name: "@astro-community/astro-embed-youtube" dependency-version: 0.5.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: astro-framework ... Signed-off-by: dependabot[bot] <support@github.com> * Bump @astro-community/astro-embed-youtube in the astro-framework group Bumps the astro-framework group with 1 update: [@astro-community/astro-embed-youtube](https://github.com/delucis/astro-embed/tree/HEAD/packages/astro-embed-youtube). Updates `@astro-community/astro-embed-youtube` from 0.5.9 to 0.5.10 - [Release notes](https://github.com/delucis/astro-embed/releases) - [Changelog](https://github.com/delucis/astro-embed/blob/main/packages/astro-embed-youtube/CHANGELOG.md) - [Commits](https://github.com/delucis/astro-embed/commits/@astro-community/astro-embed-youtube@0.5.10/packages/astro-embed-youtube) --- updated-dependencies: - dependency-name: "@astro-community/astro-embed-youtube" dependency-version: 0.5.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: astro-framework ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 11 ++++------- package.json | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0c2019c0880..4ee5cf5c28c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@11ty/eleventy-fetch": "^4.0.1", - "@astro-community/astro-embed-youtube": "^0.5.9", + "@astro-community/astro-embed-youtube": "^0.5.10", "@astrojs/mdx": "^4.3.13", "@astrojs/partytown": "^2.1.4", "@astrojs/preact": "^4.1.3", @@ -500,15 +500,12 @@ "license": "MIT" }, "node_modules/@astro-community/astro-embed-youtube": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@astro-community/astro-embed-youtube/-/astro-embed-youtube-0.5.9.tgz", - "integrity": "sha512-8Uk2SKbyZVb+jxwqSAMoEpQo+063XYwCI3yRy9cbkyHpu09mDabGZNTF5XrL8CKr3NtR5haBkeYK/kSuKUkJ/g==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@astro-community/astro-embed-youtube/-/astro-embed-youtube-0.5.10.tgz", + "integrity": "sha512-hVlx77KQLjKzElVQnrU5znQ5/E60keVSAPrhuWvQQHuqva5auJtt8YBpOThkwDMuEKXjQybEF1/3C07RZ8MAOQ==", "license": "MIT", "dependencies": { "lite-youtube-embed": "^0.3.4" - }, - "peerDependencies": { - "astro": "^2.0.0 || ^3.0.0-beta || ^4.0.0-beta || ^5.0.0-beta" } }, "node_modules/@astrojs/compiler": { diff --git a/package.json b/package.json index 41473ebae9f..522e263c500 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ }, "dependencies": { "@11ty/eleventy-fetch": "^4.0.1", - "@astro-community/astro-embed-youtube": "^0.5.9", + "@astro-community/astro-embed-youtube": "^0.5.10", "@astrojs/mdx": "^4.3.13", "@astrojs/partytown": "^2.1.4", "@astrojs/preact": "^4.1.3", From 2be09869098a0deed9bac29728b79b29a5999246 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 13:25:54 +0000 Subject: [PATCH 093/214] Bump react-instantsearch from 7.21.0 to 7.22.1 in the documentation group (#3335) * Bump react-instantsearch in the documentation group Bumps the documentation group with 1 update: [react-instantsearch](https://github.com/algolia/instantsearch). Updates `react-instantsearch` from 7.21.0 to 7.22.1 - [Release notes](https://github.com/algolia/instantsearch/releases) - [Commits](https://github.com/algolia/instantsearch/compare/react-instantsearch@7.21.0...react-instantsearch@7.22.1) --- updated-dependencies: - dependency-name: react-instantsearch dependency-version: 7.22.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: documentation ... Signed-off-by: dependabot[bot] <support@github.com> * nit --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Amine E. <aelmanaa@users.noreply.github.com> Co-authored-by: aelmanaa <aelmanaa@gmail.com> --- package-lock.json | 308 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 154 insertions(+), 156 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ee5cf5c28c..a4eee44542c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,7 @@ "next": "14.2.35", "pino": "^9.14.0", "preact": "^10.28.1", - "react-instantsearch": "^7.21.0", + "react-instantsearch": "^7.22.1", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "rehype-wrap-all": "^1.1.0", @@ -143,13 +143,13 @@ "license": "MIT" }, "node_modules/@ai-sdk/gateway": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.21.tgz", - "integrity": "sha512-BwV7DU/lAm3Xn6iyyvZdWgVxgLu3SNXzl5y57gMvkW4nGhAOV5269IrJzQwGt03bb107sa6H6uJwWxc77zXoGA==", + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.24.tgz", + "integrity": "sha512-mflk80YF8hj8vrF9e1IHhovGKC1ubX+sY88pesSk3pUiXfH5VPO8dgzNnxjwsqsCZrnkHcztxS5cSl4TzSiEuA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.19", + "@ai-sdk/provider": "2.0.1", + "@ai-sdk/provider-utils": "3.0.20", "@vercel/oidc": "3.0.5" }, "engines": { @@ -169,9 +169,9 @@ } }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.1.tgz", + "integrity": "sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -181,12 +181,12 @@ } }, "node_modules/@ai-sdk/provider-utils": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.19.tgz", - "integrity": "sha512-W41Wc9/jbUVXVwCN/7bWa4IKe8MtxO3EyA0Hfhx6grnmiYlCvpI8neSYWFE0zScXJkgA/YK3BRybzgyiXuu6JA==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.20.tgz", + "integrity": "sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider": "2.0.1", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6" }, @@ -198,120 +198,120 @@ } }, "node_modules/@algolia/abtesting": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.12.0.tgz", - "integrity": "sha512-EfW0bfxjPs+C7ANkJDw2TATntfBKsFiy7APh+KO0pQ8A6HYa5I0NjFuCGCXWfzzzLXNZta3QUl3n5Kmm6aJo9Q==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.12.2.tgz", + "integrity": "sha512-oWknd6wpfNrmRcH0vzed3UPX0i17o4kYLM5OMITyMVM2xLgaRbIafoxL0e8mcrNNb0iORCJA0evnNDKRYth5WQ==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-abtesting": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.46.0.tgz", - "integrity": "sha512-eG5xV8rujK4ZIHXrRshvv9O13NmU/k42Rnd3w43iKH5RaQ2zWuZO6Q7XjaoJjAFVCsJWqRbXzbYyPGrbF3wGNg==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.46.2.tgz", + "integrity": "sha512-oRSUHbylGIuxrlzdPA8FPJuwrLLRavOhAmFGgdAvMcX47XsyM+IOGa9tc7/K5SPvBqn4nhppOCEz7BrzOPWc4A==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.46.0.tgz", - "integrity": "sha512-AYh2uL8IUW9eZrbbT+wZElyb7QkkeV3US2NEKY7doqMlyPWE8lErNfkVN1NvZdVcY4/SVic5GDbeDz2ft8YIiQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.46.2.tgz", + "integrity": "sha512-EPBN2Oruw0maWOF4OgGPfioTvd+gmiNwx0HmD9IgmlS+l75DatcBkKOPNJN+0z3wBQWUO5oq602ATxIfmTQ8bA==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.46.0.tgz", - "integrity": "sha512-0emZTaYOeI9WzJi0TcNd2k3SxiN6DZfdWc2x2gHt855Jl9jPUOzfVTL6gTvCCrOlT4McvpDGg5nGO+9doEjjig==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.46.2.tgz", + "integrity": "sha512-Hj8gswSJNKZ0oyd0wWissqyasm+wTz1oIsv5ZmLarzOZAp3vFEda8bpDQ8PUhO+DfkbiLyVnAxsPe4cGzWtqkg==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.46.0.tgz", - "integrity": "sha512-wrBJ8fE+M0TDG1As4DDmwPn2TXajrvmvAN72Qwpuv8e2JOKNohF7+JxBoF70ZLlvP1A1EiH8DBu+JpfhBbNphQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.46.2.tgz", + "integrity": "sha512-6dBZko2jt8FmQcHCbmNLB0kCV079Mx/DJcySTL3wirgDBUH7xhY1pOuUTLMiGkqM5D8moVZTvTdRKZUJRkrwBA==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.46.0.tgz", - "integrity": "sha512-LnkeX4p0ENt0DoftDJJDzQQJig/sFQmD1eQifl/iSjhUOGUIKC/7VTeXRcKtQB78naS8njUAwpzFvxy1CDDXDQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.46.2.tgz", + "integrity": "sha512-1waE2Uqh/PHNeDXGn/PM/WrmYOBiUGSVxAWqiJIj73jqPqvfzZgzdakHscIVaDl6Cp+j5dwjsZ5LCgaUr6DtmA==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.0.tgz", - "integrity": "sha512-aF9tc4ex/smypXw+W3lBPB1jjKoaGHpZezTqofvDOI/oK1dR2sdTpFpK2Ru+7IRzYgwtRqHF3znmTlyoNs9dpA==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.2.tgz", + "integrity": "sha512-EgOzTZkyDcNL6DV0V/24+oBJ+hKo0wNgyrOX/mePBM9bc9huHxIY2352sXmoZ648JXXY2x//V1kropF/Spx83w==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", - "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.2.tgz", + "integrity": "sha512-ZsOJqu4HOG5BlvIFnMU0YKjQ9ZI6r3C31dg2jk5kMWPSdhJpYL9xa5hEe7aieE+707dXeMI4ej3diy6mXdZpgA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" @@ -324,84 +324,84 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.46.0.tgz", - "integrity": "sha512-2LT0/Z+/sFwEpZLH6V17WSZ81JX2uPjgvv5eNlxgU7rPyup4NXXfuMbtCJ+6uc4RO/LQpEJd3Li59ke3wtyAsA==", + "version": "1.46.2", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.46.2.tgz", + "integrity": "sha512-1Uw2OslTWiOFDtt83y0bGiErJYy5MizadV0nHnOoHFWMoDqWW0kQoMFI65pXqRSkVvit5zjXSLik2xMiyQJDWQ==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.46.0.tgz", - "integrity": "sha512-uivZ9wSWZ8mz2ZU0dgDvQwvVZV8XBv6lYBXf8UtkQF3u7WeTqBPeU8ZoeTyLpf0jAXCYOvc1mAVmK0xPLuEwOQ==", + "version": "1.46.2", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.46.2.tgz", + "integrity": "sha512-xk9f+DPtNcddWN6E7n1hyNNsATBCHIqAvVGG2EAGHJc4AFYL18uM/kMTiOKXE/LKDPyy1JhIerrh9oYb7RBrgw==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.46.0.tgz", - "integrity": "sha512-O2BB8DuySuddgOAbhyH4jsGbL+KyDGpzJRtkDZkv091OMomqIA78emhhMhX9d/nIRrzS1wNLWB/ix7Hb2eV5rg==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.46.2.tgz", + "integrity": "sha512-NApbTPj9LxGzNw4dYnZmj2BoXiAc8NmbbH6qBNzQgXklGklt/xldTvu+FACN6ltFsTzoNU6j2mWNlHQTKGC5+Q==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/client-common": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/client-common": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.0.tgz", - "integrity": "sha512-eW6xyHCyYrJD0Kjk9Mz33gQ40LfWiEA51JJTVfJy3yeoRSw/NXhAL81Pljpa0qslTs6+LO/5DYPZddct6HvISQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.2.tgz", + "integrity": "sha512-ekotpCwpSp033DIIrsTpYlGUCF6momkgupRV/FA3m62SreTSZUKjgK6VTNyG7TtYfq9YFm/pnh65bATP/ZWJEg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0" + "@algolia/client-common": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.46.0.tgz", - "integrity": "sha512-Vn2+TukMGHy4PIxmdvP667tN/MhS7MPT8EEvEhS6JyFLPx3weLcxSa1F9gVvrfHWCUJhLWoMVJVB2PT8YfRGcw==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.46.2.tgz", + "integrity": "sha512-gKE+ZFi/6y7saTr34wS0SqYFDcjHW4Wminv8PDZEi0/mE99+hSrbKgJWxo2ztb5eqGirQTgIh1AMVacGGWM1iw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0" + "@algolia/client-common": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.46.0.tgz", - "integrity": "sha512-xaqXyna5yBZ+r1SJ9my/DM6vfTqJg9FJgVydRJ0lnO+D5NhqGW/qaRG/iBGKr/d4fho34el6WakV7BqJvrl/HQ==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.46.2.tgz", + "integrity": "sha512-ciPihkletp7ttweJ8Zt+GukSVLp2ANJHU+9ttiSxsJZThXc4Y2yJ8HGVWesW5jN1zrsZsezN71KrMx/iZsOYpg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.0" + "@algolia/client-common": "5.46.2" }, "engines": { "node": ">= 14.0.0" @@ -14337,9 +14337,9 @@ "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "license": "MIT" }, "node_modules/@supabase/auth-js": { @@ -16456,14 +16456,14 @@ } }, "node_modules/ai": { - "version": "5.0.113", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.113.tgz", - "integrity": "sha512-26vivpSO/mzZj0k1Si2IpsFspp26ttQICHRySQiMrtWcRd5mnJMX2a8sG28vmZ38C+JUn1cWmfZrsLMxkSMw9g==", + "version": "5.0.117", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.117.tgz", + "integrity": "sha512-uE6HNkdSwxbeHGKP/YbvapwD8fMOpj87wyfT9Z00pbzOh2fpnw5acak/4kzU00SX2vtI9K0uuy+9Tf9ytw5RwA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/gateway": "2.0.21", - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.19", + "@ai-sdk/gateway": "2.0.24", + "@ai-sdk/provider": "2.0.1", + "@ai-sdk/provider-utils": "3.0.20", "@opentelemetry/api": "1.9.0" }, "engines": { @@ -16516,35 +16516,35 @@ } }, "node_modules/algoliasearch": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", - "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.2.tgz", + "integrity": "sha512-qqAXW9QvKf2tTyhpDA4qXv1IfBwD2eduSW6tUEBFIfCeE9gn9HQ9I5+MaKoenRuHrzk5sQoNh1/iof8mY7uD6Q==", "license": "MIT", "peer": true, "dependencies": { - "@algolia/abtesting": "1.12.0", - "@algolia/client-abtesting": "5.46.0", - "@algolia/client-analytics": "5.46.0", - "@algolia/client-common": "5.46.0", - "@algolia/client-insights": "5.46.0", - "@algolia/client-personalization": "5.46.0", - "@algolia/client-query-suggestions": "5.46.0", - "@algolia/client-search": "5.46.0", - "@algolia/ingestion": "1.46.0", - "@algolia/monitoring": "1.46.0", - "@algolia/recommend": "5.46.0", - "@algolia/requester-browser-xhr": "5.46.0", - "@algolia/requester-fetch": "5.46.0", - "@algolia/requester-node-http": "5.46.0" + "@algolia/abtesting": "1.12.2", + "@algolia/client-abtesting": "5.46.2", + "@algolia/client-analytics": "5.46.2", + "@algolia/client-common": "5.46.2", + "@algolia/client-insights": "5.46.2", + "@algolia/client-personalization": "5.46.2", + "@algolia/client-query-suggestions": "5.46.2", + "@algolia/client-search": "5.46.2", + "@algolia/ingestion": "1.46.2", + "@algolia/monitoring": "1.46.2", + "@algolia/recommend": "5.46.2", + "@algolia/requester-browser-xhr": "5.46.2", + "@algolia/requester-fetch": "5.46.2", + "@algolia/requester-node-http": "5.46.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.1.tgz", - "integrity": "sha512-CAlCxm4fYBXtvc5MamDzP6Svu8rW4z9me4DCBY1rQ2UDJ0u0flWmusQ8M3nOExZsLLRcUwUPoRAPMrhzOG3erw==", + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.27.0.tgz", + "integrity": "sha512-eNYchRerbsvk2doHOMfdS1/B6Tm70oGtu8mzQlrNzbCeQ8p1MjCW8t/BL6iZ5PD+cL5NNMgTMyMnmiXZ1sgmNw==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -22854,9 +22854,9 @@ "license": "MIT" }, "node_modules/instantsearch-ui-components": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/instantsearch-ui-components/-/instantsearch-ui-components-0.15.2.tgz", - "integrity": "sha512-DgNdAqATp/ohcCWAs1tp5yZ7ojeagW7hnojuvbWXDkPoOGxLC70wFRYS5jm/nv0evVrkepVbOWYFr3iVFGY8Eg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/instantsearch-ui-components/-/instantsearch-ui-components-0.16.0.tgz", + "integrity": "sha512-3CoUlEqiFgQ1cd/y90aPi355JVMY757XSrpojC1m8blLPW0nokx4AwH723dHUGU2MtvI0U49dB2F5EGUS0FZkA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", @@ -22876,9 +22876,9 @@ } }, "node_modules/instantsearch.js": { - "version": "4.85.2", - "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.85.2.tgz", - "integrity": "sha512-GNrsiD7JRaXOBQ+fT0zPjBKk9hJaZMe1Cr80ZcW+ZgRcGCZF+DRT/DStDcVqc3BrWnOzbebS/d+Ffle4gZ3gNQ==", + "version": "4.86.1", + "resolved": "https://registry.npmjs.org/instantsearch.js/-/instantsearch.js-4.86.1.tgz", + "integrity": "sha512-ETazkxnWj3aOsHgQem1JQ4roqhfpkA32CZEW+ccP+rQqSbO4sCEEMJTy1A1BMiTD1iCoBFWD+x+8Bx73DOm/Gg==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1", @@ -22887,12 +22887,12 @@ "@types/hogan.js": "^3.0.0", "@types/qs": "^6.5.3", "ai": "^5.0.18", - "algoliasearch-helper": "3.26.1", + "algoliasearch-helper": "3.27.0", "hogan.js": "^3.0.2", "htm": "^3.0.0", - "instantsearch-ui-components": "0.15.2", + "instantsearch-ui-components": "0.16.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", @@ -30183,7 +30183,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" @@ -31740,10 +31739,13 @@ } }, "node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, "engines": { "node": ">=0.6" }, @@ -32029,15 +32031,15 @@ } }, "node_modules/react-instantsearch": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/react-instantsearch/-/react-instantsearch-7.21.0.tgz", - "integrity": "sha512-GnUgxqXfTU9/0+ZAnmnCME4zJm2k/xNWwUhp+gvTiMVtDzK/d7VkajvPvggNjZ+XbZBvI4rQBTx/9RWo253w0Q==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/react-instantsearch/-/react-instantsearch-7.22.1.tgz", + "integrity": "sha512-sTZ8z2JcSyveP0RmClmP9KFkJMQ9ZZmZKI05uSmfx7fP21N8Ry9CCyn2EvalGFm2gTPaB7VMFZrC9q7HXvG9wA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", - "instantsearch-ui-components": "0.15.2", - "instantsearch.js": "4.85.2", - "react-instantsearch-core": "7.21.0" + "instantsearch-ui-components": "0.16.0", + "instantsearch.js": "4.86.1", + "react-instantsearch-core": "7.22.1" }, "peerDependencies": { "algoliasearch": ">= 3.1 < 6", @@ -32046,15 +32048,15 @@ } }, "node_modules/react-instantsearch-core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-7.21.0.tgz", - "integrity": "sha512-1IXRoyYxiIHhNQZC3U0I7YEs6zlG5NmlrBeU1t2b1Nce2BiYZmFBShVeGyGRA0Zw52j9bv5Gy84jmg/VffmxCg==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-7.22.1.tgz", + "integrity": "sha512-fumuQbLKzEnZ3pX9LHXCbxfol8OiStWa63ujDin9SMb2k6cCMXbkuRC/eRe1EDLYPSfkVAKV+r6elOwT6fTVYQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", "ai": "^5.0.18", - "algoliasearch-helper": "3.26.1", - "instantsearch.js": "4.85.2", + "algoliasearch-helper": "3.27.0", + "instantsearch.js": "4.86.1", "use-sync-external-store": "^1.0.0", "zod": "^3.25.76 || ^4", "zod-to-json-schema": "3.24.6" @@ -33888,7 +33890,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", @@ -33908,7 +33909,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", @@ -33925,7 +33925,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", @@ -33944,7 +33943,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", diff --git a/package.json b/package.json index 522e263c500..ef981b9461d 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "next": "14.2.35", "pino": "^9.14.0", "preact": "^10.28.1", - "react-instantsearch": "^7.21.0", + "react-instantsearch": "^7.22.1", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "rehype-wrap-all": "^1.1.0", From 3f4ebb657aab74115629abbc16a2532512c21dbb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 14:41:15 +0100 Subject: [PATCH 094/214] Changelog Update: New data found (#3333) * Data: Update changelog for new data items * nit formatting * fix int link --------- Co-authored-by: khadni <98668332+khadni@users.noreply.github.com> --- .github/scripts/data/baseline.json | 4 +- public/changelog.json | 26 + src/content/chainlink-nodes/llms-full.txt | 451 +++++++++++++----- .../using-write-report-helpers.mdx | 2 +- src/content/cre/llms-full-go.txt | 2 +- src/content/data-streams/llms-full.txt | 95 +++- 6 files changed, 436 insertions(+), 144 deletions(-) diff --git a/.github/scripts/data/baseline.json b/.github/scripts/data/baseline.json index df3b9633ce5..c002c4a4089 100644 --- a/.github/scripts/data/baseline.json +++ b/.github/scripts/data/baseline.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-28T21:03:24Z", + "timestamp": "2026-01-04T21:03:29Z", "knownIds": [ "aptos-apt-usd", "aptos-btc-usd", @@ -1898,6 +1898,7 @@ "polygon-grt-usd", "polygon-hbar-usd", "polygon-icp-usd", + "polygon-idr-usd", "polygon-ils-usd", "polygon-ilv-eth", "polygon-inr-usd", @@ -1976,6 +1977,7 @@ "polygon-yeth-eth-exchange-rate", "polygon-yfi-eth", "polygon-yfi-usd", + "polygon-zar-usd", "polygon-zec-usd", "polygonkatana-ausd-usd", "polygonkatana-btc-usd", diff --git a/public/changelog.json b/public/changelog.json index 0c2389ad9bb..de608813ef5 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -358,6 +358,32 @@ } }, "data": [ + { + "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", diff --git a/src/content/chainlink-nodes/llms-full.txt b/src/content/chainlink-nodes/llms-full.txt index 159ea772dce..d2cab9f00d9 100644 --- a/src/content/chainlink-nodes/llms-full.txt +++ b/src/content/chainlink-nodes/llms-full.txt @@ -4434,6 +4434,7 @@ MaxBatchSize = 50 # Default SendInterval = '500ms' # Default SendTimeout = '10s' # Default UseBatchSend = true # Default +ChipIngressEnabled = false # Default ``` ### UniConn @@ -4492,6 +4493,14 @@ UseBatchSend = true # Default UseBatchSend toggles sending telemetry to the ingress server using the batch client. +### ChipIngressEnabled + +```toml +ChipIngressEnabled = false # Default +``` + +ChipIngressEnabled enables sending telemetry to CHIP Ingress. + ## TelemetryIngress.Endpoints ```toml @@ -5360,6 +5369,7 @@ AllowNoBootstrappers = false # Default DefaultTransactionQueueDepth = 1 # Default SimulateTransactions = false # Default TraceLogging = false # Default +SampleTelemetry = false # Default KeyValueStoreRootDir = '~/.chainlink-data' # Default ``` @@ -5509,6 +5519,14 @@ TraceLogging = false # Default TraceLogging enables trace level logging. +### SampleTelemetry + +```toml +SampleTelemetry = false # Default +``` + +SampleTelemetry enables telemetry sampling. + ### KeyValueStoreRootDir ```toml @@ -5652,6 +5670,7 @@ IncomingMessageBufferSize = 10 # Default OutgoingMessageBufferSize = 10 # Default PeerID = '12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw' # Example TraceLogging = false # Default +EnableExperimentalRageP2P = false # Default ``` P2P has a versioned networking stack. Currently only `[P2P.V2]` is supported. @@ -5696,6 +5715,14 @@ TraceLogging = false # Default TraceLogging enables trace level logging. +### EnableExperimentalRageP2P + +```toml +EnableExperimentalRageP2P = false # Default +``` + +EnableExperimentalRageP2P needs to be enabled for ocr3.1 components + ## P2P.V2 ```toml @@ -6076,6 +6103,7 @@ IncomingMessageBufferSize = 10 # Default OutgoingMessageBufferSize = 10 # Default PeerID = '12D3KooWMoejJznyDuEk5aX6GvbjaG12UzeornPCBNzMRqdwrFJw' # Example TraceLogging = false # Default +EnableExperimentalRageP2P = false # Default ``` ### IncomingMessageBufferSize @@ -6117,6 +6145,14 @@ TraceLogging = false # Default TraceLogging enables trace level logging. +### EnableExperimentalRageP2P + +```toml +EnableExperimentalRageP2P = false # Default +``` + +EnableExperimentalRageP2P needs to be enabled for ocr3.1 components + ## Capabilities.Peering.V2 ```toml @@ -6974,11 +7010,17 @@ InsecureConnection = false # Default TraceSampleRatio = 0.01 # Default EmitterBatchProcessor = true # Default EmitterExportTimeout = '1s' # Default +AuthHeadersTTL = '0s' # Default ChipIngressEndpoint = '' # Default ChipIngressInsecureConnection = false # Default HeartbeatInterval = '1s' # Default LogLevel = "info" # Default LogStreamingEnabled = false # Default +LogBatchProcessor = true # Default +LogExportTimeout = '1s' # Default +LogExportMaxBatchSize = 512 # Default +LogExportInterval = '1s' # Default +LogMaxQueueSize = 2048 # Default ``` Telemetry holds OTEL settings. @@ -7043,6 +7085,15 @@ EmitterExportTimeout = '1s' # Default EmitterExportTimeout sets timeout for exporting telemetry events +### AuthHeadersTTL + +```toml +AuthHeadersTTL = '0s' # Default +``` + +AuthHeadersTTL is the time-to-live for rotating authentication headers used with telemetry endpoints. +Set to 0 to use static authentication headers. + ### ChipIngressEndpoint ```toml @@ -7083,6 +7134,46 @@ LogStreamingEnabled = false # Default LogStreamingEnabled enables log streaming to the OTel log exporter +### LogBatchProcessor + +```toml +LogBatchProcessor = true # Default +``` + +LogBatchProcessor enables batching for telemetry logs + +### LogExportTimeout + +```toml +LogExportTimeout = '1s' # Default +``` + +LogExportTimeout sets timeout for exporting telemetry logs + +### LogExportMaxBatchSize + +```toml +LogExportMaxBatchSize = 512 # Default +``` + +LogExportMaxBatchSize sets the maximum batch size of every batch export + +### LogExportInterval + +```toml +LogExportInterval = '1s' # Default +``` + +LogExportInterval sets the maximum duration between batched exports + +### LogMaxQueueSize + +```toml +LogMaxQueueSize = 2048 # Default +``` + +LogMaxQueueSize sets the maximum queue size used by the batcher + ## Telemetry.ResourceAttributes ```toml @@ -7365,7 +7456,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -7480,7 +7571,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -7595,7 +7686,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -7710,7 +7801,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -7830,7 +7921,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -7946,7 +8037,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8061,7 +8152,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8175,7 +8266,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8289,7 +8380,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8404,7 +8495,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8519,7 +8610,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8635,7 +8726,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8750,7 +8841,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8865,7 +8956,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -8985,7 +9076,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9100,7 +9191,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9215,7 +9306,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9330,7 +9421,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9450,7 +9541,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9567,7 +9658,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -9684,7 +9775,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -9804,7 +9895,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -9922,7 +10013,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10041,7 +10132,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10156,7 +10247,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10270,7 +10361,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10390,7 +10481,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -10509,7 +10600,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10625,7 +10716,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10741,7 +10832,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10860,7 +10951,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -10979,7 +11070,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -11099,7 +11190,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11219,7 +11310,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -11334,7 +11425,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11450,7 +11541,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -11570,7 +11661,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -11684,7 +11775,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11804,7 +11895,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -11921,7 +12012,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -12037,7 +12128,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -12153,7 +12244,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -12268,7 +12359,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12382,7 +12473,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12502,7 +12593,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12622,7 +12713,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -12736,7 +12827,7 @@ EnforceRepeatableRead = false DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -12856,7 +12947,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -12976,7 +13067,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -13091,7 +13182,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13206,7 +13297,121 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 + +[OCR] +ContractConfirmations = 4 +ContractTransmitterTransmitTimeout = '10s' +DatabaseTimeout = '10s' +DeltaCOverride = '168h0m0s' +DeltaCJitterOverride = '1h0m0s' +ObservationGracePeriod = '1s' + +[OCR2] +[OCR2.Automation] +GasLimit = 5400000 + +[Workflow] +GasLimitDefault = 400000 +TxAcceptanceState = 2 +PollPeriod = '2s' +AcceptanceTimeout = '30s' +``` + +### Private Testnet Andesite (2024) + +```toml +AutoCreateKey = true +BlockBackfillDepth = 10 +BlockBackfillSkip = false +FinalityDepth = 1 +SafeDepth = 0 +FinalityTagEnabled = false +SafeTagSupported = true +LogBackfillBatchSize = 1000 +LogPollInterval = '15s' +LogKeepBlocksDepth = 100000 +LogPrunePageSize = 0 +BackupLogPollerBlockDelay = 100 +MinIncomingConfirmations = 3 +MinContractPayment = '0.00001 link' +NonceAutoSync = true +NoNewHeadsThreshold = '3m0s' +LogBroadcasterEnabled = false +RPCDefaultBatchSize = 250 +RPCBlockQueryDelay = 1 +FinalizedBlockOffset = 0 +NoNewFinalizedHeadsThreshold = '0s' + +[Transactions] +Enabled = true +ForwardersEnabled = false +MaxInFlight = 16 +MaxQueued = 250 +ReaperInterval = '1h0m0s' +ReaperThreshold = '168h0m0s' +ResendAfterThreshold = '1m0s' +ConfirmationTimeout = '1m0s' + +[Transactions.AutoPurge] +Enabled = false + +[Transactions.TransactionManagerV2] +Enabled = false + +[BalanceMonitor] +Enabled = false + +[GasEstimator] +Mode = 'SuggestedPrice' +PriceDefault = '0' +PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether' +PriceMin = '0' +LimitDefault = 250000000 +LimitMax = 250000000 +LimitMultiplier = '4' +LimitTransfer = 21000 +EstimateLimit = false +BumpMin = '5 gwei' +BumpPercent = 20 +BumpThreshold = 3 +EIP1559DynamicFees = false +FeeCapDefault = '0' +TipCapDefault = '0' +TipCapMin = '0' + +[GasEstimator.BlockHistory] +BatchSize = 25 +BlockHistorySize = 8 +CheckInclusionBlocks = 12 +CheckInclusionPercentile = 90 +TransactionPercentile = 60 + +[GasEstimator.FeeHistory] +CacheTimeout = '10s' + +[HeadTracker] +HistoryDepth = 100 +MaxBufferSize = 3 +SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = false +PersistenceEnabled = false +PersistenceBatchSize = 100 + +[NodePool] +PollFailureThreshold = 5 +PollInterval = '10s' +SelectionMode = 'HighestHead' +SyncThreshold = 5 +LeaseDuration = '0s' +NodeIsSyncingEnabled = false +FinalizedBlockPollInterval = '5s' +EnforceRepeatableRead = true +DeathDeclarationDelay = '1m0s' +NewHeadsPollInterval = '0s' +VerifyChainID = true +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13326,7 +13531,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -13443,7 +13648,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -13557,7 +13762,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13672,7 +13877,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13787,7 +13992,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -13902,7 +14107,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14018,7 +14223,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -14138,7 +14343,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14259,7 +14464,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14380,7 +14585,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14494,7 +14699,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -14614,7 +14819,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -14728,7 +14933,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '4s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14844,7 +15049,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -14963,7 +15168,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15082,7 +15287,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15197,7 +15402,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -15317,7 +15522,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -15436,7 +15641,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [NodePool.Errors] TerminallyUnderpriced = '(?:: |^)(max fee per gas less than block base fee|virtual machine entered unexpected state. (?:P|p)lease contact developers and provide transaction details that caused this error. Error description: (?:The operator included transaction with an unacceptable gas price|Assertion error: Fair pubdata price too high)) @@ -15540,7 +15745,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15656,7 +15861,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -15775,7 +15980,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '4s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -15890,7 +16095,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -16005,7 +16210,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -16121,7 +16326,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -16243,7 +16448,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -16365,7 +16570,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -16480,7 +16685,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16600,7 +16805,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16714,7 +16919,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16831,7 +17036,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -16948,7 +17153,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -17068,7 +17273,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -17188,7 +17393,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -17306,7 +17511,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -17421,7 +17626,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -17536,7 +17741,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -17651,7 +17856,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -17766,7 +17971,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -17886,7 +18091,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -18005,7 +18210,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -18125,7 +18330,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -18239,7 +18444,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -18353,7 +18558,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -18472,7 +18677,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -18586,7 +18791,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -18700,7 +18905,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -18819,7 +19024,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -18934,7 +19139,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -19049,7 +19254,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -19168,7 +19373,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -19287,7 +19492,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -19406,7 +19611,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -19527,7 +19732,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -19648,7 +19853,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -19764,7 +19969,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -19883,7 +20088,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '4s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -20002,7 +20207,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -20122,7 +20327,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -20242,7 +20447,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -20360,7 +20565,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -20475,7 +20680,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -20595,7 +20800,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 1 @@ -20714,7 +20919,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -20833,7 +21038,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -20953,7 +21158,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -21068,7 +21273,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -21183,7 +21388,7 @@ EnforceRepeatableRead = true DeathDeclarationDelay = '1m0s' NewHeadsPollInterval = '0s' VerifyChainID = true -ExternalRequestMaxResponseSize = 50000 +ExternalRequestMaxResponseSize = 1000000 [OCR] ContractConfirmations = 4 @@ -21401,7 +21606,7 @@ BackupLogPollerDelay=0 will disable Backup LogPoller (*not recommended for produ MinContractPayment = '10000000000000 juels' # Default ``` -MinContractPayment is the minimum payment in LINK required to execute a direct request job. This can be overridden on a per-job basis. +MinContractPayment is the minimum payment in LINK required to execute a direct request job. This can be overriden on a per-job basis. ### MinIncomingConfirmations @@ -22272,7 +22477,7 @@ EnforceRepeatableRead = true # Default DeathDeclarationDelay = '1m' # Default NewHeadsPollInterval = '0s' # Default VerifyChainID = true # Default -ExternalRequestMaxResponseSize = 50000 # Default +ExternalRequestMaxResponseSize = 1000000 # Default ``` The node pool manages multiple RPC endpoints. @@ -22407,7 +22612,7 @@ VerifyChainID enforces RPC Client ChainIDs to match configured ChainID ### ExternalRequestMaxResponseSize ```toml -ExternalRequestMaxResponseSize = 50000 # Default +ExternalRequestMaxResponseSize = 1000000 # Default ``` ExternalRequestMaxResponseSize sets the maximum allowed size (in bytes) for responses to external requests. @@ -23158,7 +23363,7 @@ Ensure the value is greater than the number of blocks that would be produced bet ComputeUnitLimitDefault = 200_000 # Default ``` -ComputeUnitLimitDefault is the compute units limit applied to transactions unless overridden during the txm enqueue +ComputeUnitLimitDefault is the compute units limit applied to transactions unless overriden during the txm enqueue ### EstimateComputeUnitLimit diff --git a/src/content/cre/guides/workflow/using-evm-client/onchain-write/using-write-report-helpers.mdx b/src/content/cre/guides/workflow/using-evm-client/onchain-write/using-write-report-helpers.mdx index 9bc7e2d3916..34a91b3a53a 100644 --- a/src/content/cre/guides/workflow/using-evm-client/onchain-write/using-write-report-helpers.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/onchain-write/using-write-report-helpers.mdx @@ -18,7 +18,7 @@ This guide explains how to write data to a smart contract using the `WriteReport - You're sending a **struct** to your consumer contract - The struct appears in a `public` or `external` function's signature (as a parameter or return value); this is required for the binding generator to detect it in your contract's ABI and create the helper method -**Don't meet these requirements?** See the [Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write#choosing-your-approach-which-guide-should-you-follow) page to find the right approach for your scenario. +**Don't meet these requirements?** See the [Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write/overview-go#choosing-your-approach-which-guide-should-you-follow) page to find the right approach for your scenario. ## Prerequisites diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 610756d9de3..80d4ab98cc7 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -3019,7 +3019,7 @@ This guide explains how to write data to a smart contract using the `WriteReport - You're sending a **struct** to your consumer contract - The struct appears in a `public` or `external` function's signature (as a parameter or return value); this is required for the binding generator to detect it in your contract's ABI and create the helper method -**Don't meet these requirements?** See the [Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write#choosing-your-approach-which-guide-should-you-follow) page to find the right approach for your scenario. +**Don't meet these requirements?** See the [Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write/overview-go#choosing-your-approach-which-guide-should-you-follow) page to find the right approach for your scenario. ## Prerequisites diff --git a/src/content/data-streams/llms-full.txt b/src/content/data-streams/llms-full.txt index c83ac4ed025..fac89ea8d21 100644 --- a/src/content/data-streams/llms-full.txt +++ b/src/content/data-streams/llms-full.txt @@ -944,9 +944,9 @@ curl -X POST \ **`/api/v1/symbol_info`** -| Type | Description | Parameter(s) | -| :------- | :------------------------------------------------------- | :----------------------------------------------------------------------------------------------- | -| HTTP GET | Gets a list of all supported symbols on the environment. | <ul><li>`group` (optional): Filter symbols by group. Currently only supports "crypto".</li></ul> | +| Type | Description | Parameter(s) | +| :------- | :------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | +| HTTP GET | Gets a list of all supported symbols on the environment. | <ul><li>`group` (optional): Filter symbols by group. See [`/groups`](#get-list-of-supported-groups) for available groups.</li></ul> | ##### Sample request @@ -983,26 +983,85 @@ curl -X GET \ | `401` | `Unauthorized - Authorization header is required \|\| Invalid authorization header format \|\| token signature is invalid: signature is invalid \|\| ...` | The authorization header was missing or invalid. | | `500` | `Error - Something went wrong` | An unexpected server error occurred. | +### Get list of supported groups + +##### Endpoint + +**`/api/v1/groups`** + +| Type | Description | Parameter(s) | +| :------- | :-------------------------------------------------------------------------------------------------------------------------------------------- | :----------- | +| HTTP GET | Gets a list of all supported symbol types on the environment. Any group name returned can be used as a filter in the `/symbol_info` endpoint. | None | + +##### Sample request + +```bash +curl -X GET \ + -H "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \ + https://priceapi.testnet-dataengine.chain.link/api/v1/groups +``` + +##### Response + +- **Status**: `200` + + ```json + { + "s": "ok", + "d": { + "groups": [{ "id": "crypto" }, { "id": "equities" }, { "id": "forex" }, { "id": "equity" }] + } + } + ``` + + | Field | Type | Description | + | :------- | :------- | :--------------------------------- | + | `s` | `string` | The status of the request. | + | `d` | `object` | The data returned by the API call. | + | `groups` | `array` | Array of supported groups. | + +##### Error Responses + +| Status Code | Error Message | Description | +| :---------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------- | +| `401` | `Unauthorized - Authorization header is required \|\| Invalid authorization header format \|\| token signature is invalid: signature is invalid \|\| ...` | The authorization header was missing or invalid. | +| `500` | `Error - Something went wrong` | An unexpected server error occurred. | + ### Get candlestick data (column format) ##### Endpoint **`/api/v1/history`** -| Type | Description | Parameter(s) | -| :------- | :-------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| HTTP GET | Gets candlestick data in column format. | <ul><li>`symbol`: The symbol to query.</li><li>`resolution`: Resolution of the data (required but not used, use "1m").</li><li>`from`: Unix timestamp of the leftmost required bar (inclusive).</li><li>`to`: Unix timestamp of the rightmost required bar (inclusive).</li></ul> | +| Type | Description | Parameter(s) | +| :------- | :-------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| HTTP GET | Gets candlestick data in column format. | <ul><li>`symbol`: The symbol to query.</li><li>`resolution`: Resolution of the data. E.g., "1m". Must match [supported resolutions](#supported-resolutions).</li><li>`from`: Unix timestamp of the leftmost required bar (inclusive).</li><li>`to`: Unix timestamp of the rightmost required bar (inclusive).</li></ul> | + +#### Supported resolutions + +The resolution you provide must be within the supported boundaries for the given time window size: + +| Time window size | Supported resolutions | +| :------------------------ | :------------------------------- | +| 1 min - 24 hours | 1 minute - 24 hours (1m - 24h) | +| 1 - 5 days | 5 minutes - 5 days (5m - 5d) | +| 5 - 30 days | 30 minutes - 30 days (30m - 30d) | +| 30 - 90 days | 1 hour - 90 days (1h - 90d) | +| 90 - 180 days | 2 hours - 180 days (2h - 6M) | +| 180 - 365 days | 24 hours - 365 days (24h - 1y) | +| 365 - 1825 days (1-5 yrs) | 1 week - 5 years (1w - 5y) | +| Over 1825 days (> 5 yrs) | Over 1 month | -**Note**: The resolution of the data is currently based on the size of the time window: +Resolutions can be provided in the following units: -| Max time window size | Resolution of candles | -| :------------------- | :-------------------- | -| \<= 24 hours | 1 minute | -| \<= 5 days | 5 minutes | -| \<= 30 days | 30 minutes | -| \<= 90 days | 1 hour | -| \<= 6 months | 2 hours | -| > 6 months | 1 day | +| Name | Unit | Example | +| :------ | :--- | :------ | +| minutes | m | 5m | +| hours | h | 3h | +| days | d | 1d | +| weeks | w | 2w | +| months | M | 6M | +| years | y | 2y | ##### Sample request @@ -1055,9 +1114,9 @@ curl -X GET \ **`/api/v1/history/rows`** -| Type | Description | Parameter(s) | -| :------- | :----------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| HTTP GET | Gets candlestick data in row format. | <ul><li>`symbol`: The symbol to query.</li><li>`resolution`: Resolution of the data (required but not used, use "1m").</li><li>`from`: Unix timestamp of the leftmost required bar (inclusive).</li><li>`to`: Unix timestamp of the rightmost required bar (inclusive).</li></ul> | +| Type | Description | Parameter(s) | +| :------- | :----------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| HTTP GET | Gets candlestick data in row format. | <ul><li>`symbol`: The symbol to query.</li><li>`resolution`: Resolution of the data. E.g., "1m". Must match [supported resolutions](#supported-resolutions).</li><li>`from`: Unix timestamp of the leftmost required bar (inclusive).</li><li>`to`: Unix timestamp of the rightmost required bar (inclusive).</li></ul> | ##### Sample request From 97cb2a9ac618c450102baa8ba4fb6e4691431f51 Mon Sep 17 00:00:00 2001 From: devin distefano <devin.distefano@smartcontract.com> Date: Mon, 5 Jan 2026 14:33:47 -0600 Subject: [PATCH 095/214] Data Feeds: Risk Update (#3313) * docs risk update * docs risk update * llms generate --- src/content/data-feeds/llms-full.txt | 48 ++++++++++--------- .../data-feeds/selecting-data-feeds.mdx | 48 ++++++++++--------- src/db/feedCategories.ts | 17 +++++-- src/db/supabase.ts | 4 +- src/features/feeds/components/FeedList.tsx | 3 +- src/features/feeds/components/Tables.tsx | 16 ++++--- src/features/feeds/utils/feedVisibility.ts | 3 +- 7 files changed, 79 insertions(+), 60 deletions(-) diff --git a/src/content/data-feeds/llms-full.txt b/src/content/data-feeds/llms-full.txt index 65af3ea6c24..b65c67cac1b 100644 --- a/src/content/data-feeds/llms-full.txt +++ b/src/content/data-feeds/llms-full.txt @@ -3137,8 +3137,9 @@ Data feeds are grouped into the following categories based on the level of marke - [🟢 Low Market Risk](#-low-market-risk-feeds) - [🟡 Medium Market Risk](#-medium-market-risk-feeds) -- [🔴 High Market Risk](#-high-market-risk-feeds) -- [🟠 New Token Feeds](#-new-token-feeds) +- [🟠 High Market Risk](#-high-market-risk-feeds) +- [🔴 Very High Market Risk](#-very-high-market-risk-feeds) +- [🆕 New Token Feeds](#-new-token-feeds) - [🔵 Custom Feeds](#-custom-feeds) - [⭕ Deprecating](#-deprecating) @@ -3165,44 +3166,47 @@ These feeds also follow a standardized data feeds workflow to report market pric Types of market risk that may lead to a feed being categorized as Medium Market Risk include: -- Lower or inconsistent asset volume may result in periods of low liquidity in the market for such assets. This, in turn, can lead to volatile price movements +- Lower or inconsistent asset volume may result in periods of low liquidity in the market for such assets. This, in turn, can lead to volatile price movements. - A spread between the price for this asset on different trading venues or liquidity pools. - Market Concentration Risk: If the volume for a given asset is excessively concentrated on a single exchange, that trading venue could become a single point of failure for the feed. - Cross-Rate Risk: The base asset trades in large volumes against assets that are not pegged to the quote asset. As a result, the price of this specific asset pair may fluctuate even if the underlying asset is not being traded. - The asset is going through a significant market event such as a token or liquidity migration. - The asset has a high spread between data providers, the root cause of which is often one of the above factors. -### 🔴 High Market Risk Feeds +### 🟠 High Market Risk Feeds -These feeds also follow a standardized data feeds workflow to report market prices for an asset pair. However, the pair in question often exhibits a heightened degree of some of the risk factors outlined under “Medium Market Risk”, or a separate risk that makes the market price subject to uncertainty or volatility. In using a High Market Risk data feed you acknowledge that you understand the risks associated with such a feed and that you are solely responsible for monitoring and mitigating such risks. +These feeds also follow a standardized data feeds workflow to report market prices for an asset pair. However, the pair in question often exhibits a heightened degree of some of the risk factors outlined under Medium Market Risk, or a separate risk that makes the market price subject to uncertainty or volatility. In using a High Market Risk data feed you acknowledge that you understand the risks associated with such a feed and that you are solely responsible for monitoring and mitigating such risks. Developers remain responsible for ensuring that protocol risk parameters are configured appropriately and that the operation and performance of High Market Risk data feeds matches expectations. High Market Risk data feeds may be deprecated. See the [Data Feed Shutdown Policy](#data-feed-shutdown-policy) for more information. -Types of market risk that may lead to a feed being categorized as High Market Risk include: +### 🔴 Very High Market Risk Feeds + +Very High Market Risk feeds price assets with quotes that are subject to extreme levels of risk, greater than those outlined above for High Market Risk. Types of market risk that may lead to a feed being categorized as Very High Market Risk include, but are not limited to: - The asset is going through a significant market event such as a hack, bridge failure, or a delisting from a major exchange. - The asset or project is being deprecated in the market. - Volumes have dropped to extremely low levels. -### 🟠 New Token Feeds +Users should wind down their reliance on these feeds and/or implement strict capital and risk management policies accounting for extreme price and market structure volatility. Very High Market Risk feeds will be wound down over time in accordance with the [Data Feed Shutdown Policy](#data-feed-shutdown-policy). In using a Very High Market Risk data feed you acknowledge that you understand the risks associated with such a feed and that you are solely responsible for monitoring and mitigating such risks. You understand that Chainlink may not provide separate monitoring for these feeds. Developers remain responsible for ensuring that protocol risk parameters are configured appropriately and that the operation and performance of Very High Market Risk data feeds matches expectations. + +### 🆕 New Token Feeds -When a token is newly launched, the historical data required to implement a rigorous risk assessment framework that would allow the categorization of a market data feed for that token as low, medium, or high market risk is unavailable. Consistent price discovery may involve an indeterminate amount of time. Users must understand the additional [market and volatility risks](https://docs.chain.link/data-feeds/selecting-data-feeds#evaluating-data-sources-and-risks) inherent with such assets. Users of new token feeds are responsible for independently verifying the liquidity and stability of the assets priced by the feeds that they use. -At the end of a probationary period, the status of new token feeds may be adjusted to high/medium/low market risk or in rare cases be deprecated entirely. +When a token is newly launched, the historical data required to implement a rigorous risk assessment framework that would allow the categorization of a market data feed for that token as Low, Medium, or High Market Risk is unavailable. Consistent price discovery may involve an indeterminate amount of time. Users must understand the additional [market and volatility risks](#evaluating-data-sources-and-risks) inherent with such assets. Users of New Token feeds are responsible for independently verifying the liquidity and stability of the assets priced by the feeds that they use. At the end of a probationary period, the status of New Token feeds may be adjusted to High, Medium, or Low Market Risk, or in rare cases be deprecated entirely. ### 🔵 Custom Feeds Custom Feeds are built to serve a specific use case and might not be suitable for general use or your use case's risk parameters. Users must evaluate the properties of a feed to make sure it aligns with their intended use case. [Contact the Chainlink Labs team](https://chain.link/contact?ref_id=DataFeed) if you want more detail on any specific feeds in this category. -Custom feeds have the following categories and compositions: +Custom Feeds have the following categories and compositions: -- Onchain single source feeds: These feeds take their data from an onchain source, however, the feed has only a single data provider currently supporting the feed. -- Onchain Proof of Reserve Feeds: Chainlink Proof of Reserve uses a large decentralized collection of security-reviewed and Sybil-resistant node operators to acquire and verify reserve data. In this use case, reserves reside onchain. -- Exchange Rate Feeds: These feeds read an exchange rate from an external contract onchain that is designed to allow conversion from one token to another. Chainlink does not own or control these contracts in any way. They are not equivalent to market price feeds. -- Technical Feeds: Feeds within this category measure a particular technical metric from a specified blockchain. For example, Fast Gas or Block Difficulty. -- Total Value Locked Feeds: These feeds measure the total value locked in a particular protocol. -- Custom Index Feeds: An index calculates a function of the values for multiple underlying assets. The function is specific to that index and is typically calculated by node operators following an agreed formula. -- Offchain Single Source Feeds: Some data providers use a single data source, which might be necessary if only one source exists offchain for a specific type of data. -- Offchain Proof of Reserve Feeds: Chainlink Proof of Reserve uses a large decentralized collection of security-reviewed and Sybil-resistant node operators to acquire and verify reserve data. In this use case, reserves reside offchain. -- LP Token Feeds: These feeds use a decentralized feed for the underlying asset as well as calculations to value the liquidity pool (LP) tokens. -- Wrapped Calculated Feeds: These feeds are typically pegged 1:1 to the underlying token or asset. Under normal market conditions, these feeds track their underlying value accurately. However, given that the price is a derivative formed from a calculated method, the derivative asset may not always precisely track the value of the underlying token or asset precisely. +- **Onchain Single Source Feeds:** These feeds take their data from an onchain source, however, the feed has only a single data provider currently supporting the feed. +- **Onchain Proof of Reserve Feeds:** Chainlink Proof of Reserve uses a large decentralized collection of security-reviewed and Sybil-resistant node operators to acquire and verify reserve data. In this use case, reserves reside onchain. +- **Exchange Rate Feeds:** These feeds read an exchange rate from an external contract onchain that is designed to allow conversion from one token to another. Chainlink does not own or control these contracts in any way. They are not equivalent to market price feeds. +- **Technical Feeds:** Feeds within this category measure a particular technical metric from a specified blockchain. For example, Fast Gas or Block Difficulty. +- **Total Value Locked Feeds:** These feeds measure the total value locked in a particular protocol. +- **Custom Index Feeds:** An index calculates a function of the values for multiple underlying assets. The function is specific to that index and is typically calculated by node operators following an agreed formula. +- **Offchain Single Source Feeds:** Some data providers use a single data source, which might be necessary if only one source exists offchain for a specific type of data. +- **Offchain Proof of Reserve Feeds:** Chainlink Proof of Reserve uses a large decentralized collection of security-reviewed and Sybil-resistant node operators to acquire and verify reserve data. In this use case, reserves reside offchain. +- **LP Token Feeds:** These feeds use a decentralized feed for the underlying asset as well as calculations to value the liquidity pool (LP) tokens. +- **Wrapped Calculated Feeds:** These feeds are typically pegged 1:1 to the underlying token or asset. Under normal market conditions, these feeds track their underlying value accurately. However, given that the price is a derivative formed from a calculated method, the derivative asset may not always precisely track the value of the underlying token or asset. If you plan on using one of these feeds and would like to get a more detailed understanding, [contact the Chainlink Labs team](https://chain.link/contact?ref_id=DataFeed). @@ -3212,9 +3216,9 @@ These feeds are being deprecated. To find the deprecation dates for specific fee #### Data Feed Shutdown Policy -Data feeds managed by Chainlink Labs will be considered for deprecation if they pose a risk to the Chainlink Community and broader ecosystem, if the asset or assets on the feed have significantly deteriorated and no longer meet our Quality Assurance standards, or if the data feed has become economically unsustainable to support. +Data feeds managed by Chainlink Labs will be considered for deprecation if they pose a risk to the Chainlink Community and broader ecosystem, if the asset or assets (or their volume or liquidity) on the feed have significantly deteriorated or are unreliable and no longer meet our Quality Assurance standards, or if the data feed has become economically unsustainable to support. Users are therefore advised to ensure they have measures in place for the orderly deprecation of reliance on specific Chainlink price feeds. -Known users of these feeds will be contacted directly about the feeds' deprecation. Notifications will also be posted on the [Feeds Scheduled For Deprecation](/data-feeds/deprecating-feeds) page and on our [Discord channel](https://discord.com/channels/592041321326182401/991444378335838318) with two weeks of notice before they are shut down. +Known users of these feeds will be contacted directly about the feeds' deprecation whenever possible. Notifications will also be posted on the [Feeds Scheduled For Deprecation](/data-feeds/deprecating-feeds) page and on our [Discord channel](https://discord.com/channels/592041321326182401/991444378335838318) with two weeks of notice before they are shut down except where conditions require an accelerated deprecation. <Aside type="note" title="Data Feed Shutdown Behavior"> diff --git a/src/content/data-feeds/selecting-data-feeds.mdx b/src/content/data-feeds/selecting-data-feeds.mdx index 490c954c80f..888b194e1f4 100644 --- a/src/content/data-feeds/selecting-data-feeds.mdx +++ b/src/content/data-feeds/selecting-data-feeds.mdx @@ -24,8 +24,9 @@ Data feeds are grouped into the following categories based on the level of marke - [🟢 Low Market Risk](#-low-market-risk-feeds) - [🟡 Medium Market Risk](#-medium-market-risk-feeds) -- [🔴 High Market Risk](#-high-market-risk-feeds) -- [🟠 New Token Feeds](#-new-token-feeds) +- [🟠 High Market Risk](#-high-market-risk-feeds) +- [🔴 Very High Market Risk](#-very-high-market-risk-feeds) +- [🆕 New Token Feeds](#-new-token-feeds) - [🔵 Custom Feeds](#-custom-feeds) - [⭕ Deprecating](#-deprecating) @@ -52,44 +53,47 @@ These feeds also follow a standardized data feeds workflow to report market pric Types of market risk that may lead to a feed being categorized as Medium Market Risk include: -- Lower or inconsistent asset volume may result in periods of low liquidity in the market for such assets. This, in turn, can lead to volatile price movements +- Lower or inconsistent asset volume may result in periods of low liquidity in the market for such assets. This, in turn, can lead to volatile price movements. - A spread between the price for this asset on different trading venues or liquidity pools. - Market Concentration Risk: If the volume for a given asset is excessively concentrated on a single exchange, that trading venue could become a single point of failure for the feed. - Cross-Rate Risk: The base asset trades in large volumes against assets that are not pegged to the quote asset. As a result, the price of this specific asset pair may fluctuate even if the underlying asset is not being traded. - The asset is going through a significant market event such as a token or liquidity migration. - The asset has a high spread between data providers, the root cause of which is often one of the above factors. -### 🔴 High Market Risk Feeds +### 🟠 High Market Risk Feeds -These feeds also follow a standardized data feeds workflow to report market prices for an asset pair. However, the pair in question often exhibits a heightened degree of some of the risk factors outlined under “Medium Market Risk”, or a separate risk that makes the market price subject to uncertainty or volatility. In using a High Market Risk data feed you acknowledge that you understand the risks associated with such a feed and that you are solely responsible for monitoring and mitigating such risks. +These feeds also follow a standardized data feeds workflow to report market prices for an asset pair. However, the pair in question often exhibits a heightened degree of some of the risk factors outlined under Medium Market Risk, or a separate risk that makes the market price subject to uncertainty or volatility. In using a High Market Risk data feed you acknowledge that you understand the risks associated with such a feed and that you are solely responsible for monitoring and mitigating such risks. Developers remain responsible for ensuring that protocol risk parameters are configured appropriately and that the operation and performance of High Market Risk data feeds matches expectations. High Market Risk data feeds may be deprecated. See the [Data Feed Shutdown Policy](#data-feed-shutdown-policy) for more information. -Types of market risk that may lead to a feed being categorized as High Market Risk include: +### 🔴 Very High Market Risk Feeds + +Very High Market Risk feeds price assets with quotes that are subject to extreme levels of risk, greater than those outlined above for High Market Risk. Types of market risk that may lead to a feed being categorized as Very High Market Risk include, but are not limited to: - The asset is going through a significant market event such as a hack, bridge failure, or a delisting from a major exchange. - The asset or project is being deprecated in the market. - Volumes have dropped to extremely low levels. -### 🟠 New Token Feeds +Users should wind down their reliance on these feeds and/or implement strict capital and risk management policies accounting for extreme price and market structure volatility. Very High Market Risk feeds will be wound down over time in accordance with the [Data Feed Shutdown Policy](#data-feed-shutdown-policy). In using a Very High Market Risk data feed you acknowledge that you understand the risks associated with such a feed and that you are solely responsible for monitoring and mitigating such risks. You understand that Chainlink may not provide separate monitoring for these feeds. Developers remain responsible for ensuring that protocol risk parameters are configured appropriately and that the operation and performance of Very High Market Risk data feeds matches expectations. + +### 🆕 New Token Feeds -When a token is newly launched, the historical data required to implement a rigorous risk assessment framework that would allow the categorization of a market data feed for that token as low, medium, or high market risk is unavailable. Consistent price discovery may involve an indeterminate amount of time. Users must understand the additional [market and volatility risks](https://docs.chain.link/data-feeds/selecting-data-feeds#evaluating-data-sources-and-risks) inherent with such assets. Users of new token feeds are responsible for independently verifying the liquidity and stability of the assets priced by the feeds that they use. -At the end of a probationary period, the status of new token feeds may be adjusted to high/medium/low market risk or in rare cases be deprecated entirely. +When a token is newly launched, the historical data required to implement a rigorous risk assessment framework that would allow the categorization of a market data feed for that token as Low, Medium, or High Market Risk is unavailable. Consistent price discovery may involve an indeterminate amount of time. Users must understand the additional [market and volatility risks](#evaluating-data-sources-and-risks) inherent with such assets. Users of New Token feeds are responsible for independently verifying the liquidity and stability of the assets priced by the feeds that they use. At the end of a probationary period, the status of New Token feeds may be adjusted to High, Medium, or Low Market Risk, or in rare cases be deprecated entirely. ### 🔵 Custom Feeds Custom Feeds are built to serve a specific use case and might not be suitable for general use or your use case's risk parameters. Users must evaluate the properties of a feed to make sure it aligns with their intended use case. [Contact the Chainlink Labs team](https://chain.link/contact?ref_id=DataFeed) if you want more detail on any specific feeds in this category. -Custom feeds have the following categories and compositions: +Custom Feeds have the following categories and compositions: -- Onchain single source feeds: These feeds take their data from an onchain source, however, the feed has only a single data provider currently supporting the feed. -- Onchain Proof of Reserve Feeds: Chainlink Proof of Reserve uses a large decentralized collection of security-reviewed and Sybil-resistant node operators to acquire and verify reserve data. In this use case, reserves reside onchain. -- Exchange Rate Feeds: These feeds read an exchange rate from an external contract onchain that is designed to allow conversion from one token to another. Chainlink does not own or control these contracts in any way. They are not equivalent to market price feeds. -- Technical Feeds: Feeds within this category measure a particular technical metric from a specified blockchain. For example, Fast Gas or Block Difficulty. -- Total Value Locked Feeds: These feeds measure the total value locked in a particular protocol. -- Custom Index Feeds: An index calculates a function of the values for multiple underlying assets. The function is specific to that index and is typically calculated by node operators following an agreed formula. -- Offchain Single Source Feeds: Some data providers use a single data source, which might be necessary if only one source exists offchain for a specific type of data. -- Offchain Proof of Reserve Feeds: Chainlink Proof of Reserve uses a large decentralized collection of security-reviewed and Sybil-resistant node operators to acquire and verify reserve data. In this use case, reserves reside offchain. -- LP Token Feeds: These feeds use a decentralized feed for the underlying asset as well as calculations to value the liquidity pool (LP) tokens. -- Wrapped Calculated Feeds: These feeds are typically pegged 1:1 to the underlying token or asset. Under normal market conditions, these feeds track their underlying value accurately. However, given that the price is a derivative formed from a calculated method, the derivative asset may not always precisely track the value of the underlying token or asset precisely. +- **Onchain Single Source Feeds:** These feeds take their data from an onchain source, however, the feed has only a single data provider currently supporting the feed. +- **Onchain Proof of Reserve Feeds:** Chainlink Proof of Reserve uses a large decentralized collection of security-reviewed and Sybil-resistant node operators to acquire and verify reserve data. In this use case, reserves reside onchain. +- **Exchange Rate Feeds:** These feeds read an exchange rate from an external contract onchain that is designed to allow conversion from one token to another. Chainlink does not own or control these contracts in any way. They are not equivalent to market price feeds. +- **Technical Feeds:** Feeds within this category measure a particular technical metric from a specified blockchain. For example, Fast Gas or Block Difficulty. +- **Total Value Locked Feeds:** These feeds measure the total value locked in a particular protocol. +- **Custom Index Feeds:** An index calculates a function of the values for multiple underlying assets. The function is specific to that index and is typically calculated by node operators following an agreed formula. +- **Offchain Single Source Feeds:** Some data providers use a single data source, which might be necessary if only one source exists offchain for a specific type of data. +- **Offchain Proof of Reserve Feeds:** Chainlink Proof of Reserve uses a large decentralized collection of security-reviewed and Sybil-resistant node operators to acquire and verify reserve data. In this use case, reserves reside offchain. +- **LP Token Feeds:** These feeds use a decentralized feed for the underlying asset as well as calculations to value the liquidity pool (LP) tokens. +- **Wrapped Calculated Feeds:** These feeds are typically pegged 1:1 to the underlying token or asset. Under normal market conditions, these feeds track their underlying value accurately. However, given that the price is a derivative formed from a calculated method, the derivative asset may not always precisely track the value of the underlying token or asset. If you plan on using one of these feeds and would like to get a more detailed understanding, [contact the Chainlink Labs team](https://chain.link/contact?ref_id=DataFeed). @@ -99,9 +103,9 @@ These feeds are being deprecated. To find the deprecation dates for specific fee #### Data Feed Shutdown Policy -Data feeds managed by Chainlink Labs will be considered for deprecation if they pose a risk to the Chainlink Community and broader ecosystem, if the asset or assets on the feed have significantly deteriorated and no longer meet our Quality Assurance standards, or if the data feed has become economically unsustainable to support. +Data feeds managed by Chainlink Labs will be considered for deprecation if they pose a risk to the Chainlink Community and broader ecosystem, if the asset or assets (or their volume or liquidity) on the feed have significantly deteriorated or are unreliable and no longer meet our Quality Assurance standards, or if the data feed has become economically unsustainable to support. Users are therefore advised to ensure they have measures in place for the orderly deprecation of reliance on specific Chainlink price feeds. -Known users of these feeds will be contacted directly about the feeds' deprecation. Notifications will also be posted on the [Feeds Scheduled For Deprecation](/data-feeds/deprecating-feeds) page and on our [Discord channel](https://discord.com/channels/592041321326182401/991444378335838318) with two weeks of notice before they are shut down. +Known users of these feeds will be contacted directly about the feeds' deprecation whenever possible. Notifications will also be posted on the [Feeds Scheduled For Deprecation](/data-feeds/deprecating-feeds) page and on our [Discord channel](https://discord.com/channels/592041321326182401/991444378335838318) with two weeks of notice before they are shut down except where conditions require an accelerated deprecation. {/* prettier-ignore */} <Aside type="note" title="Data Feed Shutdown Behavior"> diff --git a/src/db/feedCategories.ts b/src/db/feedCategories.ts index b08864fb2c4..60003381a76 100644 --- a/src/db/feedCategories.ts +++ b/src/db/feedCategories.ts @@ -35,15 +35,23 @@ export const FEED_CATEGORY_CONFIG = { high: { key: "high", name: "High Market Risk", - icon: "🔴", + icon: "🟠", title: "High Market Risk - Feeds that deliver a heightened degree of some of the risk factors associated with Medium Market Risk Feeds, or a separate risk that makes the market price subject to uncertainty or volatile. In using a high market risk data feed you acknowledge that you understand the risks associated with such a feed and that you are solely responsible for monitoring and mitigating such risks.", link: "/data-feeds/selecting-data-feeds#-high-market-risk-feeds", }, + veryhigh: { + key: "veryhigh", + name: "Very High Market Risk", + icon: "🔴", + title: + "Very High Market Risk - Feeds with significant risk factors that require careful consideration. Users must thoroughly evaluate and understand all associated risks before use.", + link: "/data-feeds/selecting-data-feeds#-very-high-market-risk-feeds", + }, new: { key: "new", name: "New Token", - icon: "🟠", + icon: "🆕", title: "New Token - Tokens without the historical data required to implement a risk assessment framework may be launched in this category. Users must understand the additional market and volatility risks inherent with such assets. Users of New Token Feeds are responsible for independently verifying the liquidity and stability of the assets priced by feeds that they use.", link: "/data-feeds/selecting-data-feeds#-new-token-feeds", @@ -72,11 +80,12 @@ export type CategoryKey = keyof typeof FEED_CATEGORY_CONFIG Small helpers =========================== */ -const TABLE = "docs_feeds_risk" +const TABLE = "prod_feeds_risk_docs" const normalizeKey = (v?: string | null): CategoryKey | undefined => { if (!v) return undefined - const key = v.toLowerCase() as CategoryKey + // Handle "very high" from DB → "veryhigh" config key + const key = v.toLowerCase().replace(/\s+/g, "") as CategoryKey return key in FEED_CATEGORY_CONFIG ? key : undefined } diff --git a/src/db/supabase.ts b/src/db/supabase.ts index 5d62fb69d0a..206ce4b3c91 100644 --- a/src/db/supabase.ts +++ b/src/db/supabase.ts @@ -1,9 +1,10 @@ import { createClient } from "@supabase/supabase-js" +// Try PUBLIC_ prefixed vars first (needed for client-side/browser access in Astro) +// These work both locally and on Vercel when properly configured const supabaseUrl = import.meta.env.PUBLIC_SUPABASE_URL const supabaseKey = import.meta.env.PUBLIC_SUPABASE_ANON_KEY -// Export a function that safely creates the client export function getSupabaseClient() { if (!supabaseUrl || !supabaseKey) { return null @@ -11,5 +12,4 @@ export function getSupabaseClient() { return createClient(supabaseUrl, supabaseKey) } -// Export the client instance (may be null) export const supabase = getSupabaseClient() diff --git a/src/features/feeds/components/FeedList.tsx b/src/features/feeds/components/FeedList.tsx index 43d809409b1..c25fd36b477 100644 --- a/src/features/feeds/components/FeedList.tsx +++ b/src/features/feeds/components/FeedList.tsx @@ -362,6 +362,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" }, @@ -644,7 +645,7 @@ export const FeedList = ({ // 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.feedCategory !== "hidden" && !feed.docs?.hidden + (feed: any) => feed.feedCategory === "deprecating" && !feed.docs?.hidden ) return !!hasVisible } diff --git a/src/features/feeds/components/Tables.tsx b/src/features/feeds/components/Tables.tsx index a32e992f987..b6f47b96d7d 100644 --- a/src/features/feeds/components/Tables.tsx +++ b/src/features/feeds/components/Tables.tsx @@ -50,7 +50,9 @@ const parseMarkdownLink = (text: string) => { // Render a category icon/link from the config const getFeedCategoryElement = (riskTier: string | undefined) => { if (!riskTier) return "" - const category = FEED_CATEGORY_CONFIG[riskTier.toLowerCase()] + // Normalize: "very high" → "veryhigh" to match config keys + const normalizedKey = riskTier.toLowerCase().replace(/\s+/g, "") + const category = FEED_CATEGORY_CONFIG[normalizedKey] if (!category) return "" return ( <span className={clsx(feedList.hoverText, tableStyles.statusIcon, "feed-category")} title={category.title}> @@ -1134,8 +1136,6 @@ export const MainnetTable = ({ const filteredMetadata = enrichedMetadata .sort((a, b) => (a.name.toUpperCase() < b.name.toUpperCase() ? -1 : 1)) .filter((metadata) => { - // Filter out hidden feeds (from Supabase) - if (metadata.finalCategory === "hidden") return false if (showOnlySVR && !metadata.secondaryProxyAddress) { return false } @@ -1168,9 +1168,11 @@ 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.finalCategory?.toLowerCase()) + selectedFeedCategories.map((cat) => cat.toLowerCase().replace(/\s+/g, "")).includes(normalizedFinalCategory) ) }) .filter( @@ -1359,8 +1361,6 @@ export const TestnetTable = ({ const filteredMetadata = enrichedMetadata .sort((a, b) => (a.name.toUpperCase() < b.name.toUpperCase() ? -1 : 1)) .filter((metadata) => { - // Filter out hidden feeds (from Supabase) - if (metadata.finalCategory === "hidden") return false // Use shared visibility logic with filters return isFeedVisible(metadata, dataFeedType as any, undefined, { showOnlyDEXFeeds, @@ -1383,9 +1383,11 @@ 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.finalCategory?.toLowerCase()) + selectedFeedCategories.map((cat) => cat.toLowerCase().replace(/\s+/g, "")).includes(normalizedFinalCategory) ) }) .filter( diff --git a/src/features/feeds/utils/feedVisibility.ts b/src/features/feeds/utils/feedVisibility.ts index 1f7280bc054..32da1f5ccc4 100644 --- a/src/features/feeds/utils/feedVisibility.ts +++ b/src/features/feeds/utils/feedVisibility.ts @@ -34,8 +34,7 @@ export function isFeedVisible( // =========================================================================== // 1. Universal Exclusions // =========================================================================== - // Always hide feeds marked as hidden in metadata or docs - if (feed.feedCategory === "hidden" || feed.docs?.hidden) return false + if (feed.docs?.hidden) return false const isDeprecating = ecosystem === "deprecating" const isStreams = From 3b84ea4a39d5fed2b0872da070db26cc3bdcfe8e Mon Sep 17 00:00:00 2001 From: gfletcher-cll <grace.fletcher@smartcontract.com> Date: Tue, 6 Jan 2026 15:58:43 -0800 Subject: [PATCH 096/214] Update billing.mdx (#3338) --- src/content/ccip/billing.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/ccip/billing.mdx b/src/content/ccip/billing.mdx index 9c6ecdc2ae9..d8facd6b324 100644 --- a/src/content/ccip/billing.mdx +++ b/src/content/ccip/billing.mdx @@ -76,7 +76,7 @@ This cost is only relevant if the destination blockchain is a [L2 layer](https:/ ### Network fee -The fee paid to RMN node operators running the [Decentralized Oracle Network](/ccip/concepts/architecture/key-concepts#decentralized-oracle-network-don): +The fee paid to node operators running the [Decentralized Oracle Network](/ccip/concepts/architecture/key-concepts#decentralized-oracle-network-don): #### Token transfers or programmable token transfers From 4523acc134f5744c96fbb498eb6969007538a439 Mon Sep 17 00:00:00 2001 From: devin distefano <devin.distefano@smartcontract.com> Date: Wed, 7 Jan 2026 14:28:54 -0800 Subject: [PATCH 097/214] risk-changelog (#3339) --- public/changelog.json | 7 +++++++ src/content/ccip/llms-full.txt | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/public/changelog.json b/public/changelog.json index de608813ef5..2eeb231bd65 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -358,6 +358,13 @@ } }, "data": [ + { + "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", diff --git a/src/content/ccip/llms-full.txt b/src/content/ccip/llms-full.txt index e29504ea5ba..0a6e7944b98 100644 --- a/src/content/ccip/llms-full.txt +++ b/src/content/ccip/llms-full.txt @@ -772,7 +772,7 @@ This cost is only relevant if the destination blockchain is a [L2 layer](https:/ ### Network fee -The fee paid to RMN node operators running the [Decentralized Oracle Network](/ccip/concepts/architecture/key-concepts#decentralized-oracle-network-don): +The fee paid to node operators running the [Decentralized Oracle Network](/ccip/concepts/architecture/key-concepts#decentralized-oracle-network-don): #### Token transfers or programmable token transfers From 98fbd342540c9f39a77d073df4545b368afa17ff Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Thu, 8 Jan 2026 11:49:10 -0500 Subject: [PATCH 098/214] Automation & Functions CRE callouts (#3340) * add cre callouts * add cre callouts --- .../chainlink-automation/guides/compatible-contracts.mdx | 3 +++ src/content/chainlink-automation/index.mdx | 4 +--- src/content/chainlink-automation/llms-full.txt | 8 +++++--- .../chainlink-automation/overview/getting-started.mdx | 3 +++ src/content/chainlink-functions/getting-started.mdx | 2 ++ src/content/chainlink-functions/index.mdx | 3 +++ src/content/chainlink-functions/llms-full.txt | 4 ++++ .../chainlink-automation/common/ChainlinkAutomation.astro | 5 ++++- src/features/chainlink-automation/common/cre-callout.mdx | 7 +++++++ .../chainlink-functions/common/ChainlinkFunctions.astro | 6 +++++- src/features/chainlink-functions/common/cre-callout.mdx | 7 +++++++ 11 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 src/features/chainlink-automation/common/cre-callout.mdx create mode 100644 src/features/chainlink-functions/common/cre-callout.mdx diff --git a/src/content/chainlink-automation/guides/compatible-contracts.mdx b/src/content/chainlink-automation/guides/compatible-contracts.mdx index d8f5eb561ac..81153e841ad 100644 --- a/src/content/chainlink-automation/guides/compatible-contracts.mdx +++ b/src/content/chainlink-automation/guides/compatible-contracts.mdx @@ -13,6 +13,9 @@ whatsnext: --- import { Aside, CodeSample } from "@components" +import ChainlinkAutomation from "@features/chainlink-automation/common/ChainlinkAutomation.astro" + +<ChainlinkAutomation callout="cre" /> Learn how to make smart contracts that are compatible with `Automation`. diff --git a/src/content/chainlink-automation/index.mdx b/src/content/chainlink-automation/index.mdx index 223c4d893fa..7a17799ed00 100644 --- a/src/content/chainlink-automation/index.mdx +++ b/src/content/chainlink-automation/index.mdx @@ -17,9 +17,7 @@ import { Aside } from "@components" import { ClickToZoom } from "@components" import ChainlinkAutomation from "@features/chainlink-automation/common/ChainlinkAutomation.astro" -<Aside type="note" title="Get Started"> - Try Chainlink Automation in the [Getting Started](/chainlink-automation/overview/getting-started) guide. -</Aside> +<ChainlinkAutomation callout="cre" /> <ChainlinkAutomation callout="deprecation" /> diff --git a/src/content/chainlink-automation/llms-full.txt b/src/content/chainlink-automation/llms-full.txt index b2258f479a7..f8ffaba7e90 100644 --- a/src/content/chainlink-automation/llms-full.txt +++ b/src/content/chainlink-automation/llms-full.txt @@ -99,6 +99,8 @@ If your upkeep is on Automation v1, we recommend that you revalidate the conditi # Create Automation-Compatible Contracts Source: https://docs.chain.link/chainlink-automation/guides/compatible-contracts +<ChainlinkAutomation callout="cre" /> + Learn how to make smart contracts that are compatible with `Automation`. <Aside type="tip" title="Considerations and Best Practices"> @@ -980,9 +982,7 @@ Read our [debugging section](/chainlink-automation/reference/debugging-errors) t # Chainlink Automation Source: https://docs.chain.link/chainlink-automation -<Aside type="note" title="Get Started"> - Try Chainlink Automation in the [Getting Started](/chainlink-automation/overview/getting-started) guide. -</Aside> +<ChainlinkAutomation callout="cre" /> <Aside type="caution" title="Upgrade Time-Based Upkeep Recommended"> The Automation “Time-based” upkeep contract has been updated so that only the unique forwarder for your upkeep can call it. If your upkeep was deployed before 11 December 2025, we recommend you replace your existing “Time-based” upkeeps using the new “Time-based” upkeep. @@ -1085,6 +1085,8 @@ For funding on mainnet, you will need ERC-677 LINK. Many token bridges give you # Getting Started with Chainlink Automation Source: https://docs.chain.link/chainlink-automation/overview/getting-started +<ChainlinkAutomation callout="cre" /> + Chainlink Automation will reliably execute smart contract functions using a variety of triggers. Explore the examples below to see how Chainlink Automation works for each type of trigger. Before you begin, you will need an active cryptocurrency wallet such as Metamask. - **Time-based trigger**: Use a time-based trigger to execute your function according to a time schedule. diff --git a/src/content/chainlink-automation/overview/getting-started.mdx b/src/content/chainlink-automation/overview/getting-started.mdx index 3e20b5dae13..a1ebd093d62 100644 --- a/src/content/chainlink-automation/overview/getting-started.mdx +++ b/src/content/chainlink-automation/overview/getting-started.mdx @@ -15,6 +15,9 @@ whatsnext: import { Address, Aside, ClickToZoom, CopyText } from "@components" import { YouTube } from "@astro-community/astro-embed-youtube" import { Tabs } from "@components/Tabs" +import ChainlinkAutomation from "@features/chainlink-automation/common/ChainlinkAutomation.astro" + +<ChainlinkAutomation callout="cre" /> Chainlink Automation will reliably execute smart contract functions using a variety of triggers. Explore the examples below to see how Chainlink Automation works for each type of trigger. Before you begin, you will need an active cryptocurrency wallet such as Metamask. diff --git a/src/content/chainlink-functions/getting-started.mdx b/src/content/chainlink-functions/getting-started.mdx index 78144fa094f..03997098f3e 100644 --- a/src/content/chainlink-functions/getting-started.mdx +++ b/src/content/chainlink-functions/getting-started.mdx @@ -16,6 +16,8 @@ import { Tabs } from "@components/Tabs" import ChainlinkFunctions from "@features/chainlink-functions/common/ChainlinkFunctions.astro" import { YouTube } from "@astro-community/astro-embed-youtube" +<ChainlinkFunctions callout="cre" /> + Learn how to make requests to the Chainlink Functions Decentralized Oracle Network (DON) and make any computation or API calls offchain. Chainlink Functions is available on several blockchains (see the [supported networks page](/chainlink-functions/supported-networks)), but this guide uses Sepolia to simplify access to testnet funds. Complete the following tasks to get started with Chainlink Functions: - Set up your web3 wallet and fund it with testnet tokens. diff --git a/src/content/chainlink-functions/index.mdx b/src/content/chainlink-functions/index.mdx index 03c0934966d..988a30af7b9 100644 --- a/src/content/chainlink-functions/index.mdx +++ b/src/content/chainlink-functions/index.mdx @@ -12,6 +12,9 @@ whatsnext: --- import { Aside } from "@components" +import ChainlinkFunctions from "@features/chainlink-functions/common/ChainlinkFunctions.astro" + +<ChainlinkFunctions callout="cre" /> Chainlink Functions provides your smart contracts access to trust-minimized compute infrastructure, allowing you to fetch data from APIs and perform custom computation. Your smart contract sends source code in a request to a [Decentralized Oracle Network (DON)](/chainlink-functions/resources/concepts), and each node in the DON executes the code in a serverless environment. The DON then aggregates all the independent return values from each execution and sends the final result back to your smart contract. diff --git a/src/content/chainlink-functions/llms-full.txt b/src/content/chainlink-functions/llms-full.txt index bbce22a511f..ec1663a0444 100644 --- a/src/content/chainlink-functions/llms-full.txt +++ b/src/content/chainlink-functions/llms-full.txt @@ -397,6 +397,8 @@ const myArr = new Uint8Array(ARRAY_LENGTH) # Getting Started Source: https://docs.chain.link/chainlink-functions/getting-started +<ChainlinkFunctions callout="cre" /> + Learn how to make requests to the Chainlink Functions Decentralized Oracle Network (DON) and make any computation or API calls offchain. Chainlink Functions is available on several blockchains (see the [supported networks page](/chainlink-functions/supported-networks)), but this guide uses Sepolia to simplify access to testnet funds. Complete the following tasks to get started with Chainlink Functions: - Set up your web3 wallet and fund it with testnet tokens. @@ -638,6 +640,8 @@ Now that you understand the structure of the API. Let's delve into the JavaScrip # Chainlink Functions Source: https://docs.chain.link/chainlink-functions +<ChainlinkFunctions callout="cre" /> + Chainlink Functions provides your smart contracts access to trust-minimized compute infrastructure, allowing you to fetch data from APIs and perform custom computation. Your smart contract sends source code in a request to a [Decentralized Oracle Network (DON)](/chainlink-functions/resources/concepts), and each node in the DON executes the code in a serverless environment. The DON then aggregates all the independent return values from each execution and sends the final result back to your smart contract. Chainlink Functions eliminates the need for you to manage your own Chainlink node and provides decentralized offchain computation and consensus, ensuring that a minority of the network cannot manipulate the response sent back to your smart contract. 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" && <StreamsLookupInterfaceComponent />} {callout === "deprecation" && <DeprecationCalloutComponent />} + +{callout === "cre" && <CreCalloutComponent />} 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" + +<Aside type="tip" title="Building a new automation task?"> + Check out the [Chainlink Runtime Environment (CRE)](/cre), our latest environment for building and running verifiable + workflows with enhanced capabilities, improved developer experience, and support for everything Automation can do—and + more. +</Aside> 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" && <FunctionsConsumerComponent />} @@ -29,3 +31,5 @@ const { section } = Astro.props as Props {section === "prerequisites-guides-with-automation" && <GuidesWithAutomationPrerequisitesComponent />} {section === "deno-importe-notes" && <DenoImportNotesComponent />} + +{callout === "cre" && <CreCalloutComponent />} 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" + +<Aside type="tip" title="Integrating offchain computation or data?"> + Check out the [Chainlink Runtime Environment (CRE)](/cre), our latest environment for building and running verifiable + workflows with enhanced capabilities, improved developer experience, and support for everything Chainlink Functions + can do—and more. +</Aside> From e903f0f95a2f8ec122f9c624097db929620dabf2 Mon Sep 17 00:00:00 2001 From: clnan <103686410+clnan@users.noreply.github.com> Date: Fri, 9 Jan 2026 08:10:15 -0500 Subject: [PATCH 099/214] docs:fix tiny serv resp page (#3344) --- src/content/ccip/service-responsibility.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/ccip/service-responsibility.mdx b/src/content/ccip/service-responsibility.mdx index 8a5f59355ea..83c01b33f54 100644 --- a/src/content/ccip/service-responsibility.mdx +++ b/src/content/ccip/service-responsibility.mdx @@ -58,7 +58,7 @@ Token Developers may enable token transfers on CCIP for the tokens that they adm - **Authorization**: Token Developers must verify that they are authorized to create token pools for a given token. Although anyone may create a token pool, the token developer must properly register that token with Chainlink CCIP. Token Developers must also properly configure the TokenAdminRegistry. - **Token pool configurations for [Rebasable Tokens](/ccip/concepts/cross-chain-token/evm/token-pools#tokens-with-rebasing-or-fee-on-transfer-mechanisms)**: Token Developers must properly write the logic in their token pool for burning and minting tokens based on the rebasing mechanism. - **Token transfer rate limits**: Token DeveloperToken Owners must select and configure appropriate token transfer rate limits for tokens on each lane where they choose to enable their token. -- **Token transfer types**: Token Developers must select appropriate token transfer type for their tokens; either [Burn and Mint](/ccip/concepts/cross-chain-token/overview#burn-and-mint), [Lock and Mint](/ccip/concepts/cross-chain-token/overview#lock-and-mint), or [Lock and Unlock](/ccip/concepts/cross-chain-token/overview#lock-and-unlock). Token Developers are responsible for implementing the burn and mint functions, lock and mint functions or lock and unlock functions in their token contracts correctly on all applicable chains. +- **Token transfer types**: Token Developers must select appropriate token transfer type for their tokens; either [Burn and Mint](/ccip/concepts/cross-chain-token/overview#burn-and-mint), [Lock and Mint](/ccip/concepts/cross-chain-token/overview#lock-and-mint), or [Lock and Unlock](/ccip/concepts/cross-chain-token/overview#lock-and-unlock). Token Developers are responsible for implementing the burn / mint / transfer functions in their token contracts correctly on all applicable chains. - **Migration between CCIP versions**: Token Developers who wish to adopt future versions of CCIP are responsible for all migration tasks required to adopt new features and functionality. - **Best Practices**: Token Developers are responsible for following the appropriate best practices for creating, managing, and enabling transfers of their tokens on Chainlink CCIP. - **Token Developer Attestation**: Token Developers are responsible for ensuring the quality, reliability, and security of their associated attestation endpoint(s). Token Developers are responsible for adhering to Chainlink-defined specifications and maintaining an up-to-date implementation. Neither Chainlink Labs nor the Chainlink Foundation are responsible for the development, maintenance, or operation of Token Developer Attestation endpoints. From 0a8842c7319ad3a74da7c92abb0777860bd6080e Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Fri, 9 Jan 2026 11:12:04 -0500 Subject: [PATCH 100/214] ReceiverTemplate & Consumer contract guide (#3341) * update consumer contract guide * update consumer contract guide * update ReceiverTemplate * add complete interfaces code + CodeSample comp * add IERC165 --- public/samples/CRE/BasicConsumer.sol | 22 + public/samples/CRE/IERC165.sol | 27 ++ public/samples/CRE/IReceiver.sol | 18 + public/samples/CRE/ReceiverTemplate.sol | 242 +++++++++++ src/content/ccip/llms-full.txt | 2 +- .../building-consumer-contracts.mdx | 407 +++++++----------- src/content/cre/llms-full-go.txt | 406 ++++++----------- src/content/cre/llms-full-ts.txt | 406 ++++++----------- 8 files changed, 742 insertions(+), 788 deletions(-) create mode 100644 public/samples/CRE/BasicConsumer.sol create mode 100644 public/samples/CRE/IERC165.sol create mode 100644 public/samples/CRE/IReceiver.sol create mode 100644 public/samples/CRE/ReceiverTemplate.sol 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/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..a749c065fa9 --- /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 pure virtual override returns (bool) { + return interfaceId == type(IReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; + } +} diff --git a/src/content/ccip/llms-full.txt b/src/content/ccip/llms-full.txt index 0a6e7944b98..aaec728225f 100644 --- a/src/content/ccip/llms-full.txt +++ b/src/content/ccip/llms-full.txt @@ -502,7 +502,7 @@ Token Developers may enable token transfers on CCIP for the tokens that they adm - **Token transfer rate limits**: Token DeveloperToken Owners must select and configure appropriate token transfer rate limits for tokens on each lane where they choose to enable their token. -- **Token transfer types**: Token Developers must select appropriate token transfer type for their tokens; either [Burn and Mint](/ccip/concepts/cross-chain-token/overview#burn-and-mint), [Lock and Mint](/ccip/concepts/cross-chain-token/overview#lock-and-mint), or [Lock and Unlock](/ccip/concepts/cross-chain-token/overview#lock-and-unlock). Token Developers are responsible for implementing the burn and mint functions, lock and mint functions or lock and unlock functions in their token contracts correctly on all applicable chains. +- **Token transfer types**: Token Developers must select appropriate token transfer type for their tokens; either [Burn and Mint](/ccip/concepts/cross-chain-token/overview#burn-and-mint), [Lock and Mint](/ccip/concepts/cross-chain-token/overview#lock-and-mint), or [Lock and Unlock](/ccip/concepts/cross-chain-token/overview#lock-and-unlock). Token Developers are responsible for implementing the burn / mint / transfer functions in their token contracts correctly on all applicable chains. - **Migration between CCIP versions**: Token Developers who wish to adopt future versions of CCIP are responsible for all migration tasks required to adopt new features and functionality. diff --git a/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx b/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx index a9570305ce9..f58184e286f 100644 --- a/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx @@ -8,7 +8,7 @@ metadata: lastModified: "2025-11-20" --- -import { Aside, ClickToZoom } from "@components" +import { Aside, ClickToZoom, CodeSample } from "@components" When your workflow [writes data to the blockchain](/cre/guides/workflow/using-evm-client/onchain-write), it doesn't call your contract directly. Instead, it submits a signed report to a Chainlink `KeystoneForwarder` contract, which then calls your contract. @@ -16,12 +16,13 @@ This guide explains how to build a consumer contract that can securely receive a **In this guide:** -- [Core Concepts: The Onchain Data Flow](#1-core-concepts-the-onchain-data-flow) -- [The IReceiver Standard](#2-the-ireceiver-standard) -- [Using ReceiverTemplate](#3-using-receivertemplate) -- [Working with Simulation](#4-working-with-simulation) -- [Advanced Usage](#5-advanced-usage-optional) -- [Complete Examples](#6-complete-examples) +1. [Core Concepts: The Onchain Data Flow](#1-core-concepts-the-onchain-data-flow) +1. [The IReceiver Standard](#2-the-ireceiver-standard) +1. [Using ReceiverTemplate](#3-using-receivertemplate) +1. [Working with Simulation](#4-working-with-simulation) +1. [Advanced Usage](#5-advanced-usage-optional) +1. [Complete Examples](#6-complete-examples) +1. [Security Considerations](#7-security-considerations) ## 1. Core Concepts: The Onchain Data Flow @@ -38,11 +39,7 @@ To be a valid target for the `KeystoneForwarder`, your consumer contract must sa The `KeystoneForwarder` needs a standardized function to call. This is defined by the `IReceiver` interface, which mandates an `onReport` function. -```solidity -interface IReceiver is IERC165 { - function onReport(bytes calldata metadata, bytes calldata report) external; -} -``` +<CodeSample src="samples/CRE/IReceiver.sol" /> - `metadata`: Contains information about the workflow (ID, name, owner). This is encoded by the Forwarder using `abi.encodePacked` with the following structure: `bytes32 workflowId`, `bytes10 workflowName`, `address workflowOwner`. - `report`: The raw, ABI-encoded data payload from your workflow. @@ -51,6 +48,8 @@ interface IReceiver is IERC165 { [ERC165](https://eips.ethereum.org/EIPS/eip-165) is a standard that allows contracts to publish the interfaces they support. The `KeystoneForwarder` uses this to check if your contract supports the `IReceiver` interface before sending a report. +Link to the `IERC165` interface: [IERC165.sol](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol) + ## 3. Using `ReceiverTemplate` ### 3.1 Overview @@ -59,8 +58,9 @@ While you can implement these standards manually, we provide an abstract contrac **Key features:** -- **Optional Permission Controls**: Choose your security level—enable forwarder address checks, workflow ID validation, workflow owner verification, or any combination -- **Flexible and Updatable**: All permission settings can be configured and updated via setter functions after deployment +- **Secure by Default**: Requires forwarder address at deployment, ensuring your contract is protected from the start +- **Layered Security**: Add optional workflow ID validation, workflow owner verification, or any combination for defense-in-depth +- **Flexible Configuration**: All permission settings can be updated via setter functions after deployment - **Simplified Logic**: You only need to implement `_processReport(bytes calldata report)` with your business logic - **Built-in Access Control**: Includes OpenZeppelin's `Ownable` for secure permission management - **ERC165 Support**: Includes the necessary `supportsInterface` function @@ -68,218 +68,17 @@ While you can implement these standards manually, we provide an abstract contrac ### 3.2 Contract Source Code -```solidity -// 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 All permission fields default to zero (disabled). Use setter functions to enable checks. -abstract contract ReceiverTemplate is IReceiver, Ownable { - // Optional permission fields (all default to zero = disabled) - address private s_forwarderAddress; // If set, only this address can call onReport - address private s_expectedAuthor; // If set, only reports from this workflow owner are accepted - bytes10 private s_expectedWorkflowName; // If set, only reports with this workflow name are accepted - 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 InvalidSender(address sender, address expected); - error InvalidAuthor(address received, address expected); - error InvalidWorkflowName(bytes10 received, bytes10 expected); - error InvalidWorkflowId(bytes32 received, bytes32 expected); - - // 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); - - /// @notice Constructor sets msg.sender as the owner - /// @dev All permission fields are initialized to zero (disabled by default) - constructor() Ownable(msg.sender) {} - - /// @notice Returns the configured forwarder address - /// @return The forwarder address (address(0) if not set) - 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); - } - if (s_expectedWorkflowName != bytes10(0) && 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 (use address(0) to disable this check) - function setForwarderAddress(address _forwarder) external onlyOwner { - address previousForwarder = s_forwarderAddress; - 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 The name is hashed using SHA256 and truncated - 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 pure virtual override returns (bool) { - return interfaceId == type(IReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; - } -} -``` +<CodeSample src="samples/CRE/ReceiverTemplate.sol" /> ### 3.3 Quick Start The simplest way to use `ReceiverTemplate` is to inherit from it and implement the `_processReport` function: -```solidity -// 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); - - // Simple constructor - no parameters needed - constructor() ReceiverTemplate() {} - - // Implement your business logic here - function _processReport(bytes calldata report) internal override { - uint256 newValue = abi.decode(report, (uint256)); - s_storedValue = newValue; - emit ValueUpdated(newValue); - } -} -``` +<CodeSample src="samples/CRE/BasicConsumer.sol" /> ### 3.4 Configuring Permissions -After deploying your contract, the owner can enable any combination of security checks using the setter functions. +The forwarder address is configured at deployment via the constructor and provides your first line of defense. After deploying your contract, the owner can configure additional security checks or update the forwarder address if needed. {/* prettier-ignore */} <Aside type="caution" title="For simulation"> @@ -288,21 +87,23 @@ After deploying your contract, the owner can enable any combination of security {/* prettier-ignore */} <Aside type="tip" title="Finding forwarder addresses"> - For a complete list of `KeystoneForwarder` contract addresses on all supported networks, see [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks). + For a complete list of `KeystoneForwarder` and `MockForwarder` contract addresses on all supported networks, see [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks). </Aside> **Configuration examples:** ```solidity -// Example: Enable forwarder check only -myConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia +// Example: Update forwarder address (e.g., when moving from simulation to production) +myConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia KeystoneForwarder -// Example: Enable workflow ID check +// Example: Add workflow ID check for additional security myConsumer.setExpectedWorkflowId(0x1234...); // Your specific workflow ID -// Example: Enable workflow owner and name checks +// Example: Add workflow owner check myConsumer.setExpectedAuthor(0xYourAddress...); -myConsumer.setExpectedWorkflowName("my_workflow"); // The plaintext workflow name + +// Example: Add workflow name check (requires author validation to be set) +myConsumer.setExpectedWorkflowName("my_workflow"); // Example: Disable a check later myConsumer.setExpectedWorkflowName(""); // Empty string disables the check @@ -310,23 +111,26 @@ myConsumer.setExpectedWorkflowName(""); // Empty string disables the check {/* prettier-ignore */} <Aside type="tip" title="Recommended production setup"> - For production contracts, we recommend enabling at minimum the `forwarderAddress` check. For highest security, combine it with `expectedWorkflowId` to ensure only your specific workflow can update the contract. + The forwarder address is required at deployment and provides basic security. For production contracts, we strongly recommend adding additional validation: + - Use `setExpectedWorkflowId()` if only one workflow writes to your contract (highest security) + - Use `setExpectedAuthor()` if multiple workflows from the same owner write to your contract </Aside> **What the template handles for you:** -- Validates the caller address (if `forwarderAddress` is set) -- Validates the workflow ID (if `expectedWorkflowId` is set) -- Validates the workflow owner (if `expectedAuthor` is set) -- Validates the workflow name (if `expectedWorkflowName` is set) -- Validates the ERC165 interface detection -- Validates the Access control via OpenZeppelin's `Ownable` +- Validates the caller address against the configured forwarder (required at deployment) +- Validates the workflow ID (if `expectedWorkflowId` is configured) +- Validates the workflow owner (if `expectedAuthor` is configured) +- Validates the workflow name (if both `expectedWorkflowName` AND `expectedAuthor` are configured) +- Implements ERC165 interface detection +- Provides access control via OpenZeppelin's `Ownable` - Calls your `_processReport` function with validated data **What you implement:** +- Pass the forwarder address to the constructor during deployment - Your business logic in `_processReport` -- (Optional) Configure permissions after deployment using setter functions +- (Optional) Configure additional permissions after deployment using setter functions #### How workflow names are encoded @@ -341,14 +145,22 @@ The `workflowName` field in the metadata uses the **`bytes10`** type rather than This encoding ensures consistent, fixed-size representation regardless of the original workflow name length. +{/* prettier-ignore */} +<Aside type="caution" title="Workflow name validation requires author validation"> + Workflow name validation is **only performed when author validation is also configured**. The code enforces this at runtime: if you set `expectedWorkflowName`, you must also set `expectedAuthor`, otherwise the validation will revert with `WorkflowNameRequiresAuthorValidation()`. This prevents the 40-bit collision attack by ensuring workflow names are validated in combination with the owner address. See [Security Considerations](#7-security-considerations) for details. +</Aside> + **Usage:** ```solidity -// Just use the plaintext workflow name - the interface handles the encoding automatically +// Set the expected author first (required) +myConsumer.setExpectedAuthor(0xYourAddress...); + +// Then set the expected workflow name (only works with author validation) myConsumer.setExpectedWorkflowName("my_workflow"); -// To disable the check later -myConsumer.setExpectedWorkflowName(""); // Empty string disables the check +// To disable the workflow name check +myConsumer.setExpectedWorkflowName(""); // Empty string clears the stored value ``` ## 4. Working with Simulation @@ -359,20 +171,21 @@ When you run `cre workflow simulate`, your workflow interacts with a **`MockKeys This is a **temporary limitation** until the `MockKeystoneForwarder` is updated to provide full metadata. </Aside> -### Forwarder address validation +### Deploying for Simulation -You **can** configure the forwarder address check during simulation using the **Mock Forwarder Address**: +When deploying your consumer contract for simulation, pass the **Mock Forwarder address** to the constructor: ```solidity -// Example: Use Mock Forwarder for Ethereum Sepolia simulation -myConsumer.setForwarderAddress(0x15fC6ae953E024d975e77382eEeC56A9101f9F88); +// Deploy with MockForwarder address for Ethereum Sepolia simulation +address mockForwarder = 0x15fC6ae953E024d975e77382eEeC56A9101f9F88; // Ethereum Sepolia MockForwarder +MyConsumer myConsumer = new MyConsumer(mockForwarder); ``` Find Mock Forwarder addresses for all networks in the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page. {/* prettier-ignore */} <Aside type="caution" title="Important: Different addresses for simulation vs production"> - The `MockKeystoneForwarder` address used during simulation is **different** from the `KeystoneForwarder` address used by deployed workflows. If you configure the forwarder address for simulation, remember to update it to the production `KeystoneForwarder` address after deploying. See [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) for forwarder addresses. + The `MockKeystoneForwarder` address used during simulation is **different** from the `KeystoneForwarder` address used by deployed workflows. After testing with simulation, deploy a new instance with the production `KeystoneForwarder` address, or update the forwarder address using `setForwarderAddress()`. See [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) for forwarder addresses. </Aside> ### Metadata-based validation @@ -385,18 +198,28 @@ Find Mock Forwarder addresses for all networks in the [Supported Networks](/cre/ Setting any of these will cause your simulation to fail. -### After deployment +### Transitioning to Production + +Once you're ready to deploy your workflow to production: + +**Option 1: Deploy a new contract instance** -Once you deploy your workflow: +```solidity +// Deploy with production KeystoneForwarder address +address keystoneForwarder = 0xF8344CFd5c43616a4366C34E3EEE75af79a74482; // Ethereum Sepolia +MyConsumer myConsumer = new MyConsumer(keystoneForwarder); + +// Configure additional security checks +myConsumer.setExpectedWorkflowId(0xYourWorkflowId); +``` -1. Update the forwarder address to the real `KeystoneForwarder` (if you configured it for simulation) -1. Configure additional metadata-based validation as needed +**Option 2: Update existing contract's forwarder** ```solidity -// Update to production KeystoneForwarder address -myConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Example: Ethereum Sepolia +// Update forwarder to production KeystoneForwarder +myConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia -// Now you can enable metadata-based validation +// Add metadata-based validation myConsumer.setExpectedWorkflowId(0xYourWorkflowId); ``` @@ -419,6 +242,8 @@ contract AdvancedConsumer is ReceiverTemplate { event MinReportIntervalUpdated(uint256 previousInterval, uint256 newInterval); + constructor(address _forwarderAddress) ReceiverTemplate(_forwarderAddress) {} + // Add custom validation before parent's checks function onReport(bytes calldata metadata, bytes calldata report) external override { // Custom check: Rate limiting @@ -468,6 +293,8 @@ The `_decodeMetadata` helper function is available for use in your `_processRepo contract MetadataAwareConsumer is ReceiverTemplate { mapping(bytes32 => uint256) public s_reportCountByWorkflow; + constructor(address _forwarderAddress) ReceiverTemplate(_forwarderAddress) {} + function _processReport(bytes calldata report) internal override { // Access the metadata to get workflow ID bytes calldata metadata = msg.data[4:]; // Skip function selector @@ -503,8 +330,8 @@ contract TemperatureConsumer is ReceiverTemplate { int256 public s_currentTemperature; event TemperatureUpdated(int256 newTemperature); - // Simple constructor - no parameters needed - constructor() ReceiverTemplate() {} + // Constructor requires forwarder address + constructor(address _forwarderAddress) ReceiverTemplate(_forwarderAddress) {} function _processReport(bytes calldata report) internal override { int256 newTemperature = abi.decode(report, (int256)); @@ -514,13 +341,22 @@ contract TemperatureConsumer is ReceiverTemplate { } ``` -**Configuring permissions after deployment:** +**Deployment:** ```solidity -// Enable forwarder check for production -temperatureConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia +// For simulation: Use MockForwarder address +address mockForwarder = 0x15fC6ae953E024d975e77382eEeC56A9101f9F88; // e.g. Ethereum Sepolia +TemperatureConsumer temperatureConsumer = new TemperatureConsumer(mockForwarder); + +// For production: Use KeystoneForwarder address +address keystoneForwarder = 0xF8344CFd5c43616a4366C34E3EEE75af79a74482; // e.g. Ethereum Sepolia +TemperatureConsumer temperatureConsumer = new TemperatureConsumer(keystoneForwarder); +``` + +**Adding additional security after deployment:** -// Enable workflow ID check for highest security +```solidity +// Add workflow ID check for highest security temperatureConsumer.setExpectedWorkflowId(0xYourWorkflowId...); ``` @@ -621,7 +457,7 @@ import { ReceiverTemplate } from "./ReceiverTemplate.sol"; contract UpdateReservesProxy is ReceiverTemplate { ReserveManager private s_reserveManager; - constructor(address reserveManagerAddress) { + constructor(address _forwarderAddress, address reserveManagerAddress) ReceiverTemplate(_forwarderAddress) { s_reserveManager = ReserveManager(reserveManagerAddress); } @@ -642,10 +478,7 @@ contract UpdateReservesProxy is ReceiverTemplate { **Configuring permissions after deployment:** ```solidity -// Enable forwarder check (recommended) -updateReservesProxy.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia - -// Enable workflow ID check for production (highest security) +// Additional validation can be added after deployment updateReservesProxy.setExpectedWorkflowId(0xYourWorkflowId...); ``` @@ -659,7 +492,7 @@ updateReservesProxy.setExpectedWorkflowId(0xYourWorkflowId...); The deployment and configuration process involves these steps: 1. **Deploy the Logic Contract**: Deploy `ReserveManager.sol`. The wallet that deploys this contract becomes its `owner`. -1. **Deploy the Proxy Contract**: Deploy `UpdateReservesProxy.sol`, passing the address of the deployed `ReserveManager` contract to its constructor. +1. **Deploy the Proxy Contract**: Deploy `UpdateReservesProxy.sol`, passing the forwarder address and the address of the deployed `ReserveManager` contract to its constructor. 1. **Link the Contracts**: The `owner` of the `ReserveManager` contract must call its `setProxyAddress` function, passing in the address of the `UpdateReservesProxy` contract. This authorizes the proxy to call the logic contract. 1. **Configure Permissions** (Recommended): The `owner` of the proxy should call setter functions to enable security checks: ```solidity @@ -669,14 +502,66 @@ The deployment and configuration process involves these steps: 1. **Configure Workflow**: In your workflow's `config.json`, use the address of the **Proxy Contract** as the receiver address. 1. **Execution Flow**: When your workflow runs: - The Chainlink Forwarder calls `onReport` on your **Proxy** - - The Proxy validates the report (forwarder address, workflow ID, etc.) + - The Proxy validates the report (forwarder address is verified automatically; additional checks like workflow ID can be added) - The Proxy's `_processReport` function calls the `updateReserves` function on your **Logic Contract** - Because the caller is the trusted proxy, the `onlyProxy` check passes, and your state is securely updated 1. **(Optional) Upgrade**: If you later need to deploy a new proxy, the owner can: - - Deploy the new proxy contract + - Deploy the new proxy contract with the appropriate forwarder address - Call `setProxyAddress` on the `ReserveManager` to point it to the new proxy's address - Update the workflow configuration to use the new proxy address #### End-to-End Sequence <ClickToZoom src="/images/cre/consumer-contracts-proxy-pattern.png" alt="Building Consumer Contracts: Proxy Pattern" /> + +## 7. Security Considerations + +### Forwarder address + +**The forwarder address is the foundation of your contract's security.** The `KeystoneForwarder` contract performs cryptographic verification of DON signatures before calling your consumer. By requiring the forwarder address in the constructor, `ReceiverTemplate` ensures your contract is secure from deployment. + +{/* prettier-ignore */} +<Aside type="caution" title="Never set forwarder to address(0) in production"> + While the `setForwarderAddress()` function allows updating to `address(0)`, this disables the critical security check and allows **anyone** to call your `onReport()` function with arbitrary data. The function emits a `SecurityWarning` event if you attempt this. Only use `address(0)` for testing if you fully understand the implications. +</Aside> + +### Replay protection + +The `KeystoneForwarder` contract includes built-in replay protection that prevents successful reports from being executed multiple times. By requiring the forwarder address at construction time, `ReceiverTemplate` ensures your consumer benefits from this protection automatically. + +{/* prettier-ignore */} +<Aside type="note" title="Failed reports can be retried"> + If a report fails (reverts), the forwarder's replay protection allows it to be retried. This is safe because reverts undo all state changes, ensuring no duplicate effects occur in your contract. +</Aside> + +### Additional validation layers + +The forwarder address provides baseline security, but you can add additional validation for defense-in-depth: + +- **`expectedWorkflowId`**: Ensures only one specific workflow can update your contract. Use this when a single workflow writes to your consumer (highest security for single-workflow scenarios). +- **`expectedAuthor`**: Restricts to workflows owned by a specific address. Use this when multiple workflows from the same owner should access your contract. +- **`expectedWorkflowName`**: Can be used in combination with `expectedAuthor` for additional validation. Requires author validation to be configured. See [Workflow name validation](#workflow-name-validation) below. + +### Workflow name validation + +{/* prettier-ignore */} +<Aside type="caution" title="Workflow name validation requires author validation"> + The `expectedWorkflowName` check in `ReceiverTemplate.onReport()` **requires author validation** to be configured: + + - **Collision Risk**: Workflow names use only 40-bit truncation (bytes10), making collision attacks computationally feasible when used alone + - **Unique per owner**: Workflow names are unique per owner but not across different owners + - **Runtime enforcement**: The code enforces that if `expectedWorkflowName` is set, `expectedAuthor` must also be set, otherwise it reverts with `WorkflowNameRequiresAuthorValidation()` + + By combining workflow name (40-bit) with author validation (160-bit address), the contract achieves adequate collision resistance. You can safely use workflow name validation as long as author validation is also enabled. +</Aside> + +### Best practices + +1. **Always deploy with a valid forwarder address** - The constructor requires this for security. Use `MockForwarder` for simulation, `KeystoneForwarder` for production. Forwarder addresses are available in the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page. +1. **Add additional validation for production**: + - **Single workflow**: Use `setExpectedWorkflowId()` to restrict to one specific workflow (highest security) + - **Multiple workflows from same owner**: Use `setExpectedAuthor()` to restrict to workflows you own + - **Multiple workflows from different owners**: Implement custom validation logic in your `onReport()` override +1. **Keep your owner key secure** - The owner can update all permission settings +1. **Test permission configurations** - Verify your security settings work as expected before production deployment +1. **Workflow name validation** - Can be used with `setExpectedWorkflowName()` but requires `setExpectedAuthor()` to also be configured for security diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 80d4ab98cc7..386a9d3bcba 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -2343,12 +2343,13 @@ This guide explains how to build a consumer contract that can securely receive a **In this guide:** -- [Core Concepts: The Onchain Data Flow](#1-core-concepts-the-onchain-data-flow) -- [The IReceiver Standard](#2-the-ireceiver-standard) -- [Using ReceiverTemplate](#3-using-receivertemplate) -- [Working with Simulation](#4-working-with-simulation) -- [Advanced Usage](#5-advanced-usage-optional) -- [Complete Examples](#6-complete-examples) +1. [Core Concepts: The Onchain Data Flow](#1-core-concepts-the-onchain-data-flow) +2. [The IReceiver Standard](#2-the-ireceiver-standard) +3. [Using ReceiverTemplate](#3-using-receivertemplate) +4. [Working with Simulation](#4-working-with-simulation) +5. [Advanced Usage](#5-advanced-usage-optional) +6. [Complete Examples](#6-complete-examples) +7. [Security Considerations](#7-security-considerations) ## 1. Core Concepts: The Onchain Data Flow @@ -2365,12 +2366,6 @@ To be a valid target for the `KeystoneForwarder`, your consumer contract must sa The `KeystoneForwarder` needs a standardized function to call. This is defined by the `IReceiver` interface, which mandates an `onReport` function. -```solidity -interface IReceiver is IERC165 { - function onReport(bytes calldata metadata, bytes calldata report) external; -} -``` - - `metadata`: Contains information about the workflow (ID, name, owner). This is encoded by the Forwarder using `abi.encodePacked` with the following structure: `bytes32 workflowId`, `bytes10 workflowName`, `address workflowOwner`. - `report`: The raw, ABI-encoded data payload from your workflow. @@ -2378,6 +2373,8 @@ interface IReceiver is IERC165 { [ERC165](https://eips.ethereum.org/EIPS/eip-165) is a standard that allows contracts to publish the interfaces they support. The `KeystoneForwarder` uses this to check if your contract supports the `IReceiver` interface before sending a report. +Link to the `IERC165` interface: [IERC165.sol](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol) + ## 3. Using `ReceiverTemplate` ### 3.1 Overview @@ -2386,8 +2383,9 @@ While you can implement these standards manually, we provide an abstract contrac **Key features:** -- **Optional Permission Controls**: Choose your security level—enable forwarder address checks, workflow ID validation, workflow owner verification, or any combination -- **Flexible and Updatable**: All permission settings can be configured and updated via setter functions after deployment +- **Secure by Default**: Requires forwarder address at deployment, ensuring your contract is protected from the start +- **Layered Security**: Add optional workflow ID validation, workflow owner verification, or any combination for defense-in-depth +- **Flexible Configuration**: All permission settings can be updated via setter functions after deployment - **Simplified Logic**: You only need to implement `_processReport(bytes calldata report)` with your business logic - **Built-in Access Control**: Includes OpenZeppelin's `Ownable` for secure permission management - **ERC165 Support**: Includes the necessary `supportsInterface` function @@ -2395,218 +2393,13 @@ While you can implement these standards manually, we provide an abstract contrac ### 3.2 Contract Source Code -```solidity -// 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 All permission fields default to zero (disabled). Use setter functions to enable checks. -abstract contract ReceiverTemplate is IReceiver, Ownable { - // Optional permission fields (all default to zero = disabled) - address private s_forwarderAddress; // If set, only this address can call onReport - address private s_expectedAuthor; // If set, only reports from this workflow owner are accepted - bytes10 private s_expectedWorkflowName; // If set, only reports with this workflow name are accepted - 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 InvalidSender(address sender, address expected); - error InvalidAuthor(address received, address expected); - error InvalidWorkflowName(bytes10 received, bytes10 expected); - error InvalidWorkflowId(bytes32 received, bytes32 expected); - - // 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); - - /// @notice Constructor sets msg.sender as the owner - /// @dev All permission fields are initialized to zero (disabled by default) - constructor() Ownable(msg.sender) {} - - /// @notice Returns the configured forwarder address - /// @return The forwarder address (address(0) if not set) - 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); - } - if (s_expectedWorkflowName != bytes10(0) && 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 (use address(0) to disable this check) - function setForwarderAddress(address _forwarder) external onlyOwner { - address previousForwarder = s_forwarderAddress; - 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 The name is hashed using SHA256 and truncated - 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 pure virtual override returns (bool) { - return interfaceId == type(IReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; - } -} -``` - ### 3.3 Quick Start The simplest way to use `ReceiverTemplate` is to inherit from it and implement the `_processReport` function: -```solidity -// 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); - - // Simple constructor - no parameters needed - constructor() ReceiverTemplate() {} - - // Implement your business logic here - function _processReport(bytes calldata report) internal override { - uint256 newValue = abi.decode(report, (uint256)); - s_storedValue = newValue; - emit ValueUpdated(newValue); - } -} -``` - ### 3.4 Configuring Permissions -After deploying your contract, the owner can enable any combination of security checks using the setter functions. +The forwarder address is configured at deployment via the constructor and provides your first line of defense. After deploying your contract, the owner can configure additional security checks or update the forwarder address if needed. <Aside type="caution" title="For simulation"> @@ -2615,21 +2408,23 @@ After deploying your contract, the owner can enable any combination of security <Aside type="tip" title="Finding forwarder addresses"> - For a complete list of `KeystoneForwarder` contract addresses on all supported networks, see [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks). + For a complete list of `KeystoneForwarder` and `MockForwarder` contract addresses on all supported networks, see [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks). </Aside> **Configuration examples:** ```solidity -// Example: Enable forwarder check only -myConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia +// Example: Update forwarder address (e.g., when moving from simulation to production) +myConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia KeystoneForwarder -// Example: Enable workflow ID check +// Example: Add workflow ID check for additional security myConsumer.setExpectedWorkflowId(0x1234...); // Your specific workflow ID -// Example: Enable workflow owner and name checks +// Example: Add workflow owner check myConsumer.setExpectedAuthor(0xYourAddress...); -myConsumer.setExpectedWorkflowName("my_workflow"); // The plaintext workflow name + +// Example: Add workflow name check (requires author validation to be set) +myConsumer.setExpectedWorkflowName("my_workflow"); // Example: Disable a check later myConsumer.setExpectedWorkflowName(""); // Empty string disables the check @@ -2637,23 +2432,27 @@ myConsumer.setExpectedWorkflowName(""); // Empty string disables the check <Aside type="tip" title="Recommended production setup"> - For production contracts, we recommend enabling at minimum the `forwarderAddress` check. For highest security, combine it with `expectedWorkflowId` to ensure only your specific workflow can update the contract. + The forwarder address is required at deployment and provides basic security. For production contracts, we strongly recommend adding additional validation: + + - Use `setExpectedWorkflowId()` if only one workflow writes to your contract (highest security) + - Use `setExpectedAuthor()` if multiple workflows from the same owner write to your contract </Aside> **What the template handles for you:** -- Validates the caller address (if `forwarderAddress` is set) -- Validates the workflow ID (if `expectedWorkflowId` is set) -- Validates the workflow owner (if `expectedAuthor` is set) -- Validates the workflow name (if `expectedWorkflowName` is set) -- Validates the ERC165 interface detection -- Validates the Access control via OpenZeppelin's `Ownable` +- Validates the caller address against the configured forwarder (required at deployment) +- Validates the workflow ID (if `expectedWorkflowId` is configured) +- Validates the workflow owner (if `expectedAuthor` is configured) +- Validates the workflow name (if both `expectedWorkflowName` AND `expectedAuthor` are configured) +- Implements ERC165 interface detection +- Provides access control via OpenZeppelin's `Ownable` - Calls your `_processReport` function with validated data **What you implement:** +- Pass the forwarder address to the constructor during deployment - Your business logic in `_processReport` -- (Optional) Configure permissions after deployment using setter functions +- (Optional) Configure additional permissions after deployment using setter functions #### How workflow names are encoded @@ -2668,14 +2467,22 @@ The `workflowName` field in the metadata uses the **`bytes10`** type rather than This encoding ensures consistent, fixed-size representation regardless of the original workflow name length. + +<Aside type="caution" title="Workflow name validation requires author validation"> + Workflow name validation is **only performed when author validation is also configured**. The code enforces this at runtime: if you set `expectedWorkflowName`, you must also set `expectedAuthor`, otherwise the validation will revert with `WorkflowNameRequiresAuthorValidation()`. This prevents the 40-bit collision attack by ensuring workflow names are validated in combination with the owner address. See [Security Considerations](#7-security-considerations) for details. +</Aside> + **Usage:** ```solidity -// Just use the plaintext workflow name - the interface handles the encoding automatically +// Set the expected author first (required) +myConsumer.setExpectedAuthor(0xYourAddress...); + +// Then set the expected workflow name (only works with author validation) myConsumer.setExpectedWorkflowName("my_workflow"); -// To disable the check later -myConsumer.setExpectedWorkflowName(""); // Empty string disables the check +// To disable the workflow name check +myConsumer.setExpectedWorkflowName(""); // Empty string clears the stored value ``` ## 4. Working with Simulation @@ -2686,20 +2493,21 @@ When you run `cre workflow simulate`, your workflow interacts with a **`MockKeys This is a **temporary limitation** until the `MockKeystoneForwarder` is updated to provide full metadata. </Aside> -### Forwarder address validation +### Deploying for Simulation -You **can** configure the forwarder address check during simulation using the **Mock Forwarder Address**: +When deploying your consumer contract for simulation, pass the **Mock Forwarder address** to the constructor: ```solidity -// Example: Use Mock Forwarder for Ethereum Sepolia simulation -myConsumer.setForwarderAddress(0x15fC6ae953E024d975e77382eEeC56A9101f9F88); +// Deploy with MockForwarder address for Ethereum Sepolia simulation +address mockForwarder = 0x15fC6ae953E024d975e77382eEeC56A9101f9F88; // Ethereum Sepolia MockForwarder +MyConsumer myConsumer = new MyConsumer(mockForwarder); ``` Find Mock Forwarder addresses for all networks in the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page. <Aside type="caution" title="Important: Different addresses for simulation vs production"> - The `MockKeystoneForwarder` address used during simulation is **different** from the `KeystoneForwarder` address used by deployed workflows. If you configure the forwarder address for simulation, remember to update it to the production `KeystoneForwarder` address after deploying. See [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) for forwarder addresses. + The `MockKeystoneForwarder` address used during simulation is **different** from the `KeystoneForwarder` address used by deployed workflows. After testing with simulation, deploy a new instance with the production `KeystoneForwarder` address, or update the forwarder address using `setForwarderAddress()`. See [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) for forwarder addresses. </Aside> ### Metadata-based validation @@ -2712,18 +2520,28 @@ Find Mock Forwarder addresses for all networks in the [Supported Networks](/cre/ Setting any of these will cause your simulation to fail. -### After deployment +### Transitioning to Production + +Once you're ready to deploy your workflow to production: + +**Option 1: Deploy a new contract instance** + +```solidity +// Deploy with production KeystoneForwarder address +address keystoneForwarder = 0xF8344CFd5c43616a4366C34E3EEE75af79a74482; // Ethereum Sepolia +MyConsumer myConsumer = new MyConsumer(keystoneForwarder); -Once you deploy your workflow: +// Configure additional security checks +myConsumer.setExpectedWorkflowId(0xYourWorkflowId); +``` -1. Update the forwarder address to the real `KeystoneForwarder` (if you configured it for simulation) -2. Configure additional metadata-based validation as needed +**Option 2: Update existing contract's forwarder** ```solidity -// Update to production KeystoneForwarder address -myConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Example: Ethereum Sepolia +// Update forwarder to production KeystoneForwarder +myConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia -// Now you can enable metadata-based validation +// Add metadata-based validation myConsumer.setExpectedWorkflowId(0xYourWorkflowId); ``` @@ -2746,6 +2564,8 @@ contract AdvancedConsumer is ReceiverTemplate { event MinReportIntervalUpdated(uint256 previousInterval, uint256 newInterval); + constructor(address _forwarderAddress) ReceiverTemplate(_forwarderAddress) {} + // Add custom validation before parent's checks function onReport(bytes calldata metadata, bytes calldata report) external override { // Custom check: Rate limiting @@ -2795,6 +2615,8 @@ The `_decodeMetadata` helper function is available for use in your `_processRepo contract MetadataAwareConsumer is ReceiverTemplate { mapping(bytes32 => uint256) public s_reportCountByWorkflow; + constructor(address _forwarderAddress) ReceiverTemplate(_forwarderAddress) {} + function _processReport(bytes calldata report) internal override { // Access the metadata to get workflow ID bytes calldata metadata = msg.data[4:]; // Skip function selector @@ -2830,8 +2652,8 @@ contract TemperatureConsumer is ReceiverTemplate { int256 public s_currentTemperature; event TemperatureUpdated(int256 newTemperature); - // Simple constructor - no parameters needed - constructor() ReceiverTemplate() {} + // Constructor requires forwarder address + constructor(address _forwarderAddress) ReceiverTemplate(_forwarderAddress) {} function _processReport(bytes calldata report) internal override { int256 newTemperature = abi.decode(report, (int256)); @@ -2841,13 +2663,22 @@ contract TemperatureConsumer is ReceiverTemplate { } ``` -**Configuring permissions after deployment:** +**Deployment:** ```solidity -// Enable forwarder check for production -temperatureConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia +// For simulation: Use MockForwarder address +address mockForwarder = 0x15fC6ae953E024d975e77382eEeC56A9101f9F88; // e.g. Ethereum Sepolia +TemperatureConsumer temperatureConsumer = new TemperatureConsumer(mockForwarder); -// Enable workflow ID check for highest security +// For production: Use KeystoneForwarder address +address keystoneForwarder = 0xF8344CFd5c43616a4366C34E3EEE75af79a74482; // e.g. Ethereum Sepolia +TemperatureConsumer temperatureConsumer = new TemperatureConsumer(keystoneForwarder); +``` + +**Adding additional security after deployment:** + +```solidity +// Add workflow ID check for highest security temperatureConsumer.setExpectedWorkflowId(0xYourWorkflowId...); ``` @@ -2948,7 +2779,7 @@ import { ReceiverTemplate } from "./ReceiverTemplate.sol"; contract UpdateReservesProxy is ReceiverTemplate { ReserveManager private s_reserveManager; - constructor(address reserveManagerAddress) { + constructor(address _forwarderAddress, address reserveManagerAddress) ReceiverTemplate(_forwarderAddress) { s_reserveManager = ReserveManager(reserveManagerAddress); } @@ -2969,10 +2800,7 @@ contract UpdateReservesProxy is ReceiverTemplate { **Configuring permissions after deployment:** ```solidity -// Enable forwarder check (recommended) -updateReservesProxy.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia - -// Enable workflow ID check for production (highest security) +// Additional validation can be added after deployment updateReservesProxy.setExpectedWorkflowId(0xYourWorkflowId...); ``` @@ -2986,7 +2814,7 @@ updateReservesProxy.setExpectedWorkflowId(0xYourWorkflowId...); The deployment and configuration process involves these steps: 1. **Deploy the Logic Contract**: Deploy `ReserveManager.sol`. The wallet that deploys this contract becomes its `owner`. -2. **Deploy the Proxy Contract**: Deploy `UpdateReservesProxy.sol`, passing the address of the deployed `ReserveManager` contract to its constructor. +2. **Deploy the Proxy Contract**: Deploy `UpdateReservesProxy.sol`, passing the forwarder address and the address of the deployed `ReserveManager` contract to its constructor. 3. **Link the Contracts**: The `owner` of the `ReserveManager` contract must call its `setProxyAddress` function, passing in the address of the `UpdateReservesProxy` contract. This authorizes the proxy to call the logic contract. 4. **Configure Permissions** (Recommended): The `owner` of the proxy should call setter functions to enable security checks: ```solidity @@ -2996,16 +2824,68 @@ The deployment and configuration process involves these steps: 5. **Configure Workflow**: In your workflow's `config.json`, use the address of the **Proxy Contract** as the receiver address. 6. **Execution Flow**: When your workflow runs: - The Chainlink Forwarder calls `onReport` on your **Proxy** - - The Proxy validates the report (forwarder address, workflow ID, etc.) + - The Proxy validates the report (forwarder address is verified automatically; additional checks like workflow ID can be added) - The Proxy's `_processReport` function calls the `updateReserves` function on your **Logic Contract** - Because the caller is the trusted proxy, the `onlyProxy` check passes, and your state is securely updated 7. **(Optional) Upgrade**: If you later need to deploy a new proxy, the owner can: - - Deploy the new proxy contract + - Deploy the new proxy contract with the appropriate forwarder address - Call `setProxyAddress` on the `ReserveManager` to point it to the new proxy's address - Update the workflow configuration to use the new proxy address #### End-to-End Sequence +## 7. Security Considerations + +### Forwarder address + +**The forwarder address is the foundation of your contract's security.** The `KeystoneForwarder` contract performs cryptographic verification of DON signatures before calling your consumer. By requiring the forwarder address in the constructor, `ReceiverTemplate` ensures your contract is secure from deployment. + + +<Aside type="caution" title="Never set forwarder to address(0) in production"> + While the `setForwarderAddress()` function allows updating to `address(0)`, this disables the critical security check and allows **anyone** to call your `onReport()` function with arbitrary data. The function emits a `SecurityWarning` event if you attempt this. Only use `address(0)` for testing if you fully understand the implications. +</Aside> + +### Replay protection + +The `KeystoneForwarder` contract includes built-in replay protection that prevents successful reports from being executed multiple times. By requiring the forwarder address at construction time, `ReceiverTemplate` ensures your consumer benefits from this protection automatically. + + +<Aside type="note" title="Failed reports can be retried"> + If a report fails (reverts), the forwarder's replay protection allows it to be retried. This is safe because reverts undo all state changes, ensuring no duplicate effects occur in your contract. +</Aside> + +### Additional validation layers + +The forwarder address provides baseline security, but you can add additional validation for defense-in-depth: + +- **`expectedWorkflowId`**: Ensures only one specific workflow can update your contract. Use this when a single workflow writes to your consumer (highest security for single-workflow scenarios). +- **`expectedAuthor`**: Restricts to workflows owned by a specific address. Use this when multiple workflows from the same owner should access your contract. +- **`expectedWorkflowName`**: Can be used in combination with `expectedAuthor` for additional validation. Requires author validation to be configured. See [Workflow name validation](#workflow-name-validation) below. + +### Workflow name validation + + +<Aside type="caution" title="Workflow name validation requires author validation"> + The `expectedWorkflowName` check in `ReceiverTemplate.onReport()` **requires author validation** to be configured: + + - **Collision Risk**: Workflow names use only 40-bit truncation (bytes10), making collision attacks computationally feasible when used alone + - **Unique per owner**: Workflow names are unique per owner but not across different owners + - **Runtime enforcement**: The code enforces that if `expectedWorkflowName` is set, `expectedAuthor` must also be set, otherwise it reverts with `WorkflowNameRequiresAuthorValidation()` + + By combining workflow name (40-bit) with author validation (160-bit address), the contract achieves adequate collision resistance. You can safely use workflow name validation as long as author validation is also enabled. +</Aside> + +### Best practices + +1. **Always deploy with a valid forwarder address** - The constructor requires this for security. Use `MockForwarder` for simulation, `KeystoneForwarder` for production. Forwarder addresses are available in the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page. +2. **Add additional validation for production**: + - **Single workflow**: Use `setExpectedWorkflowId()` to restrict to one specific workflow (highest security) + - **Multiple workflows from same owner**: Use `setExpectedAuthor()` to restrict to workflows you own + - **Multiple workflows from different owners**: Implement custom validation logic in your `onReport()` override +3. **Keep your owner key secure** - The owner can update all permission settings +4. **Test permission configurations** - Verify your security settings work as expected before production deployment +5. **Workflow name validation** - Can be used with `setExpectedWorkflowName()` but requires `setExpectedAuthor()` to also be configured for security + --- # Using WriteReportFrom Helpers diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index a6c48dca892..7c3c0baa2aa 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -1932,12 +1932,13 @@ This guide explains how to build a consumer contract that can securely receive a **In this guide:** -- [Core Concepts: The Onchain Data Flow](#1-core-concepts-the-onchain-data-flow) -- [The IReceiver Standard](#2-the-ireceiver-standard) -- [Using ReceiverTemplate](#3-using-receivertemplate) -- [Working with Simulation](#4-working-with-simulation) -- [Advanced Usage](#5-advanced-usage-optional) -- [Complete Examples](#6-complete-examples) +1. [Core Concepts: The Onchain Data Flow](#1-core-concepts-the-onchain-data-flow) +2. [The IReceiver Standard](#2-the-ireceiver-standard) +3. [Using ReceiverTemplate](#3-using-receivertemplate) +4. [Working with Simulation](#4-working-with-simulation) +5. [Advanced Usage](#5-advanced-usage-optional) +6. [Complete Examples](#6-complete-examples) +7. [Security Considerations](#7-security-considerations) ## 1. Core Concepts: The Onchain Data Flow @@ -1954,12 +1955,6 @@ To be a valid target for the `KeystoneForwarder`, your consumer contract must sa The `KeystoneForwarder` needs a standardized function to call. This is defined by the `IReceiver` interface, which mandates an `onReport` function. -```solidity -interface IReceiver is IERC165 { - function onReport(bytes calldata metadata, bytes calldata report) external; -} -``` - - `metadata`: Contains information about the workflow (ID, name, owner). This is encoded by the Forwarder using `abi.encodePacked` with the following structure: `bytes32 workflowId`, `bytes10 workflowName`, `address workflowOwner`. - `report`: The raw, ABI-encoded data payload from your workflow. @@ -1967,6 +1962,8 @@ interface IReceiver is IERC165 { [ERC165](https://eips.ethereum.org/EIPS/eip-165) is a standard that allows contracts to publish the interfaces they support. The `KeystoneForwarder` uses this to check if your contract supports the `IReceiver` interface before sending a report. +Link to the `IERC165` interface: [IERC165.sol](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol) + ## 3. Using `ReceiverTemplate` ### 3.1 Overview @@ -1975,8 +1972,9 @@ While you can implement these standards manually, we provide an abstract contrac **Key features:** -- **Optional Permission Controls**: Choose your security level—enable forwarder address checks, workflow ID validation, workflow owner verification, or any combination -- **Flexible and Updatable**: All permission settings can be configured and updated via setter functions after deployment +- **Secure by Default**: Requires forwarder address at deployment, ensuring your contract is protected from the start +- **Layered Security**: Add optional workflow ID validation, workflow owner verification, or any combination for defense-in-depth +- **Flexible Configuration**: All permission settings can be updated via setter functions after deployment - **Simplified Logic**: You only need to implement `_processReport(bytes calldata report)` with your business logic - **Built-in Access Control**: Includes OpenZeppelin's `Ownable` for secure permission management - **ERC165 Support**: Includes the necessary `supportsInterface` function @@ -1984,218 +1982,13 @@ While you can implement these standards manually, we provide an abstract contrac ### 3.2 Contract Source Code -```solidity -// 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 All permission fields default to zero (disabled). Use setter functions to enable checks. -abstract contract ReceiverTemplate is IReceiver, Ownable { - // Optional permission fields (all default to zero = disabled) - address private s_forwarderAddress; // If set, only this address can call onReport - address private s_expectedAuthor; // If set, only reports from this workflow owner are accepted - bytes10 private s_expectedWorkflowName; // If set, only reports with this workflow name are accepted - 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 InvalidSender(address sender, address expected); - error InvalidAuthor(address received, address expected); - error InvalidWorkflowName(bytes10 received, bytes10 expected); - error InvalidWorkflowId(bytes32 received, bytes32 expected); - - // 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); - - /// @notice Constructor sets msg.sender as the owner - /// @dev All permission fields are initialized to zero (disabled by default) - constructor() Ownable(msg.sender) {} - - /// @notice Returns the configured forwarder address - /// @return The forwarder address (address(0) if not set) - 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); - } - if (s_expectedWorkflowName != bytes10(0) && 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 (use address(0) to disable this check) - function setForwarderAddress(address _forwarder) external onlyOwner { - address previousForwarder = s_forwarderAddress; - 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 The name is hashed using SHA256 and truncated - 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 pure virtual override returns (bool) { - return interfaceId == type(IReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; - } -} -``` - ### 3.3 Quick Start The simplest way to use `ReceiverTemplate` is to inherit from it and implement the `_processReport` function: -```solidity -// 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); - - // Simple constructor - no parameters needed - constructor() ReceiverTemplate() {} - - // Implement your business logic here - function _processReport(bytes calldata report) internal override { - uint256 newValue = abi.decode(report, (uint256)); - s_storedValue = newValue; - emit ValueUpdated(newValue); - } -} -``` - ### 3.4 Configuring Permissions -After deploying your contract, the owner can enable any combination of security checks using the setter functions. +The forwarder address is configured at deployment via the constructor and provides your first line of defense. After deploying your contract, the owner can configure additional security checks or update the forwarder address if needed. <Aside type="caution" title="For simulation"> @@ -2204,21 +1997,23 @@ After deploying your contract, the owner can enable any combination of security <Aside type="tip" title="Finding forwarder addresses"> - For a complete list of `KeystoneForwarder` contract addresses on all supported networks, see [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks). + For a complete list of `KeystoneForwarder` and `MockForwarder` contract addresses on all supported networks, see [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks). </Aside> **Configuration examples:** ```solidity -// Example: Enable forwarder check only -myConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia +// Example: Update forwarder address (e.g., when moving from simulation to production) +myConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia KeystoneForwarder -// Example: Enable workflow ID check +// Example: Add workflow ID check for additional security myConsumer.setExpectedWorkflowId(0x1234...); // Your specific workflow ID -// Example: Enable workflow owner and name checks +// Example: Add workflow owner check myConsumer.setExpectedAuthor(0xYourAddress...); -myConsumer.setExpectedWorkflowName("my_workflow"); // The plaintext workflow name + +// Example: Add workflow name check (requires author validation to be set) +myConsumer.setExpectedWorkflowName("my_workflow"); // Example: Disable a check later myConsumer.setExpectedWorkflowName(""); // Empty string disables the check @@ -2226,23 +2021,27 @@ myConsumer.setExpectedWorkflowName(""); // Empty string disables the check <Aside type="tip" title="Recommended production setup"> - For production contracts, we recommend enabling at minimum the `forwarderAddress` check. For highest security, combine it with `expectedWorkflowId` to ensure only your specific workflow can update the contract. + The forwarder address is required at deployment and provides basic security. For production contracts, we strongly recommend adding additional validation: + + - Use `setExpectedWorkflowId()` if only one workflow writes to your contract (highest security) + - Use `setExpectedAuthor()` if multiple workflows from the same owner write to your contract </Aside> **What the template handles for you:** -- Validates the caller address (if `forwarderAddress` is set) -- Validates the workflow ID (if `expectedWorkflowId` is set) -- Validates the workflow owner (if `expectedAuthor` is set) -- Validates the workflow name (if `expectedWorkflowName` is set) -- Validates the ERC165 interface detection -- Validates the Access control via OpenZeppelin's `Ownable` +- Validates the caller address against the configured forwarder (required at deployment) +- Validates the workflow ID (if `expectedWorkflowId` is configured) +- Validates the workflow owner (if `expectedAuthor` is configured) +- Validates the workflow name (if both `expectedWorkflowName` AND `expectedAuthor` are configured) +- Implements ERC165 interface detection +- Provides access control via OpenZeppelin's `Ownable` - Calls your `_processReport` function with validated data **What you implement:** +- Pass the forwarder address to the constructor during deployment - Your business logic in `_processReport` -- (Optional) Configure permissions after deployment using setter functions +- (Optional) Configure additional permissions after deployment using setter functions #### How workflow names are encoded @@ -2257,14 +2056,22 @@ The `workflowName` field in the metadata uses the **`bytes10`** type rather than This encoding ensures consistent, fixed-size representation regardless of the original workflow name length. + +<Aside type="caution" title="Workflow name validation requires author validation"> + Workflow name validation is **only performed when author validation is also configured**. The code enforces this at runtime: if you set `expectedWorkflowName`, you must also set `expectedAuthor`, otherwise the validation will revert with `WorkflowNameRequiresAuthorValidation()`. This prevents the 40-bit collision attack by ensuring workflow names are validated in combination with the owner address. See [Security Considerations](#7-security-considerations) for details. +</Aside> + **Usage:** ```solidity -// Just use the plaintext workflow name - the interface handles the encoding automatically +// Set the expected author first (required) +myConsumer.setExpectedAuthor(0xYourAddress...); + +// Then set the expected workflow name (only works with author validation) myConsumer.setExpectedWorkflowName("my_workflow"); -// To disable the check later -myConsumer.setExpectedWorkflowName(""); // Empty string disables the check +// To disable the workflow name check +myConsumer.setExpectedWorkflowName(""); // Empty string clears the stored value ``` ## 4. Working with Simulation @@ -2275,20 +2082,21 @@ When you run `cre workflow simulate`, your workflow interacts with a **`MockKeys This is a **temporary limitation** until the `MockKeystoneForwarder` is updated to provide full metadata. </Aside> -### Forwarder address validation +### Deploying for Simulation -You **can** configure the forwarder address check during simulation using the **Mock Forwarder Address**: +When deploying your consumer contract for simulation, pass the **Mock Forwarder address** to the constructor: ```solidity -// Example: Use Mock Forwarder for Ethereum Sepolia simulation -myConsumer.setForwarderAddress(0x15fC6ae953E024d975e77382eEeC56A9101f9F88); +// Deploy with MockForwarder address for Ethereum Sepolia simulation +address mockForwarder = 0x15fC6ae953E024d975e77382eEeC56A9101f9F88; // Ethereum Sepolia MockForwarder +MyConsumer myConsumer = new MyConsumer(mockForwarder); ``` Find Mock Forwarder addresses for all networks in the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page. <Aside type="caution" title="Important: Different addresses for simulation vs production"> - The `MockKeystoneForwarder` address used during simulation is **different** from the `KeystoneForwarder` address used by deployed workflows. If you configure the forwarder address for simulation, remember to update it to the production `KeystoneForwarder` address after deploying. See [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) for forwarder addresses. + The `MockKeystoneForwarder` address used during simulation is **different** from the `KeystoneForwarder` address used by deployed workflows. After testing with simulation, deploy a new instance with the production `KeystoneForwarder` address, or update the forwarder address using `setForwarderAddress()`. See [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) for forwarder addresses. </Aside> ### Metadata-based validation @@ -2301,18 +2109,28 @@ Find Mock Forwarder addresses for all networks in the [Supported Networks](/cre/ Setting any of these will cause your simulation to fail. -### After deployment +### Transitioning to Production + +Once you're ready to deploy your workflow to production: + +**Option 1: Deploy a new contract instance** -Once you deploy your workflow: +```solidity +// Deploy with production KeystoneForwarder address +address keystoneForwarder = 0xF8344CFd5c43616a4366C34E3EEE75af79a74482; // Ethereum Sepolia +MyConsumer myConsumer = new MyConsumer(keystoneForwarder); + +// Configure additional security checks +myConsumer.setExpectedWorkflowId(0xYourWorkflowId); +``` -1. Update the forwarder address to the real `KeystoneForwarder` (if you configured it for simulation) -2. Configure additional metadata-based validation as needed +**Option 2: Update existing contract's forwarder** ```solidity -// Update to production KeystoneForwarder address -myConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Example: Ethereum Sepolia +// Update forwarder to production KeystoneForwarder +myConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia -// Now you can enable metadata-based validation +// Add metadata-based validation myConsumer.setExpectedWorkflowId(0xYourWorkflowId); ``` @@ -2335,6 +2153,8 @@ contract AdvancedConsumer is ReceiverTemplate { event MinReportIntervalUpdated(uint256 previousInterval, uint256 newInterval); + constructor(address _forwarderAddress) ReceiverTemplate(_forwarderAddress) {} + // Add custom validation before parent's checks function onReport(bytes calldata metadata, bytes calldata report) external override { // Custom check: Rate limiting @@ -2384,6 +2204,8 @@ The `_decodeMetadata` helper function is available for use in your `_processRepo contract MetadataAwareConsumer is ReceiverTemplate { mapping(bytes32 => uint256) public s_reportCountByWorkflow; + constructor(address _forwarderAddress) ReceiverTemplate(_forwarderAddress) {} + function _processReport(bytes calldata report) internal override { // Access the metadata to get workflow ID bytes calldata metadata = msg.data[4:]; // Skip function selector @@ -2419,8 +2241,8 @@ contract TemperatureConsumer is ReceiverTemplate { int256 public s_currentTemperature; event TemperatureUpdated(int256 newTemperature); - // Simple constructor - no parameters needed - constructor() ReceiverTemplate() {} + // Constructor requires forwarder address + constructor(address _forwarderAddress) ReceiverTemplate(_forwarderAddress) {} function _processReport(bytes calldata report) internal override { int256 newTemperature = abi.decode(report, (int256)); @@ -2430,13 +2252,22 @@ contract TemperatureConsumer is ReceiverTemplate { } ``` -**Configuring permissions after deployment:** +**Deployment:** ```solidity -// Enable forwarder check for production -temperatureConsumer.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia +// For simulation: Use MockForwarder address +address mockForwarder = 0x15fC6ae953E024d975e77382eEeC56A9101f9F88; // e.g. Ethereum Sepolia +TemperatureConsumer temperatureConsumer = new TemperatureConsumer(mockForwarder); + +// For production: Use KeystoneForwarder address +address keystoneForwarder = 0xF8344CFd5c43616a4366C34E3EEE75af79a74482; // e.g. Ethereum Sepolia +TemperatureConsumer temperatureConsumer = new TemperatureConsumer(keystoneForwarder); +``` + +**Adding additional security after deployment:** -// Enable workflow ID check for highest security +```solidity +// Add workflow ID check for highest security temperatureConsumer.setExpectedWorkflowId(0xYourWorkflowId...); ``` @@ -2537,7 +2368,7 @@ import { ReceiverTemplate } from "./ReceiverTemplate.sol"; contract UpdateReservesProxy is ReceiverTemplate { ReserveManager private s_reserveManager; - constructor(address reserveManagerAddress) { + constructor(address _forwarderAddress, address reserveManagerAddress) ReceiverTemplate(_forwarderAddress) { s_reserveManager = ReserveManager(reserveManagerAddress); } @@ -2558,10 +2389,7 @@ contract UpdateReservesProxy is ReceiverTemplate { **Configuring permissions after deployment:** ```solidity -// Enable forwarder check (recommended) -updateReservesProxy.setForwarderAddress(0xF8344CFd5c43616a4366C34E3EEE75af79a74482); // Ethereum Sepolia - -// Enable workflow ID check for production (highest security) +// Additional validation can be added after deployment updateReservesProxy.setExpectedWorkflowId(0xYourWorkflowId...); ``` @@ -2575,7 +2403,7 @@ updateReservesProxy.setExpectedWorkflowId(0xYourWorkflowId...); The deployment and configuration process involves these steps: 1. **Deploy the Logic Contract**: Deploy `ReserveManager.sol`. The wallet that deploys this contract becomes its `owner`. -2. **Deploy the Proxy Contract**: Deploy `UpdateReservesProxy.sol`, passing the address of the deployed `ReserveManager` contract to its constructor. +2. **Deploy the Proxy Contract**: Deploy `UpdateReservesProxy.sol`, passing the forwarder address and the address of the deployed `ReserveManager` contract to its constructor. 3. **Link the Contracts**: The `owner` of the `ReserveManager` contract must call its `setProxyAddress` function, passing in the address of the `UpdateReservesProxy` contract. This authorizes the proxy to call the logic contract. 4. **Configure Permissions** (Recommended): The `owner` of the proxy should call setter functions to enable security checks: ```solidity @@ -2585,16 +2413,68 @@ The deployment and configuration process involves these steps: 5. **Configure Workflow**: In your workflow's `config.json`, use the address of the **Proxy Contract** as the receiver address. 6. **Execution Flow**: When your workflow runs: - The Chainlink Forwarder calls `onReport` on your **Proxy** - - The Proxy validates the report (forwarder address, workflow ID, etc.) + - The Proxy validates the report (forwarder address is verified automatically; additional checks like workflow ID can be added) - The Proxy's `_processReport` function calls the `updateReserves` function on your **Logic Contract** - Because the caller is the trusted proxy, the `onlyProxy` check passes, and your state is securely updated 7. **(Optional) Upgrade**: If you later need to deploy a new proxy, the owner can: - - Deploy the new proxy contract + - Deploy the new proxy contract with the appropriate forwarder address - Call `setProxyAddress` on the `ReserveManager` to point it to the new proxy's address - Update the workflow configuration to use the new proxy address #### End-to-End Sequence +## 7. Security Considerations + +### Forwarder address + +**The forwarder address is the foundation of your contract's security.** The `KeystoneForwarder` contract performs cryptographic verification of DON signatures before calling your consumer. By requiring the forwarder address in the constructor, `ReceiverTemplate` ensures your contract is secure from deployment. + + +<Aside type="caution" title="Never set forwarder to address(0) in production"> + While the `setForwarderAddress()` function allows updating to `address(0)`, this disables the critical security check and allows **anyone** to call your `onReport()` function with arbitrary data. The function emits a `SecurityWarning` event if you attempt this. Only use `address(0)` for testing if you fully understand the implications. +</Aside> + +### Replay protection + +The `KeystoneForwarder` contract includes built-in replay protection that prevents successful reports from being executed multiple times. By requiring the forwarder address at construction time, `ReceiverTemplate` ensures your consumer benefits from this protection automatically. + + +<Aside type="note" title="Failed reports can be retried"> + If a report fails (reverts), the forwarder's replay protection allows it to be retried. This is safe because reverts undo all state changes, ensuring no duplicate effects occur in your contract. +</Aside> + +### Additional validation layers + +The forwarder address provides baseline security, but you can add additional validation for defense-in-depth: + +- **`expectedWorkflowId`**: Ensures only one specific workflow can update your contract. Use this when a single workflow writes to your consumer (highest security for single-workflow scenarios). +- **`expectedAuthor`**: Restricts to workflows owned by a specific address. Use this when multiple workflows from the same owner should access your contract. +- **`expectedWorkflowName`**: Can be used in combination with `expectedAuthor` for additional validation. Requires author validation to be configured. See [Workflow name validation](#workflow-name-validation) below. + +### Workflow name validation + + +<Aside type="caution" title="Workflow name validation requires author validation"> + The `expectedWorkflowName` check in `ReceiverTemplate.onReport()` **requires author validation** to be configured: + + - **Collision Risk**: Workflow names use only 40-bit truncation (bytes10), making collision attacks computationally feasible when used alone + - **Unique per owner**: Workflow names are unique per owner but not across different owners + - **Runtime enforcement**: The code enforces that if `expectedWorkflowName` is set, `expectedAuthor` must also be set, otherwise it reverts with `WorkflowNameRequiresAuthorValidation()` + + By combining workflow name (40-bit) with author validation (160-bit address), the contract achieves adequate collision resistance. You can safely use workflow name validation as long as author validation is also enabled. +</Aside> + +### Best practices + +1. **Always deploy with a valid forwarder address** - The constructor requires this for security. Use `MockForwarder` for simulation, `KeystoneForwarder` for production. Forwarder addresses are available in the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page. +2. **Add additional validation for production**: + - **Single workflow**: Use `setExpectedWorkflowId()` to restrict to one specific workflow (highest security) + - **Multiple workflows from same owner**: Use `setExpectedAuthor()` to restrict to workflows you own + - **Multiple workflows from different owners**: Implement custom validation logic in your `onReport()` override +3. **Keep your owner key secure** - The owner can update all permission settings +4. **Test permission configurations** - Verify your security settings work as expected before production deployment +5. **Workflow name validation** - Can be used with `setExpectedWorkflowName()` but requires `setExpectedAuthor()` to also be configured for security + --- # Writing Data Onchain From 468f2c8d44cb65aa1d6c2f4fafcb4120a4c4cc07 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Fri, 9 Jan 2026 11:29:38 -0500 Subject: [PATCH 101/214] Update llm gen script to include CodeSample snippets (#3345) * update llm gen script to include CodeSample snippets * regen --- src/content/ccip/llms-full.txt | 4088 ++++++++++++++++- .../chainlink-automation/llms-full.txt | 580 ++- src/content/chainlink-functions/llms-full.txt | 739 +++ src/content/chainlink-local/llms-full.txt | 174 + src/content/chainlink-nodes/llms-full.txt | 143 + src/content/cre/llms-full-go.txt | 291 ++ src/content/cre/llms-full-ts.txt | 291 ++ src/content/data-feeds/llms-full.txt | 761 ++- src/content/data-streams/llms-full.txt | 664 +++ src/content/datalink/llms-full.txt | 442 ++ src/content/getting-started/llms-full.txt | 58 + src/content/vrf/llms-full.txt | 2656 ++++++++++- src/scripts/generate-llms.ts | 47 + 13 files changed, 10825 insertions(+), 109 deletions(-) diff --git a/src/content/ccip/llms-full.txt b/src/content/ccip/llms-full.txt index aaec728225f..f3c3cd38e3f 100644 --- a/src/content/ccip/llms-full.txt +++ b/src/content/ccip/llms-full.txt @@ -114,6 +114,113 @@ Deploy the `Sender.sol` contract on *Avalanche Fuji*. To see a detailed explanat 1. [Open the Sender.sol contract](https://remix.ethereum.org/#url=https://docs.chain.link/samples/CCIP/Sender.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + 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"; + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + + /// @title - A simple contract for sending string data across chains. + contract Sender is OwnerIsCreator { + // Custom errors to provide more descriptive revert messages. + error NotEnoughBalance(uint256 currentBalance, uint256 calculatedFees); // Used to make sure contract has enough + // balance. + + // Event emitted when a message is sent to another chain. + // The chain selector of the destination chain. + // The address of the receiver on the destination chain. + // The text being sent. + // the token address used to pay CCIP fees. + // The fees paid for sending the CCIP message. + event MessageSent( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address receiver, + string text, + address feeToken, + uint256 fees + ); + + IRouterClient private s_router; + + LinkTokenInterface private s_linkToken; + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + constructor( + address _router, + address _link + ) { + s_router = IRouterClient(_router); + s_linkToken = LinkTokenInterface(_link); + } + + /// @notice Sends data to receiver on the destination chain. + /// @dev Assumes your contract has sufficient LINK. + /// @param destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param receiver The address of the recipient on the destination blockchain. + /// @param text The string text to be sent. + /// @return messageId The ID of the message that was sent. + function sendMessage( + uint64 destinationChainSelector, + address receiver, + string calldata text + ) external onlyOwner returns (bytes32 messageId) { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + Client.EVM2AnyMessage memory evm2AnyMessage = Client.EVM2AnyMessage({ + receiver: abi.encode(receiver), // ABI-encoded receiver address + data: abi.encode(text), // ABI-encoded string + tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array indicating no tokens are being sent + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: 200_000, // Gas limit for the callback on the destination chain + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender + }) + ), + // Set the feeToken address, indicating LINK will be used for fees + feeToken: address(s_linkToken) + }); + + // Get the fee required to send the message + uint256 fees = s_router.getFee(destinationChainSelector, evm2AnyMessage); + + if (fees > s_linkToken.balanceOf(address(this))) { + revert NotEnoughBalance(s_linkToken.balanceOf(address(this)), fees); + } + + // approve the Router to transfer LINK tokens on contract's behalf. It will spend the fees in LINK + s_linkToken.approve(address(s_router), fees); + + // Send the message through the router and store the returned message ID + messageId = s_router.ccipSend(destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit MessageSent(messageId, destinationChainSelector, receiver, text, address(s_linkToken), fees); + + // Return the message ID + return messageId; + } + } + ``` + 2. Compile the contract. 3. Deploy the sender contract on *Avalanche Fuji*: @@ -138,6 +245,65 @@ Deploy the receiver contract on *Ethereum Sepolia*. You will use this contract t 1. [Open the Receiver.sol](https://remix.ethereum.org/#url=https://docs.chain.link/samples/CCIP/Receiver.sol) contract in Remix. + ```sol + // SPDX-License-Identifier: MIT + pragma solidity 0.8.24; + + import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.sol"; + import {Client} from "@chainlink/contracts-ccip/contracts/libraries/Client.sol"; + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + + /// @title - A simple contract for receiving string data across chains. + contract Receiver is CCIPReceiver { + // Event emitted when a message is received from another chain. + event MessageReceived( // The unique ID of the message. + // The chain selector of the source chain. + // The address of the sender from the source chain. + // The text that was received. + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address sender, + string text + ); + + bytes32 private s_lastReceivedMessageId; // Store the last received messageId. + string private s_lastReceivedText; // Store the last received text. + + /// @notice Constructor initializes the contract with the router address. + /// @param router The address of the router contract. + constructor( + address router + ) CCIPReceiver(router) {} + + /// handle a received message + function _ccipReceive( + Client.Any2EVMMessage memory any2EvmMessage + ) internal override { + s_lastReceivedMessageId = any2EvmMessage.messageId; // fetch the messageId + s_lastReceivedText = abi.decode(any2EvmMessage.data, (string)); // abi-decoding of the sent text + + emit MessageReceived( + any2EvmMessage.messageId, + any2EvmMessage.sourceChainSelector, // fetch the source chain identifier (aka selector) + abi.decode(any2EvmMessage.sender, (address)), // abi-decoding of the sender address, + abi.decode(any2EvmMessage.data, (string)) + ); + } + + /// @notice Fetches the details of the last received message. + /// @return messageId The ID of the last received message. + /// @return text The last received text. + function getLastReceivedMessageDetails() external view returns (bytes32 messageId, string memory text) { + return (s_lastReceivedMessageId, s_lastReceivedText); + } + } + ``` + 2. Compile the contract. 3. Deploy the receiver contract on *Ethereum Sepolia*: @@ -200,6 +366,113 @@ Congratulations! You just sent your first cross-chain data using CCIP. Next, exa The smart contract in this tutorial is designed to interact with CCIP to send data. The contract code includes comments to clarify the various functions, events, and underlying logic. However, this section explains the key elements. You can see the full contract code below. +```sol +// SPDX-License-Identifier: MIT +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"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/// @title - A simple contract for sending string data across chains. +contract Sender is OwnerIsCreator { + // Custom errors to provide more descriptive revert messages. + error NotEnoughBalance(uint256 currentBalance, uint256 calculatedFees); // Used to make sure contract has enough + // balance. + + // Event emitted when a message is sent to another chain. + // The chain selector of the destination chain. + // The address of the receiver on the destination chain. + // The text being sent. + // the token address used to pay CCIP fees. + // The fees paid for sending the CCIP message. + event MessageSent( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address receiver, + string text, + address feeToken, + uint256 fees + ); + + IRouterClient private s_router; + + LinkTokenInterface private s_linkToken; + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + constructor( + address _router, + address _link + ) { + s_router = IRouterClient(_router); + s_linkToken = LinkTokenInterface(_link); + } + + /// @notice Sends data to receiver on the destination chain. + /// @dev Assumes your contract has sufficient LINK. + /// @param destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param receiver The address of the recipient on the destination blockchain. + /// @param text The string text to be sent. + /// @return messageId The ID of the message that was sent. + function sendMessage( + uint64 destinationChainSelector, + address receiver, + string calldata text + ) external onlyOwner returns (bytes32 messageId) { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + Client.EVM2AnyMessage memory evm2AnyMessage = Client.EVM2AnyMessage({ + receiver: abi.encode(receiver), // ABI-encoded receiver address + data: abi.encode(text), // ABI-encoded string + tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array indicating no tokens are being sent + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: 200_000, // Gas limit for the callback on the destination chain + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender + }) + ), + // Set the feeToken address, indicating LINK will be used for fees + feeToken: address(s_linkToken) + }); + + // Get the fee required to send the message + uint256 fees = s_router.getFee(destinationChainSelector, evm2AnyMessage); + + if (fees > s_linkToken.balanceOf(address(this))) { + revert NotEnoughBalance(s_linkToken.balanceOf(address(this)), fees); + } + + // approve the Router to transfer LINK tokens on contract's behalf. It will spend the fees in LINK + s_linkToken.approve(address(s_router), fees); + + // Send the message through the router and store the returned message ID + messageId = s_router.ccipSend(destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit MessageSent(messageId, destinationChainSelector, receiver, text, address(s_linkToken), fees); + + // Return the message ID + return messageId; + } +} +``` + #### Initializing the contract When deploying the contract, you define the router address and the LINK contract address of the blockchain where you choose to deploy the contract. @@ -246,6 +519,65 @@ The `sendMessage` function completes several operations: The smart contract in this tutorial is designed to interact with CCIP to receive data. The contract code includes comments to clarify the various functions, events, and underlying logic. However, this section explains the key elements. You can see the full contract code below. +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.sol"; +import {Client} from "@chainlink/contracts-ccip/contracts/libraries/Client.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/// @title - A simple contract for receiving string data across chains. +contract Receiver is CCIPReceiver { + // Event emitted when a message is received from another chain. + event MessageReceived( // The unique ID of the message. + // The chain selector of the source chain. + // The address of the sender from the source chain. + // The text that was received. + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address sender, + string text + ); + + bytes32 private s_lastReceivedMessageId; // Store the last received messageId. + string private s_lastReceivedText; // Store the last received text. + + /// @notice Constructor initializes the contract with the router address. + /// @param router The address of the router contract. + constructor( + address router + ) CCIPReceiver(router) {} + + /// handle a received message + function _ccipReceive( + Client.Any2EVMMessage memory any2EvmMessage + ) internal override { + s_lastReceivedMessageId = any2EvmMessage.messageId; // fetch the messageId + s_lastReceivedText = abi.decode(any2EvmMessage.data, (string)); // abi-decoding of the sent text + + emit MessageReceived( + any2EvmMessage.messageId, + any2EvmMessage.sourceChainSelector, // fetch the source chain identifier (aka selector) + abi.decode(any2EvmMessage.sender, (address)), // abi-decoding of the sender address, + abi.decode(any2EvmMessage.data, (string)) + ); + } + + /// @notice Fetches the details of the last received message. + /// @return messageId The ID of the last received message. + /// @return text The last received text. + function getLastReceivedMessageDetails() external view returns (bytes32 messageId, string memory text) { + return (s_lastReceivedMessageId, s_lastReceivedText); + } +} +``` + #### Initializing the contract When you deploy the contract, you define the router address. The receiver contract inherits from the [CCIPReceiver.sol](/ccip/api-reference/evm/v1.6.1/ccip-receiver) contract, which uses the router address. @@ -5115,6 +5447,299 @@ In this tutorial, you will use Chainlink CCIP to transfer tokens from a smart co In this tutorial, you will transfer [CCIP-BnM](/ccip/test-tokens#about-ccip-test-tokens) tokens from a contract on Avalanche Fuji to an account on Ethereum Sepolia. First, you will pay [CCIP fees in LINK](#transfer-tokens-and-pay-in-link), then you will pay [CCIP fees in native gas](#transfer-tokens-and-pay-in-native). The destination account can be an [EOA (Externally Owned Account)](https://ethereum.org/en/developers/docs/accounts/#types-of-account) or a smart contract. Moreover, the example shows how to transfer CCIP-BnM tokens, but you can re-use the same example to transfer other tokens as long as they are supported for your [lane](/ccip/concepts/architecture/key-concepts#lane). +```sol +// SPDX-License-Identifier: MIT +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 {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/// @title - A simple contract for transferring tokens across chains. +contract TokenTransferor is OwnerIsCreator { + using SafeERC20 for IERC20; + + // Custom errors to provide more descriptive revert messages. + error NotEnoughBalance(uint256 currentBalance, uint256 requiredBalance); // Used to make sure contract has enough + // token balance + error NothingToWithdraw(); // Used when trying to withdraw Ether but there's nothing to withdraw. + error FailedToWithdrawEth(address owner, address target, uint256 value); // Used when the withdrawal of Ether fails. + error DestinationChainNotAllowlisted(uint64 destinationChainSelector); // Used when the destination chain has not been + // allowlisted by the contract owner. + error InvalidReceiverAddress(); // Used when the receiver address is 0. + // Event emitted when the tokens are transferred to an account on another chain. + + // The chain selector of the destination chain. + // The address of the receiver on the destination chain. + // The token address that was transferred. + // The token amount that was transferred. + // the token address used to pay CCIP fees. + // The fees paid for sending the message. + event TokensTransferred( // The unique ID of the message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address receiver, + address token, + uint256 tokenAmount, + address feeToken, + uint256 fees + ); + + // Mapping to keep track of allowlisted destination chains. + mapping(uint64 => bool) public allowlistedChains; + + IRouterClient private s_router; + + IERC20 private s_linkToken; + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + constructor( + address _router, + address _link + ) { + s_router = IRouterClient(_router); + s_linkToken = IERC20(_link); + } + + /// @dev Modifier that checks if the chain with the given destinationChainSelector is allowlisted. + /// @param _destinationChainSelector The selector of the destination chain. + modifier onlyAllowlistedChain( + uint64 _destinationChainSelector + ) { + if (!allowlistedChains[_destinationChainSelector]) { + revert DestinationChainNotAllowlisted(_destinationChainSelector); + } + _; + } + + /// @dev Modifier that checks the receiver address is not 0. + /// @param _receiver The receiver address. + modifier validateReceiver( + address _receiver + ) { + if (_receiver == address(0)) revert InvalidReceiverAddress(); + _; + } + + /// @dev Updates the allowlist status of a destination chain for transactions. + /// @notice This function can only be called by the owner. + /// @param _destinationChainSelector The selector of the destination chain to be updated. + /// @param allowed The allowlist status to be set for the destination chain. + function allowlistDestinationChain( + uint64 _destinationChainSelector, + bool allowed + ) external onlyOwner { + allowlistedChains[_destinationChainSelector] = allowed; + } + + /// @notice Transfer tokens to receiver on the destination chain. + /// @notice pay in LINK. + /// @notice the token must be in the list of supported tokens. + /// @notice This function can only be called by the owner. + /// @dev Assumes your contract has sufficient LINK tokens to pay for the fees. + /// @param _destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param _receiver The address of the recipient on the destination blockchain. + /// @param _token token address. + /// @param _amount token amount. + /// @return messageId The ID of the message that was sent. + function transferTokensPayLINK( + uint64 _destinationChainSelector, + address _receiver, + address _token, + uint256 _amount + ) + external + onlyOwner + onlyAllowlistedChain(_destinationChainSelector) + validateReceiver(_receiver) + returns (bytes32 messageId) + { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + // address(linkToken) means fees are paid in LINK + Client.EVM2AnyMessage memory evm2AnyMessage = _buildCCIPMessage(_receiver, _token, _amount, address(s_linkToken)); + + // Get the fee required to send the message + uint256 fees = s_router.getFee(_destinationChainSelector, evm2AnyMessage); + + uint256 requiredLinkBalance; + if (_token == address(s_linkToken)) { + // Required LINK Balance is the sum of fees and amount to transfer, if the token to transfer is LINK + requiredLinkBalance = fees + _amount; + } else { + requiredLinkBalance = fees; + } + + uint256 linkBalance = s_linkToken.balanceOf(address(this)); + + if (requiredLinkBalance > linkBalance) { + revert NotEnoughBalance(linkBalance, requiredLinkBalance); + } + + // approve the Router to transfer LINK tokens on contract's behalf. It will spend the requiredLinkBalance + s_linkToken.approve(address(s_router), requiredLinkBalance); + + // If sending a token other than LINK, approve it separately + if (_token != address(s_linkToken)) { + uint256 tokenBalance = IERC20(_token).balanceOf(address(this)); + if (_amount > tokenBalance) { + revert NotEnoughBalance(tokenBalance, _amount); + } + // approve the Router to spend tokens on contract's behalf. It will spend the amount of the given token + IERC20(_token).approve(address(s_router), _amount); + } + + // Send the message through the router and store the returned message ID + messageId = s_router.ccipSend(_destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit TokensTransferred(messageId, _destinationChainSelector, _receiver, _token, _amount, address(s_linkToken), fees); + + // Return the message ID + return messageId; + } + + /// @notice Transfer tokens to receiver on the destination chain. + /// @notice Pay in native gas such as ETH on Ethereum or POL on Polygon. + /// @notice the token must be in the list of supported tokens. + /// @notice This function can only be called by the owner. + /// @dev Assumes your contract has sufficient native gas like ETH on Ethereum or POL on Polygon. + /// @param _destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param _receiver The address of the recipient on the destination blockchain. + /// @param _token token address. + /// @param _amount token amount. + /// @return messageId The ID of the message that was sent. + function transferTokensPayNative( + uint64 _destinationChainSelector, + address _receiver, + address _token, + uint256 _amount + ) + external + onlyOwner + onlyAllowlistedChain(_destinationChainSelector) + validateReceiver(_receiver) + returns (bytes32 messageId) + { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + // address(0) means fees are paid in native gas + Client.EVM2AnyMessage memory evm2AnyMessage = _buildCCIPMessage(_receiver, _token, _amount, address(0)); + + // Get the fee required to send the message + uint256 fees = s_router.getFee(_destinationChainSelector, evm2AnyMessage); + + if (fees > address(this).balance) { + revert NotEnoughBalance(address(this).balance, fees); + } + + // approve the Router to spend tokens on contract's behalf. It will spend the amount of the given token + IERC20(_token).approve(address(s_router), _amount); + + // Send the message through the router and store the returned message ID + messageId = s_router.ccipSend{value: fees}(_destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit TokensTransferred(messageId, _destinationChainSelector, _receiver, _token, _amount, address(0), fees); + + // Return the message ID + return messageId; + } + + /// @notice Construct a CCIP message. + /// @dev This function will create an EVM2AnyMessage struct with all the necessary information for tokens transfer. + /// @param _receiver The address of the receiver. + /// @param _token The token to be transferred. + /// @param _amount The amount of the token to be transferred. + /// @param _feeTokenAddress The address of the token used for fees. Set address(0) for native gas. + /// @return Client.EVM2AnyMessage Returns an EVM2AnyMessage struct which contains information for sending a CCIP + /// message. + function _buildCCIPMessage( + address _receiver, + address _token, + uint256 _amount, + address _feeTokenAddress + ) private pure returns (Client.EVM2AnyMessage memory) { + // Set the token amounts + Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); + tokenAmounts[0] = Client.EVMTokenAmount({token: _token, amount: _amount}); + + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + return Client.EVM2AnyMessage({ + receiver: abi.encode(_receiver), // ABI-encoded receiver address + data: "", // No data + tokenAmounts: tokenAmounts, // The amount and type of token being transferred + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: 0, // Gas limit for the callback on the destination chain + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender + }) + ), + // Set the feeToken to a feeTokenAddress, indicating specific asset will be used for fees + feeToken: _feeTokenAddress + }); + } + + /// @notice Fallback function to allow the contract to receive Ether. + /// @dev This function has no function body, making it a default function for receiving Ether. + /// It is automatically called when Ether is transferred to the contract without any data. + receive() external payable {} + + /// @notice Allows the contract owner to withdraw the entire balance of Ether from the contract. + /// @dev This function reverts if there are no funds to withdraw or if the transfer fails. + /// It should only be callable by the owner of the contract. + /// @param _beneficiary The address to which the Ether should be transferred. + function withdraw( + address _beneficiary + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = address(this).balance; + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + // Attempt to send the funds, capturing the success status and discarding any return data + (bool sent,) = _beneficiary.call{value: amount}(""); + + // Revert if the send failed, with information about the attempted transfer + if (!sent) revert FailedToWithdrawEth(msg.sender, _beneficiary, amount); + } + + /// @notice Allows the owner of the contract to withdraw all tokens of a specific ERC20 token. + /// @dev This function reverts with a 'NothingToWithdraw' error if there are no tokens to withdraw. + /// @param _beneficiary The address to which the tokens will be sent. + /// @param _token The contract address of the ERC20 token to be withdrawn. + function withdrawToken( + address _beneficiary, + address _token + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = IERC20(_token).balanceOf(address(this)); + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + IERC20(_token).safeTransfer(_beneficiary, amount); + } +} +``` + ### Deploy your contracts To use this contract: @@ -5371,6 +5996,418 @@ In this tutorial, you will use Chainlink CCIP to transfer tokens and arbitrary d In this tutorial, you will send a *string* text and CCIP-BnM tokens between smart contracts on *Avalanche Fuji* and *Ethereum Sepolia* using CCIP. First, you will pay [CCIP fees in LINK](#transfer-and-receive-tokens-and-data-and-pay-in-link), then you will pay [CCIP fees in native gas](#transfer-and-receive-tokens-and-data-and-pay-in-native). +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.sol"; +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 {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/// @title - A simple messenger contract for transferring/receiving tokens and data across chains. +contract ProgrammableTokenTransfers is CCIPReceiver, OwnerIsCreator { + using SafeERC20 for IERC20; + + // Custom errors to provide more descriptive revert messages. + error NotEnoughBalance(uint256 currentBalance, uint256 requiredBalance); // Used to make sure contract has enough + // token balance + error NothingToWithdraw(); // Used when trying to withdraw Ether but there's nothing to withdraw. + error FailedToWithdrawEth(address owner, address target, uint256 value); // Used when the withdrawal of Ether fails. + error DestinationChainNotAllowed(uint64 destinationChainSelector); // Used when the destination chain has not been + // allowlisted by the contract owner. + error SourceChainNotAllowed(uint64 sourceChainSelector); // Used when the source chain has not been allowlisted by the + // contract owner. + error SenderNotAllowed(address sender); // Used when the sender has not been allowlisted by the contract owner. + error InvalidReceiverAddress(); // Used when the receiver address is 0. + + // Event emitted when a message is sent to another chain. + // The chain selector of the destination chain. + // The address of the receiver on the destination chain. + // The text being sent. + // The token address that was transferred. + // The token amount that was transferred. + // the token address used to pay CCIP fees. + // The fees paid for sending the message. + event MessageSent( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address receiver, + string text, + address token, + uint256 tokenAmount, + address feeToken, + uint256 fees + ); + + // Event emitted when a message is received from another chain. + // The chain selector of the source chain. + // The address of the sender from the source chain. + // The text that was received. + // The token address that was transferred. + // The token amount that was transferred. + event MessageReceived( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address sender, + string text, + address token, + uint256 tokenAmount + ); + + bytes32 private s_lastReceivedMessageId; // Store the last received messageId. + address private s_lastReceivedTokenAddress; // Store the last received token address. + uint256 private s_lastReceivedTokenAmount; // Store the last received amount. + string private s_lastReceivedText; // Store the last received text. + + // Mapping to keep track of allowlisted destination chains. + mapping(uint64 => bool) public allowlistedDestinationChains; + + // Mapping to keep track of allowlisted source chains. + mapping(uint64 => bool) public allowlistedSourceChains; + + // Mapping to keep track of allowlisted senders. + mapping(address => bool) public allowlistedSenders; + + IERC20 private s_linkToken; + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + constructor( + address _router, + address _link + ) CCIPReceiver(_router) { + s_linkToken = IERC20(_link); + } + + /// @dev Modifier that checks if the chain with the given destinationChainSelector is allowlisted. + /// @param _destinationChainSelector The selector of the destination chain. + modifier onlyAllowlistedDestinationChain( + uint64 _destinationChainSelector + ) { + if (!allowlistedDestinationChains[_destinationChainSelector]) { + revert DestinationChainNotAllowed(_destinationChainSelector); + } + _; + } + + /// @dev Modifier that checks the receiver address is not 0. + /// @param _receiver The receiver address. + modifier validateReceiver( + address _receiver + ) { + if (_receiver == address(0)) revert InvalidReceiverAddress(); + _; + } + + /// @dev Modifier that checks if the chain with the given sourceChainSelector is allowlisted and if the sender is + /// allowlisted. + /// @param _sourceChainSelector The selector of the destination chain. + /// @param _sender The address of the sender. + modifier onlyAllowlisted( + uint64 _sourceChainSelector, + address _sender + ) { + if (!allowlistedSourceChains[_sourceChainSelector]) { + revert SourceChainNotAllowed(_sourceChainSelector); + } + if (!allowlistedSenders[_sender]) revert SenderNotAllowed(_sender); + _; + } + + /// @dev Updates the allowlist status of a destination chain for transactions. + /// @notice This function can only be called by the owner. + /// @param _destinationChainSelector The selector of the destination chain to be updated. + /// @param allowed The allowlist status to be set for the destination chain. + function allowlistDestinationChain( + uint64 _destinationChainSelector, + bool allowed + ) external onlyOwner { + allowlistedDestinationChains[_destinationChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a source chain + /// @notice This function can only be called by the owner. + /// @param _sourceChainSelector The selector of the source chain to be updated. + /// @param allowed The allowlist status to be set for the source chain. + function allowlistSourceChain( + uint64 _sourceChainSelector, + bool allowed + ) external onlyOwner { + allowlistedSourceChains[_sourceChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a sender for transactions. + /// @notice This function can only be called by the owner. + /// @param _sender The address of the sender to be updated. + /// @param allowed The allowlist status to be set for the sender. + function allowlistSender( + address _sender, + bool allowed + ) external onlyOwner { + allowlistedSenders[_sender] = allowed; + } + + /// @notice Sends data and transfer tokens to receiver on the destination chain. + /// @notice Pay for fees in LINK. + /// @dev Assumes your contract has sufficient LINK to pay for CCIP fees. + /// @param _destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param _receiver The address of the recipient on the destination blockchain. + /// @param _text The string data to be sent. + /// @param _token token address. + /// @param _amount token amount. + /// @return messageId The ID of the CCIP message that was sent. + function sendMessagePayLINK( + uint64 _destinationChainSelector, + address _receiver, + string calldata _text, + address _token, + uint256 _amount + ) + external + onlyOwner + onlyAllowlistedDestinationChain(_destinationChainSelector) + validateReceiver(_receiver) + returns (bytes32 messageId) + { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + // address(linkToken) means fees are paid in LINK + Client.EVM2AnyMessage memory evm2AnyMessage = + _buildCCIPMessage(_receiver, _text, _token, _amount, address(s_linkToken)); + + // Initialize a router client instance to interact with cross-chain router + IRouterClient router = IRouterClient(this.getRouter()); + + // Get the fee required to send the CCIP message + uint256 fees = router.getFee(_destinationChainSelector, evm2AnyMessage); + + uint256 requiredLinkBalance; + if (_token == address(s_linkToken)) { + // Required LINK Balance is the sum of fees and amount to transfer, if the token to transfer is LINK + requiredLinkBalance = fees + _amount; + } else { + requiredLinkBalance = fees; + } + + uint256 linkBalance = s_linkToken.balanceOf(address(this)); + + if (requiredLinkBalance > linkBalance) { + revert NotEnoughBalance(linkBalance, requiredLinkBalance); + } + + // approve the Router to transfer LINK tokens on contract's behalf. It will spend the requiredLinkBalance + s_linkToken.approve(address(router), requiredLinkBalance); + + // If sending a token other than LINK, approve it separately + if (_token != address(s_linkToken)) { + uint256 tokenBalance = IERC20(_token).balanceOf(address(this)); + if (_amount > tokenBalance) { + revert NotEnoughBalance(tokenBalance, _amount); + } + // approve the Router to spend tokens on contract's behalf. It will spend the amount of the given token + IERC20(_token).approve(address(router), _amount); + } + + // Send the message through the router and store the returned message ID + messageId = router.ccipSend(_destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit MessageSent( + messageId, _destinationChainSelector, _receiver, _text, _token, _amount, address(s_linkToken), fees + ); + + // Return the message ID + return messageId; + } + + /// @notice Sends data and transfer tokens to receiver on the destination chain. + /// @notice Pay for fees in native gas. + /// @dev Assumes your contract has sufficient native gas like ETH on Ethereum or POL on Polygon. + /// @param _destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param _receiver The address of the recipient on the destination blockchain. + /// @param _text The string data to be sent. + /// @param _token token address. + /// @param _amount token amount. + /// @return messageId The ID of the CCIP message that was sent. + function sendMessagePayNative( + uint64 _destinationChainSelector, + address _receiver, + string calldata _text, + address _token, + uint256 _amount + ) + external + onlyOwner + onlyAllowlistedDestinationChain(_destinationChainSelector) + validateReceiver(_receiver) + returns (bytes32 messageId) + { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + // address(0) means fees are paid in native gas + Client.EVM2AnyMessage memory evm2AnyMessage = _buildCCIPMessage(_receiver, _text, _token, _amount, address(0)); + + // Initialize a router client instance to interact with cross-chain router + IRouterClient router = IRouterClient(this.getRouter()); + + // Get the fee required to send the CCIP message + uint256 fees = router.getFee(_destinationChainSelector, evm2AnyMessage); + + if (fees > address(this).balance) { + revert NotEnoughBalance(address(this).balance, fees); + } + + // approve the Router to spend tokens on contract's behalf. It will spend the amount of the given token + IERC20(_token).approve(address(router), _amount); + + // Send the message through the router and store the returned message ID + messageId = router.ccipSend{value: fees}(_destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit MessageSent(messageId, _destinationChainSelector, _receiver, _text, _token, _amount, address(0), fees); + + // Return the message ID + return messageId; + } + + /** + * @notice Returns the details of the last CCIP received message. + * @dev This function retrieves the ID, text, token address, and token amount of the last received CCIP message. + * @return messageId The ID of the last received CCIP message. + * @return text The text of the last received CCIP message. + * @return tokenAddress The address of the token in the last CCIP received message. + * @return tokenAmount The amount of the token in the last CCIP received message. + */ + function getLastReceivedMessageDetails() + public + view + returns (bytes32 messageId, string memory text, address tokenAddress, uint256 tokenAmount) + { + return (s_lastReceivedMessageId, s_lastReceivedText, s_lastReceivedTokenAddress, s_lastReceivedTokenAmount); + } + + /// handle a received message + function _ccipReceive( + Client.Any2EVMMessage memory any2EvmMessage + ) + internal + override + onlyAllowlisted(any2EvmMessage.sourceChainSelector, abi.decode(any2EvmMessage.sender, (address))) // Make sure + // source chain and sender are allowlisted + + { + s_lastReceivedMessageId = any2EvmMessage.messageId; // fetch the messageId + s_lastReceivedText = abi.decode(any2EvmMessage.data, (string)); // abi-decoding of the sent text + // Expect one token to be transferred at once, but you can transfer several tokens. + s_lastReceivedTokenAddress = any2EvmMessage.destTokenAmounts[0].token; + s_lastReceivedTokenAmount = any2EvmMessage.destTokenAmounts[0].amount; + + emit MessageReceived( + any2EvmMessage.messageId, + any2EvmMessage.sourceChainSelector, // fetch the source chain identifier (aka selector) + abi.decode(any2EvmMessage.sender, (address)), // abi-decoding of the sender address, + abi.decode(any2EvmMessage.data, (string)), + any2EvmMessage.destTokenAmounts[0].token, + any2EvmMessage.destTokenAmounts[0].amount + ); + } + + /// @notice Construct a CCIP message. + /// @dev This function will create an EVM2AnyMessage struct with all the necessary information for programmable tokens + /// transfer. + /// @param _receiver The address of the receiver. + /// @param _text The string data to be sent. + /// @param _token The token to be transferred. + /// @param _amount The amount of the token to be transferred. + /// @param _feeTokenAddress The address of the token used for fees. Set address(0) for native gas. + /// @return Client.EVM2AnyMessage Returns an EVM2AnyMessage struct which contains information for sending a CCIP + /// message. + function _buildCCIPMessage( + address _receiver, + string calldata _text, + address _token, + uint256 _amount, + address _feeTokenAddress + ) private pure returns (Client.EVM2AnyMessage memory) { + // Set the token amounts + Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); + tokenAmounts[0] = Client.EVMTokenAmount({token: _token, amount: _amount}); + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + return Client.EVM2AnyMessage({ + receiver: abi.encode(_receiver), // ABI-encoded receiver address + data: abi.encode(_text), // ABI-encoded string + tokenAmounts: tokenAmounts, // The amount and type of token being transferred + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: 200_000, // Gas limit for the callback on the destination chain + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender + }) + ), + // Set the feeToken to a feeTokenAddress, indicating specific asset will be used for fees + feeToken: _feeTokenAddress + }); + } + + /// @notice Fallback function to allow the contract to receive Ether. + /// @dev This function has no function body, making it a default function for receiving Ether. + /// It is automatically called when Ether is sent to the contract without any data. + receive() external payable {} + + /// @notice Allows the contract owner to withdraw the entire balance of Ether from the contract. + /// @dev This function reverts if there are no funds to withdraw or if the transfer fails. + /// It should only be callable by the owner of the contract. + /// @param _beneficiary The address to which the Ether should be sent. + function withdraw( + address _beneficiary + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = address(this).balance; + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + // Attempt to send the funds, capturing the success status and discarding any return data + (bool sent,) = _beneficiary.call{value: amount}(""); + + // Revert if the send failed, with information about the attempted transfer + if (!sent) revert FailedToWithdrawEth(msg.sender, _beneficiary, amount); + } + + /// @notice Allows the owner of the contract to withdraw all tokens of a specific ERC20 token. + /// @dev This function reverts with a 'NothingToWithdraw' error if there are no tokens to withdraw. + /// @param _beneficiary The address to which the tokens will be sent. + /// @param _token The contract address of the ERC20 token to be withdrawn. + function withdrawToken( + address _beneficiary, + address _token + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = IERC20(_token).balanceOf(address(this)); + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + IERC20(_token).safeTransfer(_beneficiary, amount); + } +} +``` + ### Deploy your contracts To use this contract: @@ -5670,81 +6707,641 @@ In this guide, you'll initiate a transaction from a smart contract on *Avalanche that for successful scenarios. </Aside> -### Deploy your contracts +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; -To use this contract: +import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.sol"; +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"; -1. [Open the contract in Remix](https://remix.ethereum.org/#url=https://docs.chain.link/samples/CCIP/ProgrammableDefensiveTokenTransfers.sol). +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {EnumerableMap} from "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; -2. Compile your contract. +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ -3. Deploy, fund your sender contract on *Avalanche Fuji* and enable sending messages to *Ethereum Sepolia*: - 1. Open MetaMask and select the network *Avalanche Fuji*. - 2. In Remix IDE, click on *Deploy & Run Transactions* and select *Injected Provider - MetaMask* from the environment list. Remix will then interact with your MetaMask wallet to communicate with *Avalanche Fuji*. - 3. Fill in your blockchain's router and LINK contract addresses. The router address can be found on the [CCIP Directory](/ccip/directory) and the LINK contract address on the [LINK token contracts page](/resources/link-token-contracts). For *Avalanche Fuji*: - - The router address is 0xF694E193200268f9a4868e4Aa017A0118C9a8177, - - The LINK contract address is 0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846. - 4. Click the **transact** button. After you confirm the transaction, the contract address appears on the *Deployed Contracts* list. - Note your contract address. - 5. Open MetaMask and fund your contract with CCIP-BnM tokens. You can transfer 0.002 *CCIP-BnM* to your contract. - 6. Enable your contract to send CCIP messages to *Ethereum Sepolia*: - 1. In Remix IDE, under *Deploy & Run Transactions*, open the list of functions of your smart contract deployed on *Avalanche Fuji*. - 2. Call the `allowlistDestinationChain` with 16015286601757825753 as the destination chain selector, and true as allowed. Each chain selector is found on the [CCIP Directory](/ccip/directory). +/// @title - A simple messenger contract for transferring/receiving tokens and data across chains. +/// @dev - This example shows how to recover tokens in case of revert +contract ProgrammableDefensiveTokenTransfers is CCIPReceiver, OwnerIsCreator { + using EnumerableMap for EnumerableMap.Bytes32ToUintMap; + using SafeERC20 for IERC20; + + // Custom errors to provide more descriptive revert messages. + error NotEnoughBalance(uint256 currentBalance, uint256 requiredBalance); // Used to make sure contract has enough + // token balance + error NothingToWithdraw(); // Used when trying to withdraw Ether but there's nothing to withdraw. + error FailedToWithdrawEth(address owner, address target, uint256 value); // Used when the withdrawal of Ether fails. + error DestinationChainNotAllowlisted(uint64 destinationChainSelector); // Used when the destination chain has not been + // allowlisted by the contract owner. + error SourceChainNotAllowed(uint64 sourceChainSelector); // Used when the source chain has not been allowlisted by the + // contract owner. + error SenderNotAllowed(address sender); // Used when the sender has not been allowlisted by the contract owner. + error InvalidReceiverAddress(); // Used when the receiver address is 0. + error OnlySelf(); // Used when a function is called outside of the contract itself. + error ErrorCase(); // Used when simulating a revert during message processing. + error MessageNotFailed(bytes32 messageId); + + // Example error code, could have many different error codes. + enum ErrorCode { + // RESOLVED is first so that the default value is resolved. + RESOLVED, + // Could have any number of error codes here. + FAILED + } -4. Deploy your receiver contract on *Ethereum Sepolia* and enable receiving messages from your sender contract: - 1. Open MetaMask and select the network *Ethereum Sepolia*. - 2. In Remix IDE, under *Deploy & Run Transactions*, make sure the environment is still *Injected Provider - MetaMask*. - 3. Fill in your blockchain's router and LINK contract addresses. The router address can be found on the [CCIP Directory](/ccip/directory) and the LINK contract address on the [LINK token contracts page](/resources/link-token-contracts). For *Ethereum Sepolia*: - - The router address is 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59, - - The LINK contract address is 0x779877A7B0D9E8603169DdbD7836e478b4624789. - 4. Click the **transact** button. After you confirm the transaction, the contract address appears on the *Deployed Contracts* list. - Note your contract address. - 5. Enable your contract to receive CCIP messages from *Avalanche Fuji*: - 1. In Remix IDE, under *Deploy & Run Transactions*, open the list of functions of your smart contract deployed on *Ethereum Sepolia*. - 2. Call the `allowlistSourceChain` with 14767482510784806043 as the source chain selector, and true as allowed. Each chain selector is found on the [CCIP Directory](/ccip/directory). - 6. Enable your contract to receive CCIP messages from the contract that you deployed on *Avalanche Fuji*: - 1. In Remix IDE, under *Deploy & Run Transactions*, open the list of functions of your smart contract deployed on *Ethereum Sepolia*. - 2. Call the `allowlistSender` with the contract address of the contract that you deployed on *Avalanche Fuji*, and true as allowed. - 7. Call the `setSimRevert` function, passing `true` as a parameter, then wait for the transaction to confirm. Setting `s_simRevert` to true simulates a failure when processing the received message. Read the [explanation](#explanation) section for more details. + struct FailedMessage { + bytes32 messageId; + ErrorCode errorCode; + } -At this point, you have one *sender* contract on *Avalanche Fuji* and one *receiver* contract on *Ethereum Sepolia*. As security measures, you enabled the sender contract to send CCIP messages to *Ethereum Sepolia* and the receiver contract to receive CCIP messages from the sender on *Avalanche Fuji*. The receiver contract cannot process the message, and therefore, instead of throwing an exception, it will lock the received tokens, enabling the owner to recover them. + // Event emitted when a message is sent to another chain. + // The chain selector of the destination chain. + // The address of the receiver on the destination chain. + // The text being sent. + // The token address that was transferred. + // The token amount that was transferred. + // the token address used to pay CCIP fees. + // The fees paid for sending the message. + event MessageSent( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address receiver, + string text, + address token, + uint256 tokenAmount, + address feeToken, + uint256 fees + ); -**Note**: Another security measure enforces that only the router can call the `_ccipReceive` function. Read the [explanation](#explanation) section for more details. + // Event emitted when a message is received from another chain. + // The chain selector of the source chain. + // The address of the sender from the source chain. + // The text that was received. + // The token address that was transferred. + // The token amount that was transferred. + event MessageReceived( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address sender, + string text, + address token, + uint256 tokenAmount + ); -### Recover the locked tokens + event MessageFailed(bytes32 indexed messageId, bytes reason); + event MessageRecovered(bytes32 indexed messageId); -You will transfer *0.001 CCIP-BnM* and a text. The CCIP fees for using CCIP will be paid in LINK. + bytes32 private s_lastReceivedMessageId; // Store the last received messageId. + address private s_lastReceivedTokenAddress; // Store the last received token address. + uint256 private s_lastReceivedTokenAmount; // Store the last received amount. + string private s_lastReceivedText; // Store the last received text. -1. Open MetaMask and connect to *Avalanche Fuji*. Fund your contract with LINK tokens. You can transfer 70 *LINK* to your contract. In this example, LINK is used to pay the CCIP fees. + // Mapping to keep track of allowlisted destination chains. + mapping(uint64 => bool) public allowlistedDestinationChains; - **Note:** This transaction fee is significantly higher than normal due to gas spikes on Sepolia. To run this example, you can get additional testnet LINK - from [faucets.chain.link](https://faucets.chain.link) or use a supported testnet other than Sepolia. + // Mapping to keep track of allowlisted source chains. + mapping(uint64 => bool) public allowlistedSourceChains; -2. Send a string data with tokens from *Avalanche Fuji*: - 1. Open MetaMask and select the network *Avalanche Fuji*. + // Mapping to keep track of allowlisted senders. + mapping(address => bool) public allowlistedSenders; - 2. In Remix IDE, under *Deploy & Run Transactions*, open the list of functions of your smart contract deployed on *Avalanche Fuji*. + IERC20 private s_linkToken; - 3. Fill in the arguments of the ***sendMessagePayLINK*** function: + // The message contents of failed messages are stored here. + mapping(bytes32 messageId => Client.Any2EVMMessage contents) public s_messageContents; - | Argument | Value and Description | - | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | - | _destinationChainSelector | <CopyText text="16015286601757825753" code /> <br /> CCIP Chain identifier of the destination blockchain (*Ethereum Sepolia* in this example). You can find each chain selector on the [CCIP Directory](/ccip/directory). | - | _receiver | Your receiver contract address at *Ethereum Sepolia*. <br /> The destination contract address. | - | _text | <CopyText text="Hello World!" code /><br />Any `string` | - | _token | <CopyText text="0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4" code /><br /> The *CCIP-BnM* contract address at the source chain (*Avalanche Fuji* in this example). You can find all the addresses for each supported blockchain on the [CCIP Directory](/ccip/directory). | - | _amount | <CopyText text="1000000000000000" code /> <br /> The token amount (*0.001 CCIP-BnM*). | + // Contains failed messages and their state. + EnumerableMap.Bytes32ToUintMap internal s_failedMessages; - 4. Click on `transact` and confirm the transaction on MetaMask. + // This is used to simulate a revert in the processMessage function. + bool internal s_simRevert = false; - 5. After the transaction is successful, record the transaction hash. Here is an [example](https://testnet.snowtrace.io/tx/0x4c7a192fa5636557569d076c06633c4f06140f117a44b49f21628eedd72b8423) of a transaction on *Avalanche Fuji*. + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + constructor( + address _router, + address _link + ) CCIPReceiver(_router) { + s_linkToken = IERC20(_link); + } -<Aside type="note" title="Gas price spikes"> - Under normal circumstances, transactions on the Ethereum Sepolia network require significantly fewer tokens to pay for gas. However, during exceptional periods of high gas price spikes, your transactions may fail if not sufficiently funded. In such cases, you may need to fund your contract with additional tokens. We recommend paying for your CCIP transactions in **LINK** tokens (rather than native tokens) as you can obtain extra LINK testnet tokens from [faucets.chain.link](https://faucets.chain.link/). If you encounter a transaction failure due to these gas price spikes, please add additional LINK tokens to your contract and try again. - Alternatively, you can use a supported testnet other than Sepolia. -</Aside> + /// @dev Modifier that checks if the chain with the given destinationChainSelector is allowlisted. + /// @param _destinationChainSelector The selector of the destination chain. + modifier onlyAllowlistedDestinationChain( + uint64 _destinationChainSelector + ) { + if (!allowlistedDestinationChains[_destinationChainSelector]) { + revert DestinationChainNotAllowlisted(_destinationChainSelector); + } + _; + } -1. Open the [CCIP explorer](https://ccip.chain.link/) and search your cross-chain transaction using the transaction hash. + /// @dev Modifier that checks if the chain with the given sourceChainSelector is allowlisted and if the sender is + /// allowlisted. + /// @param _sourceChainSelector The selector of the destination chain. + /// @param _sender The address of the sender. + modifier onlyAllowlisted( + uint64 _sourceChainSelector, + address _sender + ) { + if (!allowlistedSourceChains[_sourceChainSelector]) { + revert SourceChainNotAllowed(_sourceChainSelector); + } + if (!allowlistedSenders[_sender]) revert SenderNotAllowed(_sender); + _; + } + + /// @dev Modifier that checks the receiver address is not 0. + /// @param _receiver The receiver address. + modifier validateReceiver( + address _receiver + ) { + if (_receiver == address(0)) revert InvalidReceiverAddress(); + _; + } + + /// @dev Modifier to allow only the contract itself to execute a function. + /// Throws an exception if called by any account other than the contract itself. + modifier onlySelf() { + if (msg.sender != address(this)) revert OnlySelf(); + _; + } + + /// @dev Updates the allowlist status of a destination chain for transactions. + /// @notice This function can only be called by the owner. + /// @param _destinationChainSelector The selector of the destination chain to be updated. + /// @param allowed The allowlist status to be set for the destination chain. + function allowlistDestinationChain( + uint64 _destinationChainSelector, + bool allowed + ) external onlyOwner { + allowlistedDestinationChains[_destinationChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a source chain + /// @notice This function can only be called by the owner. + /// @param _sourceChainSelector The selector of the source chain to be updated. + /// @param allowed The allowlist status to be set for the source chain. + function allowlistSourceChain( + uint64 _sourceChainSelector, + bool allowed + ) external onlyOwner { + allowlistedSourceChains[_sourceChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a sender for transactions. + /// @notice This function can only be called by the owner. + /// @param _sender The address of the sender to be updated. + /// @param allowed The allowlist status to be set for the sender. + function allowlistSender( + address _sender, + bool allowed + ) external onlyOwner { + allowlistedSenders[_sender] = allowed; + } + + /// @notice Sends data and transfer tokens to receiver on the destination chain. + /// @notice Pay for fees in LINK. + /// @dev Assumes your contract has sufficient LINK to pay for CCIP fees. + /// @param _destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param _receiver The address of the recipient on the destination blockchain. + /// @param _text The string data to be sent. + /// @param _token token address. + /// @param _amount token amount. + /// @return messageId The ID of the CCIP message that was sent. + function sendMessagePayLINK( + uint64 _destinationChainSelector, + address _receiver, + string calldata _text, + address _token, + uint256 _amount + ) + external + onlyOwner + onlyAllowlistedDestinationChain(_destinationChainSelector) + validateReceiver(_receiver) + returns (bytes32 messageId) + { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + // address(linkToken) means fees are paid in LINK + Client.EVM2AnyMessage memory evm2AnyMessage = + _buildCCIPMessage(_receiver, _text, _token, _amount, address(s_linkToken)); + + // Initialize a router client instance to interact with cross-chain router + IRouterClient router = IRouterClient(this.getRouter()); + + // Get the fee required to send the CCIP message + uint256 fees = router.getFee(_destinationChainSelector, evm2AnyMessage); + + uint256 requiredLinkBalance; + if (_token == address(s_linkToken)) { + // Required LINK Balance is the sum of fees and amount to transfer, if the token to transfer is LINK + requiredLinkBalance = fees + _amount; + } else { + requiredLinkBalance = fees; + } + + uint256 linkBalance = s_linkToken.balanceOf(address(this)); + + if (requiredLinkBalance > linkBalance) { + revert NotEnoughBalance(linkBalance, requiredLinkBalance); + } + + // approve the Router to transfer LINK tokens on contract's behalf. It will spend the requiredLinkBalance + s_linkToken.approve(address(router), requiredLinkBalance); + + // If sending a token other than LINK, approve it separately + if (_token != address(s_linkToken)) { + uint256 tokenBalance = IERC20(_token).balanceOf(address(this)); + if (_amount > tokenBalance) { + revert NotEnoughBalance(tokenBalance, _amount); + } + // approve the Router to spend tokens on contract's behalf. It will spend the amount of the given token + IERC20(_token).approve(address(router), _amount); + } + + // Send the message through the router and store the returned message ID + messageId = router.ccipSend(_destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit MessageSent( + messageId, _destinationChainSelector, _receiver, _text, _token, _amount, address(s_linkToken), fees + ); + + // Return the message ID + return messageId; + } + + /// @notice Sends data and transfer tokens to receiver on the destination chain. + /// @notice Pay for fees in native gas. + /// @dev Assumes your contract has sufficient native gas like ETH on Ethereum or POL on Polygon. + /// @param _destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param _receiver The address of the recipient on the destination blockchain. + /// @param _text The string data to be sent. + /// @param _token token address. + /// @param _amount token amount. + /// @return messageId The ID of the CCIP message that was sent. + function sendMessagePayNative( + uint64 _destinationChainSelector, + address _receiver, + string calldata _text, + address _token, + uint256 _amount + ) + external + onlyOwner + onlyAllowlistedDestinationChain(_destinationChainSelector) + validateReceiver(_receiver) + returns (bytes32 messageId) + { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + // address(0) means fees are paid in native gas + Client.EVM2AnyMessage memory evm2AnyMessage = _buildCCIPMessage(_receiver, _text, _token, _amount, address(0)); + + // Initialize a router client instance to interact with cross-chain router + IRouterClient router = IRouterClient(this.getRouter()); + + // Get the fee required to send the CCIP message + uint256 fees = router.getFee(_destinationChainSelector, evm2AnyMessage); + + if (fees > address(this).balance) { + revert NotEnoughBalance(address(this).balance, fees); + } + + // approve the Router to spend tokens on contract's behalf. It will spend the amount of the given token + IERC20(_token).approve(address(router), _amount); + + // Send the message through the router and store the returned message ID + messageId = router.ccipSend{value: fees}(_destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit MessageSent(messageId, _destinationChainSelector, _receiver, _text, _token, _amount, address(0), fees); + + // Return the message ID + return messageId; + } + + /** + * @notice Returns the details of the last CCIP received message. + * @dev This function retrieves the ID, text, token address, and token amount of the last received CCIP message. + * @return messageId The ID of the last received CCIP message. + * @return text The text of the last received CCIP message. + * @return tokenAddress The address of the token in the last CCIP received message. + * @return tokenAmount The amount of the token in the last CCIP received message. + */ + function getLastReceivedMessageDetails() + public + view + returns (bytes32 messageId, string memory text, address tokenAddress, uint256 tokenAmount) + { + return (s_lastReceivedMessageId, s_lastReceivedText, s_lastReceivedTokenAddress, s_lastReceivedTokenAmount); + } + + /** + * @notice Retrieves a paginated list of failed messages. + * @dev This function returns a subset of failed messages defined by `offset` and `limit` parameters. It ensures that + * the pagination parameters are within the bounds of the available data set. + * @param offset The index of the first failed message to return, enabling pagination by skipping a specified number + * of messages from the start of the dataset. + * @param limit The maximum number of failed messages to return, restricting the size of the returned array. + * @return failedMessages An array of `FailedMessage` struct, each containing a `messageId` and an `errorCode` + * (RESOLVED or FAILED), representing the requested subset of failed messages. The length of the returned array is + * determined by the `limit` and the total number of failed messages. + */ + function getFailedMessages( + uint256 offset, + uint256 limit + ) external view returns (FailedMessage[] memory) { + uint256 length = s_failedMessages.length(); + + // Calculate the actual number of items to return (can't exceed total length or requested limit) + uint256 returnLength = (offset + limit > length) ? length - offset : limit; + FailedMessage[] memory failedMessages = new FailedMessage[](returnLength); + + // Adjust loop to respect pagination (start at offset, end at offset + limit or total length) + for (uint256 i = 0; i < returnLength; i++) { + (bytes32 messageId, uint256 errorCode) = s_failedMessages.at(offset + i); + failedMessages[i] = FailedMessage(messageId, ErrorCode(errorCode)); + } + return failedMessages; + } + + /// @notice The entrypoint for the CCIP router to call. This function should + /// never revert, all errors should be handled internally in this contract. + /// @param any2EvmMessage The message to process. + /// @dev Extremely important to ensure only router calls this. + function ccipReceive( + Client.Any2EVMMessage calldata any2EvmMessage + ) + external + override + onlyRouter + onlyAllowlisted(any2EvmMessage.sourceChainSelector, abi.decode(any2EvmMessage.sender, (address))) // Make sure the + // source chain and sender are allowlisted + + { + /* solhint-disable no-empty-blocks */ + try this.processMessage(any2EvmMessage) { + // Intentionally empty in this example; no action needed if processMessage succeeds + } + catch (bytes memory err) { + // Could set different error codes based on the caught error. Each could be + // handled differently. + s_failedMessages.set(any2EvmMessage.messageId, uint256(ErrorCode.FAILED)); + s_messageContents[any2EvmMessage.messageId] = any2EvmMessage; + // Don't revert so CCIP doesn't revert. Emit event instead. + // The message can be retried later without having to do manual execution of CCIP. + emit MessageFailed(any2EvmMessage.messageId, err); + return; + } + } + + /// @notice Serves as the entry point for this contract to process incoming messages. + /// @param any2EvmMessage Received CCIP message. + /// @dev Transfers specified token amounts to the owner of this contract. This function + /// must be external because of the try/catch for error handling. + /// It uses the `onlySelf`: can only be called from the contract. + function processMessage( + Client.Any2EVMMessage calldata any2EvmMessage + ) + external + onlySelf + onlyAllowlisted(any2EvmMessage.sourceChainSelector, abi.decode(any2EvmMessage.sender, (address))) // Make sure the + // source chain and sender are allowlisted + + { + // Simulate a revert for testing purposes + if (s_simRevert) revert ErrorCase(); + + _ccipReceive(any2EvmMessage); // process the message - may revert as well + } + + /// @notice Allows the owner to retry a failed message in order to unblock the associated tokens. + /// @param messageId The unique identifier of the failed message. + /// @param tokenReceiver The address to which the tokens will be sent. + /// @dev This function is only callable by the contract owner. It changes the status of the message + /// from 'failed' to 'resolved' to prevent reentry and multiple retries of the same message. + function retryFailedMessage( + bytes32 messageId, + address tokenReceiver + ) external onlyOwner { + // Check if the message has failed; if not, revert the transaction. + if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) { + revert MessageNotFailed(messageId); + } + + // Set the error code to RESOLVED to disallow reentry and multiple retries of the same failed message. + s_failedMessages.set(messageId, uint256(ErrorCode.RESOLVED)); + + // Retrieve the content of the failed message. + Client.Any2EVMMessage memory message = s_messageContents[messageId]; + + // This example expects one token to have been sent, but you can handle multiple tokens. + // Transfer the associated tokens to the specified receiver as an escape hatch. + IERC20(message.destTokenAmounts[0].token).safeTransfer(tokenReceiver, message.destTokenAmounts[0].amount); + + // Emit an event indicating that the message has been recovered. + emit MessageRecovered(messageId); + } + + /// @notice Allows the owner to toggle simulation of reversion for testing purposes. + /// @param simRevert If `true`, simulates a revert condition; if `false`, disables the simulation. + /// @dev This function is only callable by the contract owner. + function setSimRevert( + bool simRevert + ) external onlyOwner { + s_simRevert = simRevert; + } + + function _ccipReceive( + Client.Any2EVMMessage memory any2EvmMessage + ) internal override { + s_lastReceivedMessageId = any2EvmMessage.messageId; // fetch the messageId + s_lastReceivedText = abi.decode(any2EvmMessage.data, (string)); // abi-decoding of the sent text + // Expect one token to be transferred at once, but you can transfer several tokens. + s_lastReceivedTokenAddress = any2EvmMessage.destTokenAmounts[0].token; + s_lastReceivedTokenAmount = any2EvmMessage.destTokenAmounts[0].amount; + emit MessageReceived( + any2EvmMessage.messageId, + any2EvmMessage.sourceChainSelector, // fetch the source chain identifier (aka selector) + abi.decode(any2EvmMessage.sender, (address)), // abi-decoding of the sender address, + abi.decode(any2EvmMessage.data, (string)), + any2EvmMessage.destTokenAmounts[0].token, + any2EvmMessage.destTokenAmounts[0].amount + ); + } + + /// @notice Construct a CCIP message. + /// @dev This function will create an EVM2AnyMessage struct with all the necessary information for programmable tokens + /// transfer. + /// @param _receiver The address of the receiver. + /// @param _text The string data to be sent. + /// @param _token The token to be transferred. + /// @param _amount The amount of the token to be transferred. + /// @param _feeTokenAddress The address of the token used for fees. Set address(0) for native gas. + /// @return Client.EVM2AnyMessage Returns an EVM2AnyMessage struct which contains information for sending a CCIP + /// message. + function _buildCCIPMessage( + address _receiver, + string calldata _text, + address _token, + uint256 _amount, + address _feeTokenAddress + ) private pure returns (Client.EVM2AnyMessage memory) { + // Set the token amounts + Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); + Client.EVMTokenAmount memory tokenAmount = Client.EVMTokenAmount({token: _token, amount: _amount}); + tokenAmounts[0] = tokenAmount; + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + Client.EVM2AnyMessage memory evm2AnyMessage = Client.EVM2AnyMessage({ + receiver: abi.encode(_receiver), // ABI-encoded receiver address + data: abi.encode(_text), // ABI-encoded string + tokenAmounts: tokenAmounts, // The amount and type of token being transferred + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: 400_000, // Gas limit for the callback on the destination chain + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender + }) + ), + // Set the feeToken to a feeTokenAddress, indicating specific asset will be used for fees + feeToken: _feeTokenAddress + }); + return evm2AnyMessage; + } + + /// @notice Fallback function to allow the contract to receive Ether. + /// @dev This function has no function body, making it a default function for receiving Ether. + /// It is automatically called when Ether is sent to the contract without any data. + receive() external payable {} + + /// @notice Allows the contract owner to withdraw the entire balance of Ether from the contract. + /// @dev This function reverts if there are no funds to withdraw or if the transfer fails. + /// It should only be callable by the owner of the contract. + /// @param _beneficiary The address to which the Ether should be sent. + function withdraw( + address _beneficiary + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = address(this).balance; + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + // Attempt to send the funds, capturing the success status and discarding any return data + (bool sent,) = _beneficiary.call{value: amount}(""); + + // Revert if the send failed, with information about the attempted transfer + if (!sent) revert FailedToWithdrawEth(msg.sender, _beneficiary, amount); + } + + /// @notice Allows the owner of the contract to withdraw all tokens of a specific ERC20 token. + /// @dev This function reverts with a 'NothingToWithdraw' error if there are no tokens to withdraw. + /// @param _beneficiary The address to which the tokens will be sent. + /// @param _token The contract address of the ERC20 token to be withdrawn. + function withdrawToken( + address _beneficiary, + address _token + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = IERC20(_token).balanceOf(address(this)); + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + IERC20(_token).safeTransfer(_beneficiary, amount); + } +} +``` + +### Deploy your contracts + +To use this contract: + +1. [Open the contract in Remix](https://remix.ethereum.org/#url=https://docs.chain.link/samples/CCIP/ProgrammableDefensiveTokenTransfers.sol). + +2. Compile your contract. + +3. Deploy, fund your sender contract on *Avalanche Fuji* and enable sending messages to *Ethereum Sepolia*: + 1. Open MetaMask and select the network *Avalanche Fuji*. + 2. In Remix IDE, click on *Deploy & Run Transactions* and select *Injected Provider - MetaMask* from the environment list. Remix will then interact with your MetaMask wallet to communicate with *Avalanche Fuji*. + 3. Fill in your blockchain's router and LINK contract addresses. The router address can be found on the [CCIP Directory](/ccip/directory) and the LINK contract address on the [LINK token contracts page](/resources/link-token-contracts). For *Avalanche Fuji*: + - The router address is 0xF694E193200268f9a4868e4Aa017A0118C9a8177, + - The LINK contract address is 0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846. + 4. Click the **transact** button. After you confirm the transaction, the contract address appears on the *Deployed Contracts* list. + Note your contract address. + 5. Open MetaMask and fund your contract with CCIP-BnM tokens. You can transfer 0.002 *CCIP-BnM* to your contract. + 6. Enable your contract to send CCIP messages to *Ethereum Sepolia*: + 1. In Remix IDE, under *Deploy & Run Transactions*, open the list of functions of your smart contract deployed on *Avalanche Fuji*. + 2. Call the `allowlistDestinationChain` with 16015286601757825753 as the destination chain selector, and true as allowed. Each chain selector is found on the [CCIP Directory](/ccip/directory). + +4. Deploy your receiver contract on *Ethereum Sepolia* and enable receiving messages from your sender contract: + 1. Open MetaMask and select the network *Ethereum Sepolia*. + 2. In Remix IDE, under *Deploy & Run Transactions*, make sure the environment is still *Injected Provider - MetaMask*. + 3. Fill in your blockchain's router and LINK contract addresses. The router address can be found on the [CCIP Directory](/ccip/directory) and the LINK contract address on the [LINK token contracts page](/resources/link-token-contracts). For *Ethereum Sepolia*: + - The router address is 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59, + - The LINK contract address is 0x779877A7B0D9E8603169DdbD7836e478b4624789. + 4. Click the **transact** button. After you confirm the transaction, the contract address appears on the *Deployed Contracts* list. + Note your contract address. + 5. Enable your contract to receive CCIP messages from *Avalanche Fuji*: + 1. In Remix IDE, under *Deploy & Run Transactions*, open the list of functions of your smart contract deployed on *Ethereum Sepolia*. + 2. Call the `allowlistSourceChain` with 14767482510784806043 as the source chain selector, and true as allowed. Each chain selector is found on the [CCIP Directory](/ccip/directory). + 6. Enable your contract to receive CCIP messages from the contract that you deployed on *Avalanche Fuji*: + 1. In Remix IDE, under *Deploy & Run Transactions*, open the list of functions of your smart contract deployed on *Ethereum Sepolia*. + 2. Call the `allowlistSender` with the contract address of the contract that you deployed on *Avalanche Fuji*, and true as allowed. + 7. Call the `setSimRevert` function, passing `true` as a parameter, then wait for the transaction to confirm. Setting `s_simRevert` to true simulates a failure when processing the received message. Read the [explanation](#explanation) section for more details. + +At this point, you have one *sender* contract on *Avalanche Fuji* and one *receiver* contract on *Ethereum Sepolia*. As security measures, you enabled the sender contract to send CCIP messages to *Ethereum Sepolia* and the receiver contract to receive CCIP messages from the sender on *Avalanche Fuji*. The receiver contract cannot process the message, and therefore, instead of throwing an exception, it will lock the received tokens, enabling the owner to recover them. + +**Note**: Another security measure enforces that only the router can call the `_ccipReceive` function. Read the [explanation](#explanation) section for more details. + +### Recover the locked tokens + +You will transfer *0.001 CCIP-BnM* and a text. The CCIP fees for using CCIP will be paid in LINK. + +1. Open MetaMask and connect to *Avalanche Fuji*. Fund your contract with LINK tokens. You can transfer 70 *LINK* to your contract. In this example, LINK is used to pay the CCIP fees. + + **Note:** This transaction fee is significantly higher than normal due to gas spikes on Sepolia. To run this example, you can get additional testnet LINK + from [faucets.chain.link](https://faucets.chain.link) or use a supported testnet other than Sepolia. + +2. Send a string data with tokens from *Avalanche Fuji*: + 1. Open MetaMask and select the network *Avalanche Fuji*. + + 2. In Remix IDE, under *Deploy & Run Transactions*, open the list of functions of your smart contract deployed on *Avalanche Fuji*. + + 3. Fill in the arguments of the ***sendMessagePayLINK*** function: + + | Argument | Value and Description | + | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | + | _destinationChainSelector | <CopyText text="16015286601757825753" code /> <br /> CCIP Chain identifier of the destination blockchain (*Ethereum Sepolia* in this example). You can find each chain selector on the [CCIP Directory](/ccip/directory). | + | _receiver | Your receiver contract address at *Ethereum Sepolia*. <br /> The destination contract address. | + | _text | <CopyText text="Hello World!" code /><br />Any `string` | + | _token | <CopyText text="0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4" code /><br /> The *CCIP-BnM* contract address at the source chain (*Avalanche Fuji* in this example). You can find all the addresses for each supported blockchain on the [CCIP Directory](/ccip/directory). | + | _amount | <CopyText text="1000000000000000" code /> <br /> The token amount (*0.001 CCIP-BnM*). | + + 4. Click on `transact` and confirm the transaction on MetaMask. + + 5. After the transaction is successful, record the transaction hash. Here is an [example](https://testnet.snowtrace.io/tx/0x4c7a192fa5636557569d076c06633c4f06140f117a44b49f21628eedd72b8423) of a transaction on *Avalanche Fuji*. + +<Aside type="note" title="Gas price spikes"> + Under normal circumstances, transactions on the Ethereum Sepolia network require significantly fewer tokens to pay for gas. However, during exceptional periods of high gas price spikes, your transactions may fail if not sufficiently funded. In such cases, you may need to fund your contract with additional tokens. We recommend paying for your CCIP transactions in **LINK** tokens (rather than native tokens) as you can obtain extra LINK testnet tokens from [faucets.chain.link](https://faucets.chain.link/). If you encounter a transaction failure due to these gas price spikes, please add additional LINK tokens to your contract and try again. + Alternatively, you can use a supported testnet other than Sepolia. +</Aside> + +1. Open the [CCIP explorer](https://ccip.chain.link/) and search your cross-chain transaction using the transaction hash. <ClickToZoom src="/images/ccip/tutorials/ccip-explorer-send-tokens-message-pay-link-tx-details-defensive.webp" alt="Chainlink CCIP Explorer transaction details" /> @@ -10762,6 +12359,252 @@ The smart contracts featured in this tutorial are designed to interact with CCIP ### Sender Contract +```sol +// SPDX-License-Identifier: MIT +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 {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +interface IStaker { + function stake( + address beneficiary, + uint256 amount + ) external; + + function redeem() external; +} + +/// @title - A simple messenger contract for transferring tokens to a receiver that calls a staker contract. +contract Sender is OwnerIsCreator { + using SafeERC20 for IERC20; + + // Custom errors to provide more descriptive revert messages. + error InvalidRouter(); // Used when the router address is 0 + error InvalidLinkToken(); // Used when the link token address is 0 + error InvalidUsdcToken(); // Used when the usdc token address is 0 + error NotEnoughBalance(uint256 currentBalance, uint256 calculatedFees); // Used to make sure contract has enough + // balance to cover the fees. + error NothingToWithdraw(); // Used when trying to withdraw Ether but there's nothing to withdraw. + error InvalidDestinationChain(); // Used when the destination chain selector is 0. + error InvalidReceiverAddress(); // Used when the receiver address is 0. + error NoReceiverOnDestinationChain(uint64 destinationChainSelector); // Used when the receiver address is 0 for a + // given destination chain. + error AmountIsZero(); // Used if the amount to transfer is 0. + error InvalidGasLimit(); // Used if the gas limit is 0. + error NoGasLimitOnDestinationChain(uint64 destinationChainSelector); // Used when the gas limit is 0. + + // Event emitted when a message is sent to another chain. + // The chain selector of the destination chain. + // The address of the receiver contract on the destination chain. + // The beneficiary of the staked tokens on the destination chain. + // The token address that was transferred. + // The token amount that was transferred. + // the token address used to pay CCIP fees. + // The fees paid for sending the message. + event MessageSent( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address indexed receiver, + address beneficiary, + address token, + uint256 tokenAmount, + address feeToken, + uint256 fees + ); + + IRouterClient private immutable i_router; + IERC20 private immutable i_linkToken; + IERC20 private immutable i_usdcToken; + + // Mapping to keep track of the receiver contract per destination chain. + mapping(uint64 => address) public s_receivers; + // Mapping to store the gas limit per destination chain. + mapping(uint64 => uint256) public s_gasLimits; + + modifier validateDestinationChain( + uint64 _destinationChainSelector + ) { + if (_destinationChainSelector == 0) revert InvalidDestinationChain(); + _; + } + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + /// @param _usdcToken The address of the usdc contract. + constructor( + address _router, + address _link, + address _usdcToken + ) { + if (_router == address(0)) revert InvalidRouter(); + if (_link == address(0)) revert InvalidLinkToken(); + if (_usdcToken == address(0)) revert InvalidUsdcToken(); + i_router = IRouterClient(_router); + i_linkToken = IERC20(_link); + i_usdcToken = IERC20(_usdcToken); + } + + /// @dev Set the receiver contract for a given destination chain. + /// @notice This function can only be called by the owner. + /// @param _destinationChainSelector The selector of the destination chain. + /// @param _receiver The receiver contract on the destination chain . + function setReceiverForDestinationChain( + uint64 _destinationChainSelector, + address _receiver + ) external onlyOwner validateDestinationChain(_destinationChainSelector) { + if (_receiver == address(0)) revert InvalidReceiverAddress(); + s_receivers[_destinationChainSelector] = _receiver; + } + + /// @dev Set the gas limit for a given destination chain. + /// @notice This function can only be called by the owner. + /// @param _destinationChainSelector The selector of the destination chain. + /// @param _gasLimit The gas limit on the destination chain . + function setGasLimitForDestinationChain( + uint64 _destinationChainSelector, + uint256 _gasLimit + ) external onlyOwner validateDestinationChain(_destinationChainSelector) { + if (_gasLimit == 0) revert InvalidGasLimit(); + s_gasLimits[_destinationChainSelector] = _gasLimit; + } + + /// @dev Delete the receiver contract for a given destination chain. + /// @notice This function can only be called by the owner. + /// @param _destinationChainSelector The selector of the destination chain. + function deleteReceiverForDestinationChain( + uint64 _destinationChainSelector + ) external onlyOwner validateDestinationChain(_destinationChainSelector) { + if (s_receivers[_destinationChainSelector] == address(0)) { + revert NoReceiverOnDestinationChain(_destinationChainSelector); + } + delete s_receivers[_destinationChainSelector]; + } + + /// @notice Sends data and transfer tokens to receiver on the destination chain. + /// @notice Pay for fees in LINK. + /// @dev Assumes your contract has sufficient LINK to pay for CCIP fees. + /// @param _destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param _beneficiary The address of the beneficiary of the staked tokens on the destination blockchain. + /// @param _amount token amount. + /// @return messageId The ID of the CCIP message that was sent. + function sendMessagePayLINK( + uint64 _destinationChainSelector, + address _beneficiary, + uint256 _amount + ) external onlyOwner validateDestinationChain(_destinationChainSelector) returns (bytes32 messageId) { + address receiver = s_receivers[_destinationChainSelector]; + if (receiver == address(0)) { + revert NoReceiverOnDestinationChain(_destinationChainSelector); + } + if (_amount == 0) revert AmountIsZero(); + uint256 gasLimit = s_gasLimits[_destinationChainSelector]; + if (gasLimit == 0) { + revert NoGasLimitOnDestinationChain(_destinationChainSelector); + } + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + // address(linkToken) means fees are paid in LINK + Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); + tokenAmounts[0] = Client.EVMTokenAmount({token: address(i_usdcToken), amount: _amount}); + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + Client.EVM2AnyMessage memory evm2AnyMessage = Client.EVM2AnyMessage({ + receiver: abi.encode(receiver), // ABI-encoded receiver address + data: abi.encodeWithSelector(IStaker.stake.selector, _beneficiary, _amount), // Encode the function selector and + // the arguments of the stake function + tokenAmounts: tokenAmounts, // The amount and type of token being transferred + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: gasLimit, // Gas limit for the callback on the destination chain + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender + }) + ), + // Set the feeToken to a feeTokenAddress, indicating specific asset will be used for fees + feeToken: address(i_linkToken) + }); + + // Get the fee required to send the CCIP message + uint256 fees = i_router.getFee(_destinationChainSelector, evm2AnyMessage); + + if (fees > i_linkToken.balanceOf(address(this))) { + revert NotEnoughBalance(i_linkToken.balanceOf(address(this)), fees); + } + + // approve the Router to transfer LINK tokens on contract's behalf. It will spend the fees in LINK + i_linkToken.approve(address(i_router), fees); + + // approve the Router to spend usdc tokens on contract's behalf. It will spend the amount of the given token + i_usdcToken.approve(address(i_router), _amount); + + // Send the message through the router and store the returned message ID + messageId = i_router.ccipSend(_destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit MessageSent( + messageId, + _destinationChainSelector, + receiver, + _beneficiary, + address(i_usdcToken), + _amount, + address(i_linkToken), + fees + ); + + // Return the message ID + return messageId; + } + + /// @notice Allows the owner of the contract to withdraw all LINK tokens in the contract and transfer them to a + /// beneficiary. + /// @dev This function reverts with a 'NothingToWithdraw' error if there are no tokens to withdraw. + /// @param _beneficiary The address to which the tokens will be sent. + function withdrawLinkToken( + address _beneficiary + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = i_linkToken.balanceOf(address(this)); + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + i_linkToken.safeTransfer(_beneficiary, amount); + } + + /// @notice Allows the owner of the contract to withdraw all usdc tokens in the contract and transfer them to a + /// beneficiary. + /// @dev This function reverts with a 'NothingToWithdraw' error if there are no tokens to withdraw. + /// @param _beneficiary The address to which the tokens will be sent. + function withdrawUsdcToken( + address _beneficiary + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = i_usdcToken.balanceOf(address(this)); + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + i_usdcToken.safeTransfer(_beneficiary, amount); + } +} +``` + The Sender contract is responsible for initiating the transfer of USDC tokens and data. Here's how it works: 1. Initializing the contract: @@ -10792,6 +12635,80 @@ The Sender contract is responsible for initiating the transfer of USDC tokens an ### Staker Contract +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +interface IStaker { + function stake( + address beneficiary, + uint256 amount + ) external; + + function redeem() external; +} + +/// @title - A simple Staker contract for staking usc tokens and redeeming the staker contracts +contract Staker is IStaker, ERC20 { + using SafeERC20 for ERC20; + + error InvalidUsdcToken(); // Used when the usdc token address is 0 + error InvalidNumberOfDecimals(); // Used when the number of decimals is 0 + error InvalidBeneficiary(); // Used when the beneficiary address is 0 + error InvalidAmount(); // Used when the amount is 0 + error NothingToRedeem(); // Used when the balance of Staker tokens is 0 + + event UsdcStaked(address indexed beneficiary, uint256 amount); + event UsdcRedeemed(address indexed beneficiary, uint256 amount); + + ERC20 private immutable i_usdcToken; + uint8 private immutable i_decimals; + + /// @notice Constructor initializes the contract with the usdc token address. + /// @param _usdcToken The address of the usdc contract. + constructor( + address _usdcToken + ) ERC20("Simple Staker", "STK") { + if (_usdcToken == address(0)) revert InvalidUsdcToken(); + i_usdcToken = ERC20(_usdcToken); + i_decimals = i_usdcToken.decimals(); + if (i_decimals == 0) revert InvalidNumberOfDecimals(); + } + + function stake( + address _beneficiary, + uint256 _amount + ) external { + if (_beneficiary == address(0)) revert InvalidBeneficiary(); + if (_amount == 0) revert InvalidAmount(); + + i_usdcToken.safeTransferFrom(msg.sender, address(this), _amount); + _mint(_beneficiary, _amount); + emit UsdcStaked(_beneficiary, _amount); + } + + function redeem() external { + uint256 balance = balanceOf(msg.sender); + if (balance == 0) revert NothingToRedeem(); + _burn(msg.sender, balance); + i_usdcToken.safeTransfer(msg.sender, balance); + emit UsdcRedeemed(msg.sender, balance); + } + + function decimals() public view override returns (uint8) { + return i_decimals; + } +} +``` + The Staker contract manages the staking and redemption of USDC tokens. Here's how it works: 1. Initializing the contract: @@ -10808,39 +12725,289 @@ The Staker contract manages the staking and redemption of USDC tokens. Here's ho ### Receiver Contract -The Receiver contract handles incoming cross-chain messages, processes them, and interacts with the Staker contract to stake USDC on behalf of the beneficiary. Here's how it works: +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; -1. Initializing the Contract: - - When deploying the contract, you define the router address, USDC token address, and staker contract address. - - These addresses are essential for interacting with the CCIP router, USDC token, and Staker contracts. +import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.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"; -2. `ccipReceive` function: - - The entry point for the CCIP router to deliver messages to the contract. - - Validates the sender and processes the message, ensuring it comes from the correct sender contract on the source chain. +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {EnumerableMap} from "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; -3. Processing Message: - - Calls the `processMessage` function, which is external to leverage Solidity's try/catch error handling mechanism. - - Inside `processMessage`, it calls the `_ccipReceive` function for further message processing. +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ -4. `_ccipReceive` function: - - Checks if the received token is USDC. If not, it reverts. - - Makes a low-level call to the `stake` function of the Staker contract using the encoded function signature and arguments from the received data. - - Emits a `MessageReceived` event upon successful processing. +/// @title - A simple receiver contract for receiving usdc tokens then calling a staking contract. +contract Receiver is CCIPReceiver, OwnerIsCreator { + using SafeERC20 for IERC20; + using EnumerableMap for EnumerableMap.Bytes32ToUintMap; + + error InvalidUsdcToken(); // Used when the usdc token address is 0 + error InvalidStaker(); // Used when the staker address is 0 + error InvalidSourceChain(); // Used when the source chain is 0 + error InvalidSenderAddress(); // Used when the sender address is 0 + error NoSenderOnSourceChain(uint64 sourceChainSelector); // Used when there is no sender for a given source chain + error WrongSenderForSourceChain(uint64 sourceChainSelector); // Used when the sender contract is not the correct one + error OnlySelf(); // Used when a function is called outside of the contract itself + error WrongReceivedToken(address usdcToken, address receivedToken); // Used if the received token is different than + // usdc token + error CallToStakerFailed(); // Used when the call to the stake function of the staker contract is not successful + error NoReturnDataExpected(); // Used if the call to the stake function of the staker contract returns data. This is + // not expected + error MessageNotFailed(bytes32 messageId); // Used if you try to retry a message that has no failed + + // Event emitted when a message is received from another chain. + // The chain selector of the source chain. + // The address of the sender from the source chain. + // The data that was received. + // The token address that was transferred. + // The token amount that was transferred. + event MessageReceived( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address indexed sender, + bytes data, + address token, + uint256 tokenAmount + ); -5. Error Handling: - - If an error occurs during processing, the catch block within ccipReceive is executed. - - The `messageId` of the failed message is added to `s_failedMessages`, and the message content is stored in `s_messageContents`. - - A `MessageFailed` event is emitted, allowing for later identification and reprocessing of failed messages. + event MessageFailed(bytes32 indexed messageId, bytes reason); + event MessageRecovered(bytes32 indexed messageId); -6. `retryFailedMessage` function: - - Allows the contract owner to retry a failed message and recover the associated tokens. - - Updates the error code for the message to `RESOLVED` to prevent multiple retries. - - Transfers the locked tokens associated with the failed message to the specified beneficiary as an escape hatch. + // Example error code, could have many different error codes. + enum ErrorCode { + // RESOLVED is first so that the default value is resolved. + RESOLVED, + // Could have any number of error codes here. + FAILED + } -7. `getFailedMessages` function: - - Retrieves a paginated list of failed messages for inspection. + struct FailedMessage { + bytes32 messageId; + ErrorCode errorCode; + } -<Aside type="caution" title="Educational Example Disclaimer"> + IERC20 private immutable i_usdcToken; + address private immutable i_staker; + + // Mapping to keep track of the sender contract per source chain. + mapping(uint64 => address) public s_senders; + + // The message contents of failed messages are stored here. + mapping(bytes32 => Client.Any2EVMMessage) public s_messageContents; + + // Contains failed messages and their state. + EnumerableMap.Bytes32ToUintMap internal s_failedMessages; + + modifier validateSourceChain( + uint64 _sourceChainSelector + ) { + if (_sourceChainSelector == 0) revert InvalidSourceChain(); + _; + } + + /// @dev Modifier to allow only the contract itself to execute a function. + /// Throws an exception if called by any account other than the contract itself. + modifier onlySelf() { + if (msg.sender != address(this)) revert OnlySelf(); + _; + } + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _usdcToken The address of the usdc contract. + /// @param _staker The address of the staker contract. + constructor( + address _router, + address _usdcToken, + address _staker + ) CCIPReceiver(_router) { + if (_usdcToken == address(0)) revert InvalidUsdcToken(); + if (_staker == address(0)) revert InvalidStaker(); + i_usdcToken = IERC20(_usdcToken); + i_staker = _staker; + i_usdcToken.approve(_staker, type(uint256).max); + } + + /// @dev Set the sender contract for a given source chain. + /// @notice This function can only be called by the owner. + /// @param _sourceChainSelector The selector of the source chain. + /// @param _sender The sender contract on the source chain . + function setSenderForSourceChain( + uint64 _sourceChainSelector, + address _sender + ) external onlyOwner validateSourceChain(_sourceChainSelector) { + if (_sender == address(0)) revert InvalidSenderAddress(); + s_senders[_sourceChainSelector] = _sender; + } + + /// @dev Delete the sender contract for a given source chain. + /// @notice This function can only be called by the owner. + /// @param _sourceChainSelector The selector of the source chain. + function deleteSenderForSourceChain( + uint64 _sourceChainSelector + ) external onlyOwner validateSourceChain(_sourceChainSelector) { + if (s_senders[_sourceChainSelector] == address(0)) { + revert NoSenderOnSourceChain(_sourceChainSelector); + } + delete s_senders[_sourceChainSelector]; + } + + /// @notice The entrypoint for the CCIP router to call. This function should + /// never revert, all errors should be handled internally in this contract. + /// @param any2EvmMessage The message to process. + /// @dev Extremely important to ensure only router calls this. + function ccipReceive( + Client.Any2EVMMessage calldata any2EvmMessage + ) external override onlyRouter { + // validate the sender contract + if (abi.decode(any2EvmMessage.sender, (address)) != s_senders[any2EvmMessage.sourceChainSelector]) { + revert WrongSenderForSourceChain(any2EvmMessage.sourceChainSelector); + } + /* solhint-disable no-empty-blocks */ + try this.processMessage(any2EvmMessage) { + // Intentionally empty in this example; no action needed if processMessage succeeds + } + catch (bytes memory err) { + // Could set different error codes based on the caught error. Each could be + // handled differently. + s_failedMessages.set(any2EvmMessage.messageId, uint256(ErrorCode.FAILED)); + s_messageContents[any2EvmMessage.messageId] = any2EvmMessage; + // Don't revert so CCIP doesn't revert. Emit event instead. + // The message can be retried later without having to do manual execution of CCIP. + emit MessageFailed(any2EvmMessage.messageId, err); + return; + } + } + + /// @notice Serves as the entry point for this contract to process incoming messages. + /// @param any2EvmMessage Received CCIP message. + /// @dev Transfers specified token amounts to the owner of this contract. This function + /// must be external because of the try/catch for error handling. + /// It uses the `onlySelf`: can only be called from the contract. + function processMessage( + Client.Any2EVMMessage calldata any2EvmMessage + ) external onlySelf { + _ccipReceive(any2EvmMessage); // process the message - may revert + } + + function _ccipReceive( + Client.Any2EVMMessage memory any2EvmMessage + ) internal override { + if (any2EvmMessage.destTokenAmounts[0].token != address(i_usdcToken)) { + revert WrongReceivedToken(address(i_usdcToken), any2EvmMessage.destTokenAmounts[0].token); + } + + (bool success, bytes memory returnData) = i_staker.call(any2EvmMessage.data); // low level call to the staker + // contract using the encoded function selector and arguments + if (!success) revert CallToStakerFailed(); + if (returnData.length > 0) revert NoReturnDataExpected(); + emit MessageReceived( + any2EvmMessage.messageId, + any2EvmMessage.sourceChainSelector, // fetch the source chain identifier (aka selector) + abi.decode(any2EvmMessage.sender, (address)), // abi-decoding of the sender address, + any2EvmMessage.data, // received data + any2EvmMessage.destTokenAmounts[0].token, + any2EvmMessage.destTokenAmounts[0].amount + ); + } + + /// @notice Allows the owner to retry a failed message in order to unblock the associated tokens. + /// @param messageId The unique identifier of the failed message. + /// @param beneficiary The address to which the tokens will be sent. + /// @dev This function is only callable by the contract owner. It changes the status of the message + /// from 'failed' to 'resolved' to prevent reentry and multiple retries of the same message. + function retryFailedMessage( + bytes32 messageId, + address beneficiary + ) external onlyOwner { + // Check if the message has failed; if not, revert the transaction. + if (s_failedMessages.get(messageId) != uint256(ErrorCode.FAILED)) { + revert MessageNotFailed(messageId); + } + + // Set the error code to RESOLVED to disallow reentry and multiple retries of the same failed message. + s_failedMessages.set(messageId, uint256(ErrorCode.RESOLVED)); + + // Retrieve the content of the failed message. + Client.Any2EVMMessage memory message = s_messageContents[messageId]; + + // This example expects one token to have been sent. + // Transfer the associated tokens to the specified receiver as an escape hatch. + IERC20(message.destTokenAmounts[0].token).safeTransfer(beneficiary, message.destTokenAmounts[0].amount); + + // Emit an event indicating that the message has been recovered. + emit MessageRecovered(messageId); + } + + /// @notice Retrieves a paginated list of failed messages. + /// @dev This function returns a subset of failed messages defined by `offset` and `limit` parameters. It ensures that + /// the pagination parameters are within the bounds of the available data set. + /// @param offset The index of the first failed message to return, enabling pagination by skipping a specified number + /// of messages from the start of the dataset. + /// @param limit The maximum number of failed messages to return, restricting the size of the returned array. + /// @return failedMessages An array of `FailedMessage` struct, each containing a `messageId` and an `errorCode` + /// (RESOLVED or FAILED), representing the requested subset of failed messages. The length of the returned array is + /// determined by the `limit` and the total number of failed messages. + function getFailedMessages( + uint256 offset, + uint256 limit + ) external view returns (FailedMessage[] memory) { + uint256 length = s_failedMessages.length(); + + // Calculate the actual number of items to return (can't exceed total length or requested limit) + uint256 returnLength = (offset + limit > length) ? length - offset : limit; + FailedMessage[] memory failedMessages = new FailedMessage[](returnLength); + + // Adjust loop to respect pagination (start at offset, end at offset + limit or total length) + for (uint256 i = 0; i < returnLength; i++) { + (bytes32 messageId, uint256 errorCode) = s_failedMessages.at(offset + i); + failedMessages[i] = FailedMessage(messageId, ErrorCode(errorCode)); + } + return failedMessages; + } +} +``` + +The Receiver contract handles incoming cross-chain messages, processes them, and interacts with the Staker contract to stake USDC on behalf of the beneficiary. Here's how it works: + +1. Initializing the Contract: + - When deploying the contract, you define the router address, USDC token address, and staker contract address. + - These addresses are essential for interacting with the CCIP router, USDC token, and Staker contracts. + +2. `ccipReceive` function: + - The entry point for the CCIP router to deliver messages to the contract. + - Validates the sender and processes the message, ensuring it comes from the correct sender contract on the source chain. + +3. Processing Message: + - Calls the `processMessage` function, which is external to leverage Solidity's try/catch error handling mechanism. + - Inside `processMessage`, it calls the `_ccipReceive` function for further message processing. + +4. `_ccipReceive` function: + - Checks if the received token is USDC. If not, it reverts. + - Makes a low-level call to the `stake` function of the Staker contract using the encoded function signature and arguments from the received data. + - Emits a `MessageReceived` event upon successful processing. + +5. Error Handling: + - If an error occurs during processing, the catch block within ccipReceive is executed. + - The `messageId` of the failed message is added to `s_failedMessages`, and the message content is stored in `s_messageContents`. + - A `MessageFailed` event is emitted, allowing for later identification and reprocessing of failed messages. + +6. `retryFailedMessage` function: + - Allows the contract owner to retry a failed message and recover the associated tokens. + - Updates the error code for the message to `RESOLVED` to prevent multiple retries. + - Transfers the locked tokens associated with the failed message to the specified beneficiary as an escape hatch. + +7. `getFailedMessages` function: + - Retrieves a paginated list of failed messages for inspection. + +<Aside type="caution" title="Educational Example Disclaimer"> This page includes an educational example to use a Chainlink system, product, or service and is provided to demonstrate how to interact with Chainlink's systems, products, and services to integrate them into your own. This template is provided "AS IS" and "AS AVAILABLE" without warranties of any kind, it has not been audited, and it may be @@ -10882,6 +13049,341 @@ In this tutorial, you will use Chainlink CCIP to send data between smart contrac In this tutorial, you will send a *string* text between smart contracts on *Avalanche Fuji* and *Ethereum Sepolia* using CCIP. First, you will pay [CCIP fees in LINK](#send-data-and-pay-in-link), then you will pay [CCIP fees in native gas](#send-data-and-pay-in-native). +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.sol"; +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 {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/// @title - A simple messenger contract for sending/receiving string data across chains. +contract Messenger is CCIPReceiver, OwnerIsCreator { + using SafeERC20 for IERC20; + + // Custom errors to provide more descriptive revert messages. + error NotEnoughBalance(uint256 currentBalance, uint256 calculatedFees); // Used to make sure contract has enough + // balance. + error NothingToWithdraw(); // Used when trying to withdraw Ether but there's nothing to withdraw. + error FailedToWithdrawEth(address owner, address target, uint256 value); // Used when the withdrawal of Ether fails. + error DestinationChainNotAllowlisted(uint64 destinationChainSelector); // Used when the destination chain has not been + // allowlisted by the contract owner. + error SourceChainNotAllowlisted(uint64 sourceChainSelector); // Used when the source chain has not been allowlisted by + // the contract owner. + error SenderNotAllowlisted(address sender); // Used when the sender has not been allowlisted by the contract owner. + error InvalidReceiverAddress(); // Used when the receiver address is 0. + + // Event emitted when a message is sent to another chain. + // The chain selector of the destination chain. + // The address of the receiver on the destination chain. + // The text being sent. + // the token address used to pay CCIP fees. + // The fees paid for sending the CCIP message. + event MessageSent( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address receiver, + string text, + address feeToken, + uint256 fees + ); + + // Event emitted when a message is received from another chain. + event MessageReceived( // The unique ID of the CCIP message. + // The chain selector of the source chain. + // The address of the sender from the source chain. + // The text that was received. + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address sender, + string text + ); + + bytes32 private s_lastReceivedMessageId; // Store the last received messageId. + string private s_lastReceivedText; // Store the last received text. + + // Mapping to keep track of allowlisted destination chains. + mapping(uint64 => bool) public allowlistedDestinationChains; + + // Mapping to keep track of allowlisted source chains. + mapping(uint64 => bool) public allowlistedSourceChains; + + // Mapping to keep track of allowlisted senders. + mapping(address => bool) public allowlistedSenders; + + IERC20 private s_linkToken; + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + constructor( + address _router, + address _link + ) CCIPReceiver(_router) { + s_linkToken = IERC20(_link); + } + + /// @dev Modifier that checks if the chain with the given destinationChainSelector is allowlisted. + /// @param _destinationChainSelector The selector of the destination chain. + modifier onlyAllowlistedDestinationChain( + uint64 _destinationChainSelector + ) { + if (!allowlistedDestinationChains[_destinationChainSelector]) { + revert DestinationChainNotAllowlisted(_destinationChainSelector); + } + _; + } + + /// @dev Modifier that checks if the chain with the given sourceChainSelector is allowlisted and if the sender is + /// allowlisted. + /// @param _sourceChainSelector The selector of the destination chain. + /// @param _sender The address of the sender. + modifier onlyAllowlisted( + uint64 _sourceChainSelector, + address _sender + ) { + if (!allowlistedSourceChains[_sourceChainSelector]) { + revert SourceChainNotAllowlisted(_sourceChainSelector); + } + if (!allowlistedSenders[_sender]) revert SenderNotAllowlisted(_sender); + _; + } + + /// @dev Modifier that checks the receiver address is not 0. + /// @param _receiver The receiver address. + modifier validateReceiver( + address _receiver + ) { + if (_receiver == address(0)) revert InvalidReceiverAddress(); + _; + } + + /// @dev Updates the allowlist status of a destination chain for transactions. + function allowlistDestinationChain( + uint64 _destinationChainSelector, + bool allowed + ) external onlyOwner { + allowlistedDestinationChains[_destinationChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a source chain for transactions. + function allowlistSourceChain( + uint64 _sourceChainSelector, + bool allowed + ) external onlyOwner { + allowlistedSourceChains[_sourceChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a sender for transactions. + function allowlistSender( + address _sender, + bool allowed + ) external onlyOwner { + allowlistedSenders[_sender] = allowed; + } + + /// @notice Sends data to receiver on the destination chain. + /// @notice Pay for fees in LINK. + /// @dev Assumes your contract has sufficient LINK. + /// @param _destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param _receiver The address of the recipient on the destination blockchain. + /// @param _text The text to be sent. + /// @return messageId The ID of the CCIP message that was sent. + function sendMessagePayLINK( + uint64 _destinationChainSelector, + address _receiver, + string calldata _text + ) + external + onlyOwner + onlyAllowlistedDestinationChain(_destinationChainSelector) + validateReceiver(_receiver) + returns (bytes32 messageId) + { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + Client.EVM2AnyMessage memory evm2AnyMessage = _buildCCIPMessage(_receiver, _text, address(s_linkToken)); + + // Initialize a router client instance to interact with cross-chain router + IRouterClient router = IRouterClient(this.getRouter()); + + // Get the fee required to send the CCIP message + uint256 fees = router.getFee(_destinationChainSelector, evm2AnyMessage); + + if (fees > s_linkToken.balanceOf(address(this))) { + revert NotEnoughBalance(s_linkToken.balanceOf(address(this)), fees); + } + + // approve the Router to transfer LINK tokens on contract's behalf. It will spend the fees in LINK + s_linkToken.approve(address(router), fees); + + // Send the CCIP message through the router and store the returned CCIP message ID + messageId = router.ccipSend(_destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit MessageSent(messageId, _destinationChainSelector, _receiver, _text, address(s_linkToken), fees); + + // Return the CCIP message ID + return messageId; + } + + /// @notice Sends data to receiver on the destination chain. + /// @notice Pay for fees in native gas. + /// @dev Assumes your contract has sufficient native gas tokens. + /// @param _destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param _receiver The address of the recipient on the destination blockchain. + /// @param _text The text to be sent. + /// @return messageId The ID of the CCIP message that was sent. + function sendMessagePayNative( + uint64 _destinationChainSelector, + address _receiver, + string calldata _text + ) + external + onlyOwner + onlyAllowlistedDestinationChain(_destinationChainSelector) + validateReceiver(_receiver) + returns (bytes32 messageId) + { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + Client.EVM2AnyMessage memory evm2AnyMessage = _buildCCIPMessage(_receiver, _text, address(0)); + + // Initialize a router client instance to interact with cross-chain router + IRouterClient router = IRouterClient(this.getRouter()); + + // Get the fee required to send the CCIP message + uint256 fees = router.getFee(_destinationChainSelector, evm2AnyMessage); + + if (fees > address(this).balance) { + revert NotEnoughBalance(address(this).balance, fees); + } + + // Send the CCIP message through the router and store the returned CCIP message ID + messageId = router.ccipSend{value: fees}(_destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit MessageSent(messageId, _destinationChainSelector, _receiver, _text, address(0), fees); + + // Return the CCIP message ID + return messageId; + } + + /// handle a received message + function _ccipReceive( + Client.Any2EVMMessage memory any2EvmMessage + ) + internal + override + onlyAllowlisted(any2EvmMessage.sourceChainSelector, abi.decode(any2EvmMessage.sender, (address))) // Make sure + // source chain and sender are allowlisted + + { + s_lastReceivedMessageId = any2EvmMessage.messageId; // fetch the messageId + s_lastReceivedText = abi.decode(any2EvmMessage.data, (string)); // abi-decoding of the sent text + + emit MessageReceived( + any2EvmMessage.messageId, + any2EvmMessage.sourceChainSelector, // fetch the source chain identifier (aka selector) + abi.decode(any2EvmMessage.sender, (address)), // abi-decoding of the sender address, + abi.decode(any2EvmMessage.data, (string)) + ); + } + + /// @notice Construct a CCIP message. + /// @dev This function will create an EVM2AnyMessage struct with all the necessary information for sending a text. + /// @param _receiver The address of the receiver. + /// @param _text The string data to be sent. + /// @param _feeTokenAddress The address of the token used for fees. Set address(0) for native gas. + /// @return Client.EVM2AnyMessage Returns an EVM2AnyMessage struct which contains information for sending a CCIP + /// message. + function _buildCCIPMessage( + address _receiver, + string calldata _text, + address _feeTokenAddress + ) private pure returns (Client.EVM2AnyMessage memory) { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + return Client.EVM2AnyMessage({ + receiver: abi.encode(_receiver), // ABI-encoded receiver address + data: abi.encode(_text), // ABI-encoded string + tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array as no tokens are transferred + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: 200_000, // Gas limit for the callback on the destination chain + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender + }) + ), + // Set the feeToken to a feeTokenAddress, indicating specific asset will be used for fees + feeToken: _feeTokenAddress + }); + } + + /// @notice Fetches the details of the last received message. + /// @return messageId The ID of the last received message. + /// @return text The last received text. + function getLastReceivedMessageDetails() external view returns (bytes32 messageId, string memory text) { + return (s_lastReceivedMessageId, s_lastReceivedText); + } + + /// @notice Fallback function to allow the contract to receive Ether. + /// @dev This function has no function body, making it a default function for receiving Ether. + /// It is automatically called when Ether is sent to the contract without any data. + receive() external payable {} + + /// @notice Allows the contract owner to withdraw the entire balance of Ether from the contract. + /// @dev This function reverts if there are no funds to withdraw or if the transfer fails. + /// It should only be callable by the owner of the contract. + /// @param _beneficiary The address to which the Ether should be sent. + function withdraw( + address _beneficiary + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = address(this).balance; + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + // Attempt to send the funds, capturing the success status and discarding any return data + (bool sent,) = _beneficiary.call{value: amount}(""); + + // Revert if the send failed, with information about the attempted transfer + if (!sent) revert FailedToWithdrawEth(msg.sender, _beneficiary, amount); + } + + /// @notice Allows the owner of the contract to withdraw all tokens of a specific ERC20 token. + /// @dev This function reverts with a 'NothingToWithdraw' error if there are no tokens to withdraw. + /// @param _beneficiary The address to which the tokens will be sent. + /// @param _token The contract address of the ERC20 token to be withdrawn. + function withdrawToken( + address _beneficiary, + address _token + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = IERC20(_token).balanceOf(address(this)); + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + IERC20(_token).safeTransfer(_beneficiary, amount); + } +} +``` + ### Deploy your contracts To use this contract: @@ -11167,6 +13669,319 @@ Deploy the `MessageTracker.sol` contract on *Avalanche Fuji* and enable it to se 1. [Open the MessageTracker.sol contract](https://remix.ethereum.org/#url=https://docs.chain.link/samples/CCIP/MessageTracker.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + pragma solidity 0.8.24; + + import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.sol"; + 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 {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + + using SafeERC20 for IERC20; + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + + /// @title - A simple messenger contract for sending/receiving data across chains and tracking the status of sent + /// messages. + contract MessageTracker is CCIPReceiver, OwnerIsCreator { + // Custom errors to provide more descriptive revert messages. + error NotEnoughBalance(uint256 currentBalance, uint256 calculatedFees); // Used to make sure contract has enough + // balance. + error NothingToWithdraw(); // Used when trying to withdraw Ether but there's nothing to withdraw. + error DestinationChainNotAllowlisted(uint64 destinationChainSelector); // Used when the destination chain has not been + // allowlisted by the contract owner. + error SourceChainNotAllowlisted(uint64 sourceChainSelector); // Used when the source chain has not been allowlisted by + // the contract owner. + error SenderNotAllowlisted(address sender); // Used when the sender has not been allowlisted by the contract owner. + error InvalidReceiverAddress(); // Used when the receiver address is 0. + error MessageWasNotSentByMessageTracker(bytes32 msgId); // Triggered when attempting to confirm a message not + // recognized as sent by this tracker. + error MessageHasAlreadyBeenProcessedOnDestination(bytes32 msgId); // Triggered when trying to mark a message as + // `ProcessedOnDestination` when it is already marked as such. + + // Enum is used to track the status of messages sent via CCIP. + // `NotSent` indicates a message has not yet been sent. + // `Sent` indicates that a message has been sent to the Acknowledger contract but not yet acknowledged. + // `ProcessedOnDestination` indicates that the Acknowledger contract has processed the message and that + // the Message Tracker contract has received the acknowledgment from the Acknowledger contract. + enum MessageStatus { + NotSent, // 0 + Sent, // 1 + ProcessedOnDestination // 2 + } + + // Struct to store the status and acknowledger message ID of a message. + struct MessageInfo { + MessageStatus status; + bytes32 acknowledgerMessageId; + } + + // Mapping to keep track of allowlisted destination chains. + mapping(uint64 => bool) public allowlistedDestinationChains; + + // Mapping to keep track of allowlisted source chains. + mapping(uint64 => bool) public allowlistedSourceChains; + + // Mapping to keep track of allowlisted senders. + mapping(address => bool) public allowlistedSenders; + + // Mapping to keep track of message IDs to their info (status & acknowledger message ID). + mapping(bytes32 => MessageInfo) public messagesInfo; + + // Event emitted when a message is sent to another chain. + // The chain selector of the destination chain. + // The address of the receiver on the destination chain. + // The text being sent. + // the token address used to pay CCIP fees. + // The fees paid for sending the CCIP message. + event MessageSent( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address receiver, + string text, + address feeToken, + uint256 fees + ); + + // Event emitted when the sender contract receives an acknowledgment + // that the receiver contract has successfully received and processed the message. + event MessageProcessedOnDestination( // The unique ID of the CCIP acknowledgment message. + // The unique ID of the message acknowledged by the receiver. + // The chain selector of the source chain. + // The address of the sender from the source chain. + bytes32 indexed messageId, + bytes32 indexed acknowledgedMsgId, + uint64 indexed sourceChainSelector, + address sender + ); + + IERC20 private s_linkToken; + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + constructor( + address _router, + address _link + ) CCIPReceiver(_router) { + s_linkToken = IERC20(_link); + } + + /// @dev Modifier that checks if the chain with the given destinationChainSelector is allowlisted. + /// @param _destinationChainSelector The selector of the destination chain. + modifier onlyAllowlistedDestinationChain( + uint64 _destinationChainSelector + ) { + if (!allowlistedDestinationChains[_destinationChainSelector]) { + revert DestinationChainNotAllowlisted(_destinationChainSelector); + } + _; + } + + /// @dev Modifier that checks if the chain with the given sourceChainSelector is allowlisted and if the sender is + /// allowlisted. + /// @param _sourceChainSelector The selector of the destination chain. + /// @param _sender The address of the sender. + modifier onlyAllowlisted( + uint64 _sourceChainSelector, + address _sender + ) { + if (!allowlistedSourceChains[_sourceChainSelector]) { + revert SourceChainNotAllowlisted(_sourceChainSelector); + } + if (!allowlistedSenders[_sender]) revert SenderNotAllowlisted(_sender); + _; + } + + /// @dev Modifier that checks the receiver address is not 0. + /// @param _receiver The receiver address. + modifier validateReceiver( + address _receiver + ) { + if (_receiver == address(0)) revert InvalidReceiverAddress(); + _; + } + + /// @dev Updates the allowlist status of a destination chain for transactions. + function allowlistDestinationChain( + uint64 _destinationChainSelector, + bool allowed + ) external onlyOwner { + allowlistedDestinationChains[_destinationChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a source chain for transactions. + function allowlistSourceChain( + uint64 _sourceChainSelector, + bool allowed + ) external onlyOwner { + allowlistedSourceChains[_sourceChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a sender for transactions. + function allowlistSender( + address _sender, + bool allowed + ) external onlyOwner { + allowlistedSenders[_sender] = allowed; + } + + /// @notice Sends data to receiver on the destination chain. + /// @notice Pay for fees in LINK. + /// @dev Assumes your contract has sufficient LINK. + /// @param _destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param _receiver The address of the recipient on the destination blockchain. + /// @param _text The text to be sent. + /// @return messageId The ID of the CCIP message that was sent. + function sendMessagePayLINK( + uint64 _destinationChainSelector, + address _receiver, + string calldata _text + ) + external + onlyOwner + onlyAllowlistedDestinationChain(_destinationChainSelector) + validateReceiver(_receiver) + returns (bytes32 messageId) + { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + Client.EVM2AnyMessage memory evm2AnyMessage = _buildCCIPMessage(_receiver, _text, address(s_linkToken)); + + // Initialize a router client instance to interact with cross-chain router + IRouterClient router = IRouterClient(this.getRouter()); + + // Get the fee required to send the CCIP message + uint256 fees = router.getFee(_destinationChainSelector, evm2AnyMessage); + + if (fees > s_linkToken.balanceOf(address(this))) { + revert NotEnoughBalance(s_linkToken.balanceOf(address(this)), fees); + } + + // approve the Router to transfer LINK tokens on contract's behalf. It will spend the fees in LINK + s_linkToken.approve(address(router), fees); + + // Send the CCIP message through the router and store the returned CCIP message ID + messageId = router.ccipSend(_destinationChainSelector, evm2AnyMessage); + + // Update the message status to `Sent` + messagesInfo[messageId].status = MessageStatus.Sent; + + // Emit an event with message details + emit MessageSent(messageId, _destinationChainSelector, _receiver, _text, address(s_linkToken), fees); + + // Return the CCIP message ID + return messageId; + } + + /** + * @dev Receives and processes messages sent via the Chainlink CCIP from allowed chains and senders. + * Upon receiving a message, this function checks if the message's associated data indicates a previously + * sent message awaiting acknowledgment. If the message is valid (i.e., its status is `Sent`), it updates + * the message's status to `ProcessedOnDestination`, thereby acknowledging its receipt. It then emits a + * `MessageProcessedOnDestination` + * event. If the message cannot be validated (e.g., it was not sent or has been tampered with), the function + * reverts with a `MessageWasNotSentByMessageTracker` error. This mechanism ensures that only messages + * genuinely sent and awaiting acknowledgment are marked as `ProcessedOnDestination`. + * @param any2EvmMessage The CCIP message received, which includes the message ID, the data being acknowledged, + * the source chain selector, and the sender's address. + */ + function _ccipReceive( + Client.Any2EVMMessage memory any2EvmMessage + ) + internal + override + onlyAllowlisted(any2EvmMessage.sourceChainSelector, abi.decode(any2EvmMessage.sender, (address))) // Ensure the + // source chain and sender are allowlisted for added security + + { + bytes32 initialMsgId = abi.decode(any2EvmMessage.data, (bytes32)); // Decode the data sent by the receiver + bytes32 acknowledgerMsgId = any2EvmMessage.messageId; + messagesInfo[initialMsgId].acknowledgerMessageId = acknowledgerMsgId; // Store the messageId of the received message + + if (messagesInfo[initialMsgId].status == MessageStatus.Sent) { + // Updates the status of the message to 'ProcessedOnDestination' to reflect that an acknowledgment + // of receipt has been received and emits an event to log this confirmation along with relevant details. + messagesInfo[initialMsgId].status = MessageStatus.ProcessedOnDestination; + emit MessageProcessedOnDestination( + acknowledgerMsgId, + initialMsgId, + any2EvmMessage.sourceChainSelector, + abi.decode(any2EvmMessage.sender, (address)) + ); + } else if (messagesInfo[initialMsgId].status == MessageStatus.ProcessedOnDestination) { + // If the message is already marked as 'ProcessedOnDestination', this indicates an attempt to + // re-confirm a message that has already been processed on the destination chain and marked as such. + revert MessageHasAlreadyBeenProcessedOnDestination(initialMsgId); + } else { + // If the message status is neither 'Sent' nor 'ProcessedOnDestination', it implies that the + // message ID provided for acknowledgment does not correspond to a valid, previously + // sent message. + revert MessageWasNotSentByMessageTracker(initialMsgId); + } + } + + /// @notice Construct a CCIP message. + /// @dev This function will create an EVM2AnyMessage struct with all the necessary information for sending a text. + /// @param _receiver The address of the receiver. + /// @param _text The string data to be sent. + /// @param _feeTokenAddress The address of the token used for fees. Set address(0) for native gas. + /// @return Client.EVM2AnyMessage Returns an EVM2AnyMessage struct which contains information for sending a CCIP + /// message. + function _buildCCIPMessage( + address _receiver, + string calldata _text, + address _feeTokenAddress + ) private pure returns (Client.EVM2AnyMessage memory) { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + return Client.EVM2AnyMessage({ + receiver: abi.encode(_receiver), // ABI-encoded receiver address + data: abi.encode(_text), // ABI-encoded string + tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array as no tokens are transferred + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: 300_000, + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender + }) + ), + // Set the feeToken to a feeTokenAddress, indicating specific asset will be used for fees + feeToken: _feeTokenAddress + }); + } + + /// @notice Allows the owner of the contract to withdraw all tokens of a specific ERC20 token. + /// @dev This function reverts with a 'NothingToWithdraw' error if there are no tokens to withdraw. + /// @param _beneficiary The address to which the tokens will be sent. + /// @param _token The contract address of the ERC20 token to be withdrawn. + function withdrawToken( + address _beneficiary, + address _token + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = IERC20(_token).balanceOf(address(this)); + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + IERC20(_token).safeTransfer(_beneficiary, amount); + } + } + ``` + Note: The contract code is also available in the [Examine the code](/ccip/tutorials/evm/send-arbitrary-data-receipt-acknowledgment#messagetrackersol) section. 2. Compile the contract. @@ -11201,6 +14016,254 @@ Deploy the `Acknowledger.sol` contract on *Ethereum Sepolia* and enable it to se 1. [Open the Acknowledger.sol](https://remix.ethereum.org/#url=https://docs.chain.link/samples/CCIP/Acknowledger.sol) contract in Remix. + ```sol + // SPDX-License-Identifier: MIT + pragma solidity 0.8.24; + + import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.sol"; + 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 {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + + using SafeERC20 for IERC20; + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + + /// @title - A simple acknowledger contract for receiving data and sending acknowledgement of receipt messages across + /// chains. + contract Acknowledger is CCIPReceiver, OwnerIsCreator { + // Custom errors to provide more descriptive revert messages. + error NotEnoughBalance(uint256 currentBalance, uint256 calculatedFees); // Used to make sure contract has enough + // balance. + error NothingToWithdraw(); // Used when trying to withdraw Ether but there's nothing to withdraw. + error DestinationChainNotAllowlisted(uint64 destinationChainSelector); // Used when the destination chain has not been + // allowlisted by the contract owner. + error InvalidReceiverAddress(); // Used when the receiver address is 0. + error SourceChainNotAllowlisted(uint64 sourceChainSelector); // Used when the source chain has not been allowlisted by + // the contract owner. + error SenderNotAllowlisted(address sender); // Used when the sender has not been allowlisted by the contract owner. + + string private s_lastReceivedText; // Store the last received text. + + // Mapping to keep track of allowlisted destination chains. + mapping(uint64 => bool) public allowlistedDestinationChains; + + // Mapping to keep track of allowlisted source chains. + mapping(uint64 => bool) public allowlistedSourceChains; + + // Mapping to keep track of allowlisted senders. + mapping(address => bool) public allowlistedSenders; + + // Emitted when an acknowledgment message is successfully sent back to the sender contract. + // This event signifies that the Acknowledger contract has recognized the receipt of an initial message + // and has informed the original sender contract by sending an acknowledgment message, + // including the original message ID. + // The chain selector of the destination chain. + // The address of the receiver on the destination chain. + // The data being sent back, containing the message ID of the initial message to acknowledge. + // The token address used to pay CCIP fees for sending the acknowledgment. + // The fees paid for sending the acknowledgment message via CCIP. + event AcknowledgmentSent( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address indexed receiver, + bytes32 data, + address feeToken, + uint256 fees + ); + + IERC20 private s_linkToken; + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + constructor( + address _router, + address _link + ) CCIPReceiver(_router) { + s_linkToken = IERC20(_link); + } + + /// @dev Modifier that checks if the chain with the given destinationChainSelector is allowlisted. + /// @param _destinationChainSelector The selector of the destination chain. + modifier onlyAllowlistedDestinationChain( + uint64 _destinationChainSelector + ) { + if (!allowlistedDestinationChains[_destinationChainSelector]) { + revert DestinationChainNotAllowlisted(_destinationChainSelector); + } + _; + } + + /// @dev Modifier that checks if the chain with the given sourceChainSelector is allowlisted and if the sender is + /// allowlisted. + /// @param _sourceChainSelector The selector of the destination chain. + /// @param _sender The address of the sender. + modifier onlyAllowlisted( + uint64 _sourceChainSelector, + address _sender + ) { + if (!allowlistedSourceChains[_sourceChainSelector]) { + revert SourceChainNotAllowlisted(_sourceChainSelector); + } + if (!allowlistedSenders[_sender]) revert SenderNotAllowlisted(_sender); + _; + } + + /// @dev Updates the allowlist status of a destination chain for transactions. + function allowlistDestinationChain( + uint64 _destinationChainSelector, + bool allowed + ) external onlyOwner { + allowlistedDestinationChains[_destinationChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a source chain for transactions. + function allowlistSourceChain( + uint64 _sourceChainSelector, + bool allowed + ) external onlyOwner { + allowlistedSourceChains[_sourceChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a sender for transactions. + function allowlistSender( + address _sender, + bool allowed + ) external onlyOwner { + allowlistedSenders[_sender] = allowed; + } + + /// @notice Sends an acknowledgment message back to the sender contract on the source chain + /// and pays the fees using LINK tokens. + /// @dev This function constructs and sends an acknowledgment message using CCIP, + /// indicating the receipt and processing of an initial message. It emits the `AcknowledgmentSent` event + /// upon successful sending. This function should be called after processing the received message + /// to inform the sender contract about the successful message reception. + /// @param _messageIdToAcknowledge The message ID of the initial message being acknowledged. + /// @param _messageTrackerAddress The address of the message tracker contract on the source chain. + /// @param _messageTrackerChainSelector The chain selector of the source chain. + function _acknowledgePayLINK( + bytes32 _messageIdToAcknowledge, + address _messageTrackerAddress, + uint64 _messageTrackerChainSelector + ) private { + if (_messageTrackerAddress == address(0)) { + revert InvalidReceiverAddress(); + } + + // Construct the CCIP message for acknowledgment, including the message ID of the initial message. + Client.EVM2AnyMessage memory acknowledgment = Client.EVM2AnyMessage({ + receiver: abi.encode(_messageTrackerAddress), // ABI-encoded receiver address + data: abi.encode(_messageIdToAcknowledge), // ABI-encoded message ID to acknowledge + tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array aas no tokens are transferred + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: 200_000, + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender. + }) + ), + // Set the feeToken to a feeTokenAddress, indicating specific asset will be used for fees + feeToken: address(s_linkToken) + }); + + // Initialize a router client instance to interact with the cross-chain router. + IRouterClient router = IRouterClient(this.getRouter()); + + // Calculate the fee required to send the CCIP acknowledgment message. + uint256 fees = router.getFee( + _messageTrackerChainSelector, // The chain selector for routing the message. + acknowledgment // The acknowledgment message data. + ); + + // Ensure the contract has sufficient balance to cover the message sending fees. + if (fees > s_linkToken.balanceOf(address(this))) { + revert NotEnoughBalance(s_linkToken.balanceOf(address(this)), fees); + } + + // Approve the router to transfer LINK tokens on behalf of this contract to cover the sending fees. + s_linkToken.approve(address(router), fees); + + // Send the acknowledgment message via the CCIP router and capture the resulting message ID. + bytes32 messageId = router.ccipSend( + _messageTrackerChainSelector, // The destination chain selector. + acknowledgment // The CCIP message payload for acknowledgment. + ); + + // Emit an event detailing the acknowledgment message sending, for external tracking and verification. + emit AcknowledgmentSent( + messageId, // The ID of the sent acknowledgment message. + _messageTrackerChainSelector, // The destination chain selector. + _messageTrackerAddress, // The receiver of the acknowledgment, typically the original sender. + _messageIdToAcknowledge, // The original message ID that was acknowledged. + address(s_linkToken), // The fee token used. + fees // The fees paid for sending the message. + ); + } + + /// @dev Handles a received CCIP message, processes it, and acknowledges its receipt. + /// This internal function is called upon the receipt of a new message via CCIP from an allowlisted source chain and + /// sender. + /// It decodes the message and acknowledges its receipt by calling `_acknowledgePayLINK`. + /// @param any2EvmMessage The CCIP message received + function _ccipReceive( + Client.Any2EVMMessage memory any2EvmMessage + ) + internal + override + onlyAllowlisted(any2EvmMessage.sourceChainSelector, abi.decode(any2EvmMessage.sender, (address))) // Make sure + // source chain and sender are allowlisted + + { + bytes32 messageIdToAcknowledge = any2EvmMessage.messageId; // The message ID of the received message to acknowledge + address messageTrackerAddress = abi.decode(any2EvmMessage.sender, (address)); // ABI-decoding of the message tracker + // address + uint64 messageTrackerChainSelector = any2EvmMessage.sourceChainSelector; // The chain selector of the received + // message + s_lastReceivedText = abi.decode(any2EvmMessage.data, (string)); // abi-decoding of the sent text + + _acknowledgePayLINK(messageIdToAcknowledge, messageTrackerAddress, messageTrackerChainSelector); + } + + /// @notice Fetches the details of the last received message. + /// @return text The last received text. + function getLastReceivedMessage() external view returns (string memory text) { + return (s_lastReceivedText); + } + + /// @notice Allows the owner of the contract to withdraw all tokens of a specific ERC20 token. + /// @dev This function reverts with a 'NothingToWithdraw' error if there are no tokens to withdraw. + /// @param _beneficiary The address to which the tokens will be sent. + /// @param _token The contract address of the ERC20 token to be withdrawn. + function withdrawToken( + address _beneficiary, + address _token + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = IERC20(_token).balanceOf(address(this)); + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + IERC20(_token).safeTransfer(_beneficiary, amount); + } + } + ``` + Note: The contract code is also available in the [Examine the code](/ccip/tutorials/evm/send-arbitrary-data-receipt-acknowledgment#acknowledgersol) section. 2. Compile the contract. @@ -11446,8 +14509,569 @@ Both contracts use allowlists to process only messages from and to allowed sourc ### MessageTracker.sol +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.sol"; +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 {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +using SafeERC20 for IERC20; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/// @title - A simple messenger contract for sending/receiving data across chains and tracking the status of sent +/// messages. +contract MessageTracker is CCIPReceiver, OwnerIsCreator { + // Custom errors to provide more descriptive revert messages. + error NotEnoughBalance(uint256 currentBalance, uint256 calculatedFees); // Used to make sure contract has enough + // balance. + error NothingToWithdraw(); // Used when trying to withdraw Ether but there's nothing to withdraw. + error DestinationChainNotAllowlisted(uint64 destinationChainSelector); // Used when the destination chain has not been + // allowlisted by the contract owner. + error SourceChainNotAllowlisted(uint64 sourceChainSelector); // Used when the source chain has not been allowlisted by + // the contract owner. + error SenderNotAllowlisted(address sender); // Used when the sender has not been allowlisted by the contract owner. + error InvalidReceiverAddress(); // Used when the receiver address is 0. + error MessageWasNotSentByMessageTracker(bytes32 msgId); // Triggered when attempting to confirm a message not + // recognized as sent by this tracker. + error MessageHasAlreadyBeenProcessedOnDestination(bytes32 msgId); // Triggered when trying to mark a message as + // `ProcessedOnDestination` when it is already marked as such. + + // Enum is used to track the status of messages sent via CCIP. + // `NotSent` indicates a message has not yet been sent. + // `Sent` indicates that a message has been sent to the Acknowledger contract but not yet acknowledged. + // `ProcessedOnDestination` indicates that the Acknowledger contract has processed the message and that + // the Message Tracker contract has received the acknowledgment from the Acknowledger contract. + enum MessageStatus { + NotSent, // 0 + Sent, // 1 + ProcessedOnDestination // 2 + } + + // Struct to store the status and acknowledger message ID of a message. + struct MessageInfo { + MessageStatus status; + bytes32 acknowledgerMessageId; + } + + // Mapping to keep track of allowlisted destination chains. + mapping(uint64 => bool) public allowlistedDestinationChains; + + // Mapping to keep track of allowlisted source chains. + mapping(uint64 => bool) public allowlistedSourceChains; + + // Mapping to keep track of allowlisted senders. + mapping(address => bool) public allowlistedSenders; + + // Mapping to keep track of message IDs to their info (status & acknowledger message ID). + mapping(bytes32 => MessageInfo) public messagesInfo; + + // Event emitted when a message is sent to another chain. + // The chain selector of the destination chain. + // The address of the receiver on the destination chain. + // The text being sent. + // the token address used to pay CCIP fees. + // The fees paid for sending the CCIP message. + event MessageSent( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address receiver, + string text, + address feeToken, + uint256 fees + ); + + // Event emitted when the sender contract receives an acknowledgment + // that the receiver contract has successfully received and processed the message. + event MessageProcessedOnDestination( // The unique ID of the CCIP acknowledgment message. + // The unique ID of the message acknowledged by the receiver. + // The chain selector of the source chain. + // The address of the sender from the source chain. + bytes32 indexed messageId, + bytes32 indexed acknowledgedMsgId, + uint64 indexed sourceChainSelector, + address sender + ); + + IERC20 private s_linkToken; + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + constructor( + address _router, + address _link + ) CCIPReceiver(_router) { + s_linkToken = IERC20(_link); + } + + /// @dev Modifier that checks if the chain with the given destinationChainSelector is allowlisted. + /// @param _destinationChainSelector The selector of the destination chain. + modifier onlyAllowlistedDestinationChain( + uint64 _destinationChainSelector + ) { + if (!allowlistedDestinationChains[_destinationChainSelector]) { + revert DestinationChainNotAllowlisted(_destinationChainSelector); + } + _; + } + + /// @dev Modifier that checks if the chain with the given sourceChainSelector is allowlisted and if the sender is + /// allowlisted. + /// @param _sourceChainSelector The selector of the destination chain. + /// @param _sender The address of the sender. + modifier onlyAllowlisted( + uint64 _sourceChainSelector, + address _sender + ) { + if (!allowlistedSourceChains[_sourceChainSelector]) { + revert SourceChainNotAllowlisted(_sourceChainSelector); + } + if (!allowlistedSenders[_sender]) revert SenderNotAllowlisted(_sender); + _; + } + + /// @dev Modifier that checks the receiver address is not 0. + /// @param _receiver The receiver address. + modifier validateReceiver( + address _receiver + ) { + if (_receiver == address(0)) revert InvalidReceiverAddress(); + _; + } + + /// @dev Updates the allowlist status of a destination chain for transactions. + function allowlistDestinationChain( + uint64 _destinationChainSelector, + bool allowed + ) external onlyOwner { + allowlistedDestinationChains[_destinationChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a source chain for transactions. + function allowlistSourceChain( + uint64 _sourceChainSelector, + bool allowed + ) external onlyOwner { + allowlistedSourceChains[_sourceChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a sender for transactions. + function allowlistSender( + address _sender, + bool allowed + ) external onlyOwner { + allowlistedSenders[_sender] = allowed; + } + + /// @notice Sends data to receiver on the destination chain. + /// @notice Pay for fees in LINK. + /// @dev Assumes your contract has sufficient LINK. + /// @param _destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param _receiver The address of the recipient on the destination blockchain. + /// @param _text The text to be sent. + /// @return messageId The ID of the CCIP message that was sent. + function sendMessagePayLINK( + uint64 _destinationChainSelector, + address _receiver, + string calldata _text + ) + external + onlyOwner + onlyAllowlistedDestinationChain(_destinationChainSelector) + validateReceiver(_receiver) + returns (bytes32 messageId) + { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + Client.EVM2AnyMessage memory evm2AnyMessage = _buildCCIPMessage(_receiver, _text, address(s_linkToken)); + + // Initialize a router client instance to interact with cross-chain router + IRouterClient router = IRouterClient(this.getRouter()); + + // Get the fee required to send the CCIP message + uint256 fees = router.getFee(_destinationChainSelector, evm2AnyMessage); + + if (fees > s_linkToken.balanceOf(address(this))) { + revert NotEnoughBalance(s_linkToken.balanceOf(address(this)), fees); + } + + // approve the Router to transfer LINK tokens on contract's behalf. It will spend the fees in LINK + s_linkToken.approve(address(router), fees); + + // Send the CCIP message through the router and store the returned CCIP message ID + messageId = router.ccipSend(_destinationChainSelector, evm2AnyMessage); + + // Update the message status to `Sent` + messagesInfo[messageId].status = MessageStatus.Sent; + + // Emit an event with message details + emit MessageSent(messageId, _destinationChainSelector, _receiver, _text, address(s_linkToken), fees); + + // Return the CCIP message ID + return messageId; + } + + /** + * @dev Receives and processes messages sent via the Chainlink CCIP from allowed chains and senders. + * Upon receiving a message, this function checks if the message's associated data indicates a previously + * sent message awaiting acknowledgment. If the message is valid (i.e., its status is `Sent`), it updates + * the message's status to `ProcessedOnDestination`, thereby acknowledging its receipt. It then emits a + * `MessageProcessedOnDestination` + * event. If the message cannot be validated (e.g., it was not sent or has been tampered with), the function + * reverts with a `MessageWasNotSentByMessageTracker` error. This mechanism ensures that only messages + * genuinely sent and awaiting acknowledgment are marked as `ProcessedOnDestination`. + * @param any2EvmMessage The CCIP message received, which includes the message ID, the data being acknowledged, + * the source chain selector, and the sender's address. + */ + function _ccipReceive( + Client.Any2EVMMessage memory any2EvmMessage + ) + internal + override + onlyAllowlisted(any2EvmMessage.sourceChainSelector, abi.decode(any2EvmMessage.sender, (address))) // Ensure the + // source chain and sender are allowlisted for added security + + { + bytes32 initialMsgId = abi.decode(any2EvmMessage.data, (bytes32)); // Decode the data sent by the receiver + bytes32 acknowledgerMsgId = any2EvmMessage.messageId; + messagesInfo[initialMsgId].acknowledgerMessageId = acknowledgerMsgId; // Store the messageId of the received message + + if (messagesInfo[initialMsgId].status == MessageStatus.Sent) { + // Updates the status of the message to 'ProcessedOnDestination' to reflect that an acknowledgment + // of receipt has been received and emits an event to log this confirmation along with relevant details. + messagesInfo[initialMsgId].status = MessageStatus.ProcessedOnDestination; + emit MessageProcessedOnDestination( + acknowledgerMsgId, + initialMsgId, + any2EvmMessage.sourceChainSelector, + abi.decode(any2EvmMessage.sender, (address)) + ); + } else if (messagesInfo[initialMsgId].status == MessageStatus.ProcessedOnDestination) { + // If the message is already marked as 'ProcessedOnDestination', this indicates an attempt to + // re-confirm a message that has already been processed on the destination chain and marked as such. + revert MessageHasAlreadyBeenProcessedOnDestination(initialMsgId); + } else { + // If the message status is neither 'Sent' nor 'ProcessedOnDestination', it implies that the + // message ID provided for acknowledgment does not correspond to a valid, previously + // sent message. + revert MessageWasNotSentByMessageTracker(initialMsgId); + } + } + + /// @notice Construct a CCIP message. + /// @dev This function will create an EVM2AnyMessage struct with all the necessary information for sending a text. + /// @param _receiver The address of the receiver. + /// @param _text The string data to be sent. + /// @param _feeTokenAddress The address of the token used for fees. Set address(0) for native gas. + /// @return Client.EVM2AnyMessage Returns an EVM2AnyMessage struct which contains information for sending a CCIP + /// message. + function _buildCCIPMessage( + address _receiver, + string calldata _text, + address _feeTokenAddress + ) private pure returns (Client.EVM2AnyMessage memory) { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + return Client.EVM2AnyMessage({ + receiver: abi.encode(_receiver), // ABI-encoded receiver address + data: abi.encode(_text), // ABI-encoded string + tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array as no tokens are transferred + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: 300_000, + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender + }) + ), + // Set the feeToken to a feeTokenAddress, indicating specific asset will be used for fees + feeToken: _feeTokenAddress + }); + } + + /// @notice Allows the owner of the contract to withdraw all tokens of a specific ERC20 token. + /// @dev This function reverts with a 'NothingToWithdraw' error if there are no tokens to withdraw. + /// @param _beneficiary The address to which the tokens will be sent. + /// @param _token The contract address of the ERC20 token to be withdrawn. + function withdrawToken( + address _beneficiary, + address _token + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = IERC20(_token).balanceOf(address(this)); + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + IERC20(_token).safeTransfer(_beneficiary, amount); + } +} +``` + ### Acknowledger.sol +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.sol"; +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 {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +using SafeERC20 for IERC20; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/// @title - A simple acknowledger contract for receiving data and sending acknowledgement of receipt messages across +/// chains. +contract Acknowledger is CCIPReceiver, OwnerIsCreator { + // Custom errors to provide more descriptive revert messages. + error NotEnoughBalance(uint256 currentBalance, uint256 calculatedFees); // Used to make sure contract has enough + // balance. + error NothingToWithdraw(); // Used when trying to withdraw Ether but there's nothing to withdraw. + error DestinationChainNotAllowlisted(uint64 destinationChainSelector); // Used when the destination chain has not been + // allowlisted by the contract owner. + error InvalidReceiverAddress(); // Used when the receiver address is 0. + error SourceChainNotAllowlisted(uint64 sourceChainSelector); // Used when the source chain has not been allowlisted by + // the contract owner. + error SenderNotAllowlisted(address sender); // Used when the sender has not been allowlisted by the contract owner. + + string private s_lastReceivedText; // Store the last received text. + + // Mapping to keep track of allowlisted destination chains. + mapping(uint64 => bool) public allowlistedDestinationChains; + + // Mapping to keep track of allowlisted source chains. + mapping(uint64 => bool) public allowlistedSourceChains; + + // Mapping to keep track of allowlisted senders. + mapping(address => bool) public allowlistedSenders; + + // Emitted when an acknowledgment message is successfully sent back to the sender contract. + // This event signifies that the Acknowledger contract has recognized the receipt of an initial message + // and has informed the original sender contract by sending an acknowledgment message, + // including the original message ID. + // The chain selector of the destination chain. + // The address of the receiver on the destination chain. + // The data being sent back, containing the message ID of the initial message to acknowledge. + // The token address used to pay CCIP fees for sending the acknowledgment. + // The fees paid for sending the acknowledgment message via CCIP. + event AcknowledgmentSent( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address indexed receiver, + bytes32 data, + address feeToken, + uint256 fees + ); + + IERC20 private s_linkToken; + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + constructor( + address _router, + address _link + ) CCIPReceiver(_router) { + s_linkToken = IERC20(_link); + } + + /// @dev Modifier that checks if the chain with the given destinationChainSelector is allowlisted. + /// @param _destinationChainSelector The selector of the destination chain. + modifier onlyAllowlistedDestinationChain( + uint64 _destinationChainSelector + ) { + if (!allowlistedDestinationChains[_destinationChainSelector]) { + revert DestinationChainNotAllowlisted(_destinationChainSelector); + } + _; + } + + /// @dev Modifier that checks if the chain with the given sourceChainSelector is allowlisted and if the sender is + /// allowlisted. + /// @param _sourceChainSelector The selector of the destination chain. + /// @param _sender The address of the sender. + modifier onlyAllowlisted( + uint64 _sourceChainSelector, + address _sender + ) { + if (!allowlistedSourceChains[_sourceChainSelector]) { + revert SourceChainNotAllowlisted(_sourceChainSelector); + } + if (!allowlistedSenders[_sender]) revert SenderNotAllowlisted(_sender); + _; + } + + /// @dev Updates the allowlist status of a destination chain for transactions. + function allowlistDestinationChain( + uint64 _destinationChainSelector, + bool allowed + ) external onlyOwner { + allowlistedDestinationChains[_destinationChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a source chain for transactions. + function allowlistSourceChain( + uint64 _sourceChainSelector, + bool allowed + ) external onlyOwner { + allowlistedSourceChains[_sourceChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a sender for transactions. + function allowlistSender( + address _sender, + bool allowed + ) external onlyOwner { + allowlistedSenders[_sender] = allowed; + } + + /// @notice Sends an acknowledgment message back to the sender contract on the source chain + /// and pays the fees using LINK tokens. + /// @dev This function constructs and sends an acknowledgment message using CCIP, + /// indicating the receipt and processing of an initial message. It emits the `AcknowledgmentSent` event + /// upon successful sending. This function should be called after processing the received message + /// to inform the sender contract about the successful message reception. + /// @param _messageIdToAcknowledge The message ID of the initial message being acknowledged. + /// @param _messageTrackerAddress The address of the message tracker contract on the source chain. + /// @param _messageTrackerChainSelector The chain selector of the source chain. + function _acknowledgePayLINK( + bytes32 _messageIdToAcknowledge, + address _messageTrackerAddress, + uint64 _messageTrackerChainSelector + ) private { + if (_messageTrackerAddress == address(0)) { + revert InvalidReceiverAddress(); + } + + // Construct the CCIP message for acknowledgment, including the message ID of the initial message. + Client.EVM2AnyMessage memory acknowledgment = Client.EVM2AnyMessage({ + receiver: abi.encode(_messageTrackerAddress), // ABI-encoded receiver address + data: abi.encode(_messageIdToAcknowledge), // ABI-encoded message ID to acknowledge + tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array aas no tokens are transferred + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: 200_000, + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender. + }) + ), + // Set the feeToken to a feeTokenAddress, indicating specific asset will be used for fees + feeToken: address(s_linkToken) + }); + + // Initialize a router client instance to interact with the cross-chain router. + IRouterClient router = IRouterClient(this.getRouter()); + + // Calculate the fee required to send the CCIP acknowledgment message. + uint256 fees = router.getFee( + _messageTrackerChainSelector, // The chain selector for routing the message. + acknowledgment // The acknowledgment message data. + ); + + // Ensure the contract has sufficient balance to cover the message sending fees. + if (fees > s_linkToken.balanceOf(address(this))) { + revert NotEnoughBalance(s_linkToken.balanceOf(address(this)), fees); + } + + // Approve the router to transfer LINK tokens on behalf of this contract to cover the sending fees. + s_linkToken.approve(address(router), fees); + + // Send the acknowledgment message via the CCIP router and capture the resulting message ID. + bytes32 messageId = router.ccipSend( + _messageTrackerChainSelector, // The destination chain selector. + acknowledgment // The CCIP message payload for acknowledgment. + ); + + // Emit an event detailing the acknowledgment message sending, for external tracking and verification. + emit AcknowledgmentSent( + messageId, // The ID of the sent acknowledgment message. + _messageTrackerChainSelector, // The destination chain selector. + _messageTrackerAddress, // The receiver of the acknowledgment, typically the original sender. + _messageIdToAcknowledge, // The original message ID that was acknowledged. + address(s_linkToken), // The fee token used. + fees // The fees paid for sending the message. + ); + } + + /// @dev Handles a received CCIP message, processes it, and acknowledges its receipt. + /// This internal function is called upon the receipt of a new message via CCIP from an allowlisted source chain and + /// sender. + /// It decodes the message and acknowledges its receipt by calling `_acknowledgePayLINK`. + /// @param any2EvmMessage The CCIP message received + function _ccipReceive( + Client.Any2EVMMessage memory any2EvmMessage + ) + internal + override + onlyAllowlisted(any2EvmMessage.sourceChainSelector, abi.decode(any2EvmMessage.sender, (address))) // Make sure + // source chain and sender are allowlisted + + { + bytes32 messageIdToAcknowledge = any2EvmMessage.messageId; // The message ID of the received message to acknowledge + address messageTrackerAddress = abi.decode(any2EvmMessage.sender, (address)); // ABI-decoding of the message tracker + // address + uint64 messageTrackerChainSelector = any2EvmMessage.sourceChainSelector; // The chain selector of the received + // message + s_lastReceivedText = abi.decode(any2EvmMessage.data, (string)); // abi-decoding of the sent text + + _acknowledgePayLINK(messageIdToAcknowledge, messageTrackerAddress, messageTrackerChainSelector); + } + + /// @notice Fetches the details of the last received message. + /// @return text The last received text. + function getLastReceivedMessage() external view returns (string memory text) { + return (s_lastReceivedText); + } + + /// @notice Allows the owner of the contract to withdraw all tokens of a specific ERC20 token. + /// @dev This function reverts with a 'NothingToWithdraw' error if there are no tokens to withdraw. + /// @param _beneficiary The address to which the tokens will be sent. + /// @param _token The contract address of the ERC20 token to be withdrawn. + function withdrawToken( + address _beneficiary, + address _token + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = IERC20(_token).balanceOf(address(this)); + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + IERC20(_token).safeTransfer(_beneficiary, amount); + } +} +``` + ## Final note In this example, the *message tracker* contract emits an event when it receives the acknowledgment message confirming the initial message reception and processing on the counterpart chain. However, you could think of any other logic to execute when the *message tracker* receives the acknowledgment. This tutorial demonstrates the pattern for sending arbitrary data, but you can apply the same pattern to programmable token transfers. @@ -11498,6 +15122,308 @@ In this tutorial, you'll send a text *string* and CCIP-BnM tokens between smart 2. Manually retry the execution. 3. Observe successful execution after the gas limit adjustment. +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.sol"; +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 {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/// @title - A simple messenger contract for transferring/receiving tokens and data across chains. +contract ProgrammableTokenTransfersLowGasLimit is CCIPReceiver, OwnerIsCreator { + using SafeERC20 for IERC20; + + // Custom errors to provide more descriptive revert messages. + error NotEnoughBalance(uint256 currentBalance, uint256 requiredBalance); // Used to make sure contract has enough + // token balance + error NothingToWithdraw(); // Used when trying to withdraw Ether but there's nothing to withdraw. + error DestinationChainNotAllowed(uint64 destinationChainSelector); // Used when the destination chain has not been + // allowlisted by the contract owner. + error SourceChainNotAllowed(uint64 sourceChainSelector); // Used when the source chain has not been allowlisted by the + // contract owner. + error SenderNotAllowed(address sender); // Used when the sender has not been allowlisted by the contract owner. + + // Event emitted when a message is sent to another chain. + // The chain selector of the destination chain. + // The address of the receiver on the destination chain. + // The text being sent. + // The token address that was transferred. + // The token amount that was transferred. + // the token address used to pay CCIP fees. + // The fees paid for sending the message. + event MessageSent( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address receiver, + string text, + address token, + uint256 tokenAmount, + address feeToken, + uint256 fees + ); + + // Event emitted when a message is received from another chain. + // The chain selector of the source chain. + // The address of the sender from the source chain. + // The text that was received. + // The token address that was transferred. + // The token amount that was transferred. + event MessageReceived( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address sender, + string text, + address token, + uint256 tokenAmount + ); + + bytes32 private s_lastReceivedMessageId; // Store the last received messageId. + address private s_lastReceivedTokenAddress; // Store the last received token address. + uint256 private s_lastReceivedTokenAmount; // Store the last received amount. + string private s_lastReceivedText; // Store the last received text. + + // Mapping to keep track of allowlisted destination chains. + mapping(uint64 => bool) public allowlistedDestinationChains; + + // Mapping to keep track of allowlisted source chains. + mapping(uint64 => bool) public allowlistedSourceChains; + + // Mapping to keep track of allowlisted senders. + mapping(address => bool) public allowlistedSenders; + + IERC20 private s_linkToken; + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + constructor( + address _router, + address _link + ) CCIPReceiver(_router) { + s_linkToken = IERC20(_link); + } + + /// @dev Modifier that checks if the chain with the given destinationChainSelector is allowlisted. + /// @param _destinationChainSelector The selector of the destination chain. + modifier onlyAllowlistedDestinationChain( + uint64 _destinationChainSelector + ) { + if (!allowlistedDestinationChains[_destinationChainSelector]) { + revert DestinationChainNotAllowed(_destinationChainSelector); + } + _; + } + + /// @dev Modifier that checks if the chain with the given sourceChainSelector is allowlisted and if the sender is + /// allowlisted. + /// @param _sourceChainSelector The selector of the destination chain. + /// @param _sender The address of the sender. + modifier onlyAllowlisted( + uint64 _sourceChainSelector, + address _sender + ) { + if (!allowlistedSourceChains[_sourceChainSelector]) { + revert SourceChainNotAllowed(_sourceChainSelector); + } + if (!allowlistedSenders[_sender]) revert SenderNotAllowed(_sender); + _; + } + + /// @dev Updates the allowlist status of a destination chain for transactions. + /// @notice This function can only be called by the owner. + /// @param _destinationChainSelector The selector of the destination chain to be updated. + /// @param allowed The allowlist status to be set for the destination chain. + function allowlistDestinationChain( + uint64 _destinationChainSelector, + bool allowed + ) external onlyOwner { + allowlistedDestinationChains[_destinationChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a source chain + /// @notice This function can only be called by the owner. + /// @param _sourceChainSelector The selector of the source chain to be updated. + /// @param allowed The allowlist status to be set for the source chain. + function allowlistSourceChain( + uint64 _sourceChainSelector, + bool allowed + ) external onlyOwner { + allowlistedSourceChains[_sourceChainSelector] = allowed; + } + + /// @dev Updates the allowlist status of a sender for transactions. + /// @notice This function can only be called by the owner. + /// @param _sender The address of the sender to be updated. + /// @param allowed The allowlist status to be set for the sender. + function allowlistSender( + address _sender, + bool allowed + ) external onlyOwner { + allowlistedSenders[_sender] = allowed; + } + + /// @notice Sends data and transfer tokens to receiver on the destination chain. + /// @notice Pay for fees in LINK. + /// @notice the gasLimit is set to 20_000 on purpose to force the execution to fail on the destination chain + /// @dev Assumes your contract has sufficient LINK to pay for CCIP fees. + /// @param _destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param _receiver The address of the recipient on the destination blockchain. + /// @param _text The string data to be sent. + /// @param _token token address. + /// @param _amount token amount. + /// @return messageId The ID of the CCIP message that was sent. + function sendMessagePayLINK( + uint64 _destinationChainSelector, + address _receiver, + string calldata _text, + address _token, + uint256 _amount + ) external onlyOwner onlyAllowlistedDestinationChain(_destinationChainSelector) returns (bytes32 messageId) { + // Set the token amounts + Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); + tokenAmounts[0] = Client.EVMTokenAmount({token: _token, amount: _amount}); + + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + // address(linkToken) means fees are paid in LINK + + Client.EVM2AnyMessage memory evm2AnyMessage = Client.EVM2AnyMessage({ + receiver: abi.encode(_receiver), // ABI-encoded receiver address + data: abi.encode(_text), // ABI-encoded string + tokenAmounts: tokenAmounts, // The amount and type of token being transferred + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: 20_000, // Gas limit for the callback on the destination chain + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender + }) + ), + // Set the feeToken to a LINK token address + feeToken: address(s_linkToken) + }); + + // Initialize a router client instance to interact with cross-chain router + IRouterClient router = IRouterClient(this.getRouter()); + + // Get the fee required to send the CCIP message + uint256 fees = router.getFee(_destinationChainSelector, evm2AnyMessage); + + uint256 requiredLinkBalance; + if (_token == address(s_linkToken)) { + // Required LINK Balance is the sum of fees and amount to transfer, if the token to transfer is LINK + requiredLinkBalance = fees + _amount; + } else { + requiredLinkBalance = fees; + } + + uint256 linkBalance = s_linkToken.balanceOf(address(this)); + + if (requiredLinkBalance > linkBalance) { + revert NotEnoughBalance(linkBalance, requiredLinkBalance); + } + + // approve the Router to transfer LINK tokens on contract's behalf. It will spend the requiredLinkBalance + s_linkToken.approve(address(router), requiredLinkBalance); + + // If sending a token other than LINK, approve it separately + if (_token != address(s_linkToken)) { + uint256 tokenBalance = IERC20(_token).balanceOf(address(this)); + if (_amount > tokenBalance) { + revert NotEnoughBalance(tokenBalance, _amount); + } + // approve the Router to spend tokens on contract's behalf. It will spend the amount of the given token + IERC20(_token).approve(address(router), _amount); + } + + // Send the message through the router and store the returned message ID + messageId = router.ccipSend(_destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit MessageSent( + messageId, _destinationChainSelector, _receiver, _text, _token, _amount, address(s_linkToken), fees + ); + + // Return the message ID + return messageId; + } + + /** + * @notice Returns the details of the last CCIP received message. + * @dev This function retrieves the ID, text, token address, and token amount of the last received CCIP message. + * @return messageId The ID of the last received CCIP message. + * @return text The text of the last received CCIP message. + * @return tokenAddress The address of the token in the last CCIP received message. + * @return tokenAmount The amount of the token in the last CCIP received message. + */ + function getLastReceivedMessageDetails() + public + view + returns (bytes32 messageId, string memory text, address tokenAddress, uint256 tokenAmount) + { + return (s_lastReceivedMessageId, s_lastReceivedText, s_lastReceivedTokenAddress, s_lastReceivedTokenAmount); + } + + /// handle a received message + function _ccipReceive( + Client.Any2EVMMessage memory any2EvmMessage + ) + internal + override + onlyAllowlisted(any2EvmMessage.sourceChainSelector, abi.decode(any2EvmMessage.sender, (address))) // Make sure + // source chain and sender are allowlisted + + { + s_lastReceivedMessageId = any2EvmMessage.messageId; // fetch the messageId + s_lastReceivedText = abi.decode(any2EvmMessage.data, (string)); // abi-decoding of the sent text + // Expect one token to be transferred at once, but you can transfer several tokens. + s_lastReceivedTokenAddress = any2EvmMessage.destTokenAmounts[0].token; + s_lastReceivedTokenAmount = any2EvmMessage.destTokenAmounts[0].amount; + + emit MessageReceived( + any2EvmMessage.messageId, + any2EvmMessage.sourceChainSelector, // fetch the source chain identifier (aka selector) + abi.decode(any2EvmMessage.sender, (address)), // abi-decoding of the sender address, + abi.decode(any2EvmMessage.data, (string)), + any2EvmMessage.destTokenAmounts[0].token, + any2EvmMessage.destTokenAmounts[0].amount + ); + } + + /// @notice Allows the owner of the contract to withdraw all tokens of a specific ERC20 token. + /// @dev This function reverts with a 'NothingToWithdraw' error if there are no tokens to withdraw. + /// @param _beneficiary The address to which the tokens will be sent. + /// @param _token The contract address of the ERC20 token to be withdrawn. + function withdrawToken( + address _beneficiary, + address _token + ) public onlyOwner { + // Retrieve the balance of this contract + uint256 amount = IERC20(_token).balanceOf(address(this)); + + // Revert if there is nothing to withdraw + if (amount == 0) revert NothingToWithdraw(); + + IERC20(_token).safeTransfer(_beneficiary, amount); + } +} +``` + ### Deploy your contracts To use this contract: diff --git a/src/content/chainlink-automation/llms-full.txt b/src/content/chainlink-automation/llms-full.txt index f8ffaba7e90..46d84dc8533 100644 --- a/src/content/chainlink-automation/llms-full.txt +++ b/src/content/chainlink-automation/llms-full.txt @@ -131,6 +131,74 @@ Custom logic Automation compatible contracts must meet the following requirement Use these elements to create a compatible contract that will automatically increment a counter after every `updateInterval` seconds. After you register the contract as an upkeep, the Chainlink Automation Network frequently simulates your `checkUpkeep` offchain to determine if the `updateInterval` time has passed since the last increment (timestamp). When `checkUpkeep` returns true, the Chainlink Automation Network calls `performUpkeep` onchain and increments the counter. This cycle repeats until the upkeep is cancelled or runs out of funding. +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +// AutomationCompatible.sol imports the functions from both ./AutomationBase.sol and +// ./interfaces/AutomationCompatibleInterface.sol +import {AutomationCompatibleInterface} from "@chainlink/contracts/src/v0.8/automation/AutomationCompatible.sol"; + +/** + * @dev Example contract, use the Forwarder as needed for additional security. + * + * @notice important to implement {AutomationCompatibleInterface} + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract Counter is AutomationCompatibleInterface { + /** + * Public counter variable + */ + uint256 public counter; + + /** + * Use an interval in seconds and a timestamp to slow execution of Upkeep + */ + uint256 public immutable interval; + uint256 public lastTimeStamp; + + constructor( + uint256 updateInterval + ) { + interval = updateInterval; + lastTimeStamp = block.timestamp; + + counter = 0; + } + + function checkUpkeep( + bytes calldata /* checkData */ + ) + external + view + override + returns ( + bool upkeepNeeded, + bytes memory /* performData */ + ) + { + upkeepNeeded = (block.timestamp - lastTimeStamp) > interval; + // We don't use the checkData in this example. The checkData is defined when the Upkeep was registered. + } + + function performUpkeep( + bytes calldata /* performData */ + ) external override { + if ((block.timestamp - lastTimeStamp) > interval) { + lastTimeStamp = block.timestamp; + counter = counter + 1; + } + // We don't use the performData in this example. The performData is generated by the Automation Node's call to your + // checkUpkeep function + } +} +``` + Compile and deploy your own Automation Counter onto a [supported Testnet](/chainlink-automation/overview/supported-networks). 1. In the Remix example, select the compile tab on the left and press the compile button. Make sure that your contract compiles without any errors. Note that the Warning messages in this example are acceptable and will not block the deployment. @@ -185,6 +253,92 @@ The contract has the following components: - The `checkUpkeep()` function checks if the contract requires work to be done. If one array element has a balance of less than `LIMIT`, the function returns `upkeepNeeded == true`. - The `performUpkeep()` function to re-balances the elements. To demonstrate how this computation can cause high gas fees, this example does all of the computation within the transaction. The function finds all of the elements that are less than `LIMIT`, decreases the contract `liquidity`, and increases every found element to equal `LIMIT`. +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import { + AutomationCompatibleInterface +} from "@chainlink/contracts/src/v0.8/automation/interfaces/AutomationCompatibleInterface.sol"; + +/** + * @dev Example contract which perform all the computation in `performUpkeep` + * @notice important to implement {AutomationCompatibleInterface} + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract BalancerOnChain is AutomationCompatibleInterface { + uint256 public constant SIZE = 1000; + uint256 public constant LIMIT = 1000; + uint256[SIZE] public balances; + uint256 public liquidity = 1_000_000; + + constructor() { + // On the initialization of the contract, all the elements have a balance equal to the limit + for (uint256 i = 0; i < SIZE; i++) { + balances[i] = LIMIT; + } + } + + /// @dev called to increase the liquidity of the contract + function addLiquidity( + uint256 liq + ) public { + liquidity += liq; + } + + /// @dev withdraw an `amount`from multiple elements of `balances` array. The elements are provided in `indexes` + function withdraw( + uint256 amount, + uint256[] memory indexes + ) public { + for (uint256 i = 0; i < indexes.length; i++) { + require(indexes[i] < SIZE, "Provided index out of bound"); + balances[indexes[i]] -= amount; + } + } + + /// @dev this method is called by the Automation Nodes to check if `performUpkeep` should be performed + function checkUpkeep( + bytes calldata /* checkData */ + ) external view override returns (bool upkeepNeeded, bytes memory performData) { + upkeepNeeded = false; + for (uint256 i = 0; i < SIZE && !upkeepNeeded; i++) { + if (balances[i] < LIMIT) { + // if one element has a balance < LIMIT then rebalancing is needed + upkeepNeeded = true; + } + } + return (upkeepNeeded, ""); + } + + /// @dev this method is called by the Automation Nodes. it increases all elements which balances are lower than the + /// LIMIT + function performUpkeep( + bytes calldata /* performData */ + ) external override { + uint256 increment; + uint256 _balance; + for (uint256 i = 0; i < SIZE; i++) { + _balance = balances[i]; + // best practice: reverify the upkeep is needed + if (_balance < LIMIT) { + // calculate the increment needed + increment = LIMIT - _balance; + // decrease the contract liquidity accordingly + liquidity -= increment; + // rebalance the element + balances[i] = LIMIT; + } + } + } +} +``` + Test this example using the following steps: 1. Deploy the contract using Remix on the [supported testnet](/chainlink-automation/overview/supported-networks) of your choice. @@ -219,6 +373,129 @@ Modify the contract and move the computation to the `checkUpkeep()` function. Th - The `checkUpkeep()` function receives [`checkData`](/chainlink-automation/reference/automation-interfaces/#checkdata), which passes arbitrary bytes to the function. Pass a `lowerBound` and an `upperBound` to scope the work to a sub-array of `balances`. This creates several upkeeps with different values of `checkData`. The function loops over the sub-array and looks for the indexes of the elements that require re-balancing and calculates the required `increments`. Then, it returns `upkeepNeeded == true` and `performData`, which is calculated by encoding `indexes` and `increments`. Note that `checkUpkeep()` is a view function, so computation does not consume any gas. - The `performUpkeep()` function takes [performData](/chainlink-automation/reference/automation-interfaces/#performdata) as a parameter and decodes it to fetch the `indexes` and the `increments`. +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import { + AutomationCompatibleInterface +} from "@chainlink/contracts/src/v0.8/automation/interfaces/AutomationCompatibleInterface.sol"; + +/** + * @dev Example contract which perform most of the computation in `checkUpkeep` + * + * @notice important to implement {AutomationCompatibleInterface} + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract BalancerOffChain is AutomationCompatibleInterface { + uint256 public constant SIZE = 1000; + uint256 public constant LIMIT = 1000; + uint256[SIZE] public balances; + uint256 public liquidity = 1_000_000; + + constructor() { + // On the initialization of the contract, all the elements have a balance equal to the limit + for (uint256 i = 0; i < SIZE; i++) { + balances[i] = LIMIT; + } + } + + /// @dev called to increase the liquidity of the contract + function addLiquidity( + uint256 liq + ) public { + liquidity += liq; + } + + /// @dev withdraw an `amount`from multiple elements of the `balances` array. The elements are provided in `indexes` + function withdraw( + uint256 amount, + uint256[] memory indexes + ) public { + for (uint256 i = 0; i < indexes.length; i++) { + require(indexes[i] < SIZE, "Provided index out of bound"); + balances[indexes[i]] -= amount; + } + } + + /* @dev this method is called by the Chainlink Automation Nodes to check if `performUpkeep` must be done. Note that + `checkData` is used to segment the computation to subarrays. + * + * @dev `checkData` is an encoded binary data and which contains the lower bound and upper bound on which to perform + the computation + * + * @dev return `upkeepNeeded`if rebalancing must be done and `performData` which contains an array of indexes that + require rebalancing and their increments. This will be used in `performUpkeep` + */ + function checkUpkeep( + bytes calldata checkData + ) external view override returns (bool upkeepNeeded, bytes memory performData) { + // perform the computation to a subarray of `balances`. This opens the possibility of having several checkUpkeeps + // done at the same time + (uint256 lowerBound, uint256 upperBound) = abi.decode(checkData, (uint256, uint256)); + require(upperBound < SIZE && lowerBound < upperBound, "Lowerbound and Upperbound not correct"); + // first get number of elements requiring updates + uint256 counter; + for (uint256 i = 0; i < upperBound - lowerBound + 1; i++) { + if (balances[lowerBound + i] < LIMIT) { + counter++; + } + } + // initialize array of elements requiring increments as long as the increments + uint256[] memory indexes = new uint256[](counter); + uint256[] memory increments = new uint256[](counter); + + upkeepNeeded = false; + uint256 indexCounter; + + for (uint256 i = 0; i < upperBound - lowerBound + 1; i++) { + if (balances[lowerBound + i] < LIMIT) { + // if one element has a balance < LIMIT then rebalancing is needed + upkeepNeeded = true; + // store the index which needs increment as long as the increment + indexes[indexCounter] = lowerBound + i; + increments[indexCounter] = LIMIT - balances[lowerBound + i]; + indexCounter++; + } + } + performData = abi.encode(indexes, increments); + return (upkeepNeeded, performData); + } + + /* @dev this method is called by the Automation Nodes. it increases all elements whose balances are lower than the + LIMIT. Note that the elements are bounded by `lowerBound`and `upperBound` + * (provided by `performData` + * + * @dev `performData` is an encoded binary data which contains the lower bound and upper bound of the subarray on + which to perform the computation. + * it also contains the increments + * + * @dev return `upkeepNeeded`if rebalancing must be done and `performData` which contains an array of increments. This + will be used in `performUpkeep` + */ + function performUpkeep( + bytes calldata performData + ) external override { + (uint256[] memory indexes, uint256[] memory increments) = abi.decode(performData, (uint256[], uint256[])); + + uint256 _balance; + uint256 _liquidity = liquidity; + + for (uint256 i = 0; i < indexes.length; i++) { + _balance = balances[indexes[i]] + increments[i]; + _liquidity -= increments[i]; + balances[indexes[i]] = _balance; + } + liquidity = _liquidity; + } +} +``` + Run this example to compare the gas fees: 1. Deploy the contract using Remix on the [supported testnet](/chainlink-automation/overview/supported-networks) of your choice. @@ -294,6 +571,64 @@ After you register an upkeep, its forwarder address is available in the Chainlin The code sample below uses the Forwarder: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @dev Example contract which uses the Forwarder + * + * @notice important to implement {AutomationCompatibleInterface} + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +import { + AutomationCompatibleInterface +} from "@chainlink/contracts/src/v0.8/automation/interfaces/AutomationCompatibleInterface.sol"; +import {OwnerIsCreator} from "@chainlink/contracts/src/v0.8/shared/access/OwnerIsCreator.sol"; + +contract CounterwForwarder is AutomationCompatibleInterface, OwnerIsCreator { + uint256 public counter; // counter counts the number of upkeeps performed + uint256 public interval; // interval specifies the time between upkeeps + uint256 public lastTimeStamp; // lastTimeStamp tracks the last upkeep performed + address public s_forwarderAddress; + + constructor( + uint256 updateInterval + ) { + interval = updateInterval; + } + + function checkUpkeep( + bytes calldata /*checkData*/ + ) external override returns (bool, bytes memory) { + bool needsUpkeep = (block.timestamp - lastTimeStamp) > interval; + return (needsUpkeep, bytes("")); + } + + function performUpkeep( + bytes calldata /*performData*/ + ) external override { + require(msg.sender == s_forwarderAddress, "This address does not have permission to call performUpkeep"); + lastTimeStamp = block.timestamp; + counter = counter + 1; + } + + /// @notice Set the address that `performUpkeep` is called from + /// @dev Only callable by the owner + /// @param forwarderAddress the address to set + function setForwarderAddress( + address forwarderAddress + ) external onlyOwner { + s_forwarderAddress = forwarderAddress; + } +} +``` + --- # Set a gas price threshold on your upkeep @@ -511,14 +846,27 @@ Chainlink Automation processes a limited number of logs per block per upkeep. Se {" "} +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +contract CountEmitLog { + event WantsToCount(address indexed msgSender); + + constructor() {} + + function emitCountLog() public { + emit WantsToCount(msg.sender); + } +} +``` + 1. Under *Environment*, select the option **Injected Provider** to connect to your cryptocurrency wallet. 2. Deploy the contract and confirm the transaction. 3. You can view the contract on Etherscan by clicking the message in the terminal. You an view the address of the created contract and the original contract in Etherscan. - <ClickToZoom src="/images/automation/log-trig-addresses.png" /> 4. Navigate to the *Contract* tab. If the contract is already verified, you will see options to **Read Contract** and **Write Contract**. If your contract isn't verified, follow the prompts in Etherscan to verify the contract. 5. Click **Write Contract** and click the **emitCountLog** button to emit a log. 6. Navigate back to Etherscan and locate the *Events* tab. You should see the event of emitting a log recorded in this section. - <ClickToZoom src="/images/automation/log-trig-event.png" /> ## Using `ILogAutomation` Interface @@ -526,9 +874,66 @@ Chainlink Automation processes a limited number of logs per block per upkeep. Se {" "} +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +struct Log { + uint256 index; // Index of the log in the block + uint256 timestamp; // Timestamp of the block containing the log + bytes32 txHash; // Hash of the transaction containing the log + uint256 blockNumber; // Number of the block containing the log + bytes32 blockHash; // Hash of the block containing the log + address source; // Address of the contract that emitted the log + bytes32[] topics; // Indexed topics of the log + bytes data; // Data of the log +} + +interface ILogAutomation { + function checkLog( + Log calldata log, + bytes memory checkData + ) external returns (bool upkeepNeeded, bytes memory performData); + + function performUpkeep( + bytes calldata performData + ) external; +} + +contract CountWithLog is ILogAutomation { + event CountedBy(address indexed msgSender); + + uint256 public counted = 0; + + constructor() {} + + function checkLog( + Log calldata log, + bytes memory + ) external pure returns (bool upkeepNeeded, bytes memory performData) { + upkeepNeeded = true; + address logSender = bytes32ToAddress(log.topics[1]); + performData = abi.encode(logSender); + } + + function performUpkeep( + bytes calldata performData + ) external override { + counted += 1; + address logSender = abi.decode(performData, (address)); + emit CountedBy(logSender); + } + + function bytes32ToAddress( + bytes32 _address + ) public pure returns (address) { + return address(uint160(uint256(_address))); + } +} +``` + 1. Deploy the contract and confirm your transaction. 2. Under *Deployed Contracts*, expand `CountWithLog`. Click the **count** button to view the value of the count variable. It should be 0. - <ClickToZoom src="/images/automation/log-trig-count-0.png" /> 3. Copy the address of this contract either via Remix or Etherscan to register it on the Chainlink Automation app. ## Using the Chainlink Automation App @@ -846,6 +1251,76 @@ For upkeeps with triggers using onchain state only, the following parameters are #### Code sample +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +struct RegistrationParams { + string name; + bytes encryptedEmail; + address upkeepContract; + uint32 gasLimit; + address adminAddress; + uint8 triggerType; + bytes checkData; + bytes triggerConfig; + bytes offchainConfig; + uint96 amount; +} + +/** + * string name = "test upkeep"; + * bytes encryptedEmail = 0x; + * address upkeepContract = 0x...; + * uint32 gasLimit = 500000; + * address adminAddress = 0x....; + * uint8 triggerType = 0; + * bytes checkData = 0x; + * bytes triggerConfig = 0x; + * bytes offchainConfig = 0x; + * uint96 amount = 1000000000000000000; + */ +interface AutomationRegistrarInterface { + function registerUpkeep( + RegistrationParams calldata requestParams + ) external returns (uint256); +} + +contract UpkeepIDConditionalExample { + LinkTokenInterface public immutable i_link; + AutomationRegistrarInterface public immutable i_registrar; + + constructor( + LinkTokenInterface link, + AutomationRegistrarInterface registrar + ) { + i_link = link; + i_registrar = registrar; + } + + function registerAndPredictID( + RegistrationParams memory params + ) public { + // LINK must be approved for transfer - this can be done every time or once + // with an infinite approval + i_link.approve(address(i_registrar), params.amount); + uint256 upkeepID = i_registrar.registerUpkeep(params); + if (upkeepID != 0) { + // DEV - Use the upkeepID however you see fit + } else { + revert("auto-approve disabled"); + } + } +} +``` + ### Log trigger upkeeps #### Parameters @@ -878,6 +1353,96 @@ where filterSelector is a bitmask mapping and value is set depending on the sele #### Code sample +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +struct RegistrationParams { + string name; + bytes encryptedEmail; + address upkeepContract; + uint32 gasLimit; + address adminAddress; + uint8 triggerType; + bytes checkData; + bytes triggerConfig; + bytes offchainConfig; + uint96 amount; +} + +struct LogTriggerConfig { + address contractAddress; + uint8 filterSelector; + bytes32 topic0; + bytes32 topic1; + bytes32 topic2; + bytes32 topic3; +} + +/** + * Log trigger details + * address contractAddress = 0x...; // e.g. 0x2938ff7cAB3115f768397602EA1A1a0Aa20Ac42f + * uint8 filterSelector = 1; // see filterSelector + * bytes32 topic0 = 0x...; // e.g. 0x74500d2e71ee75a8a83dcc87f7316a89404a0d0ac0c725e80c956dbf16fb8133 for event called + * bump + * bytes32 topic1 = 0x...; // e.g. bytes32 of address 0x000000000000000000000000c26d7ef337e01a5cc5498d3cc2ff0610761ae637 + * bytes32 topic2 = 0x; // empty so 0x + * bytes32 topic3 = 0x; // empty so 0x + * + * Upkeep details + * string name = "test upkeep"; + * bytes encryptedEmail = 0x; + * address upkeepContract = 0x...; + * uint32 gasLimit = 500000; + * address adminAddress = 0x....; + * uint8 triggerType = 1; + * bytes checkData = 0x; + * bytes triggerConfig = abi.encode(address contractAddress, uint8 filterSelector,bytes32 topic0,bytes32 topic1,bytes32 + * topic2, bytes32 topic3); + * bytes offchainConfig = 0x; + * uint96 amount = 1000000000000000000; + */ +interface AutomationRegistrarInterface { + function registerUpkeep( + RegistrationParams calldata requestParams + ) external returns (uint256); +} + +contract UpkeepIDlogTriggerExample { + LinkTokenInterface public immutable i_link; + AutomationRegistrarInterface public immutable i_registrar; + + constructor( + LinkTokenInterface link, + AutomationRegistrarInterface registrar + ) { + i_link = link; + i_registrar = registrar; + } + + function registerAndPredictID( + RegistrationParams memory params + ) public { + // LINK must be approved for transfer - this can be done every time or once + // with an infinite approval + i_link.approve(address(i_registrar), params.amount); + uint256 upkeepID = i_registrar.registerUpkeep(params); + if (upkeepID != 0) { + // DEV - Use the upkeepID however you see fit + } else { + revert("auto-approve disabled"); + } + } +} +``` + --- # Register a Custom Logic Upkeep @@ -1586,6 +2151,15 @@ Below are the parameters and return values of the `checkUpkeep` function. Click You can pass information into your `checkUpkeep` function from your [upkeep registration](/chainlink-automation/guides/register-upkeep) to execute different code paths. For example, to check the balance on a specific address, set the `checkData` to abi encode the address. To learn how to create flexible upkeeps with checkData, please see our [flexible upkeeps](/chainlink-automation/guides/flexible-upkeeps) page. +```sol +function checkUpkeep( + bytes calldata checkData +) public view returns (bool, bytes memory) { + address wallet = abi.decode(checkData, (address)); + return (wallet.balance < 1 ether, bytes("")); +} +``` + Tips on using `checkData`: - **Managing unbounded upkeeps**: Limit the problem set of your onchain execution by creating a range bound for your upkeep to check and perform. This allows you to keep within predefined gas limits, which creates a predictable upper bound gas cost on your transactions. Break apart your problem into multiple upkeep registrations to limit the scope of work. diff --git a/src/content/chainlink-functions/llms-full.txt b/src/content/chainlink-functions/llms-full.txt index ec1663a0444..771ba03a57b 100644 --- a/src/content/chainlink-functions/llms-full.txt +++ b/src/content/chainlink-functions/llms-full.txt @@ -415,6 +415,18 @@ Before making a Chainlink Functions request from your smart contract, it is alwa 2. Copy and paste the following source code into the playground's code block. + ```javascript + const characterId = args[0]; + const apiResponse = await Functions.makeHttpRequest({ + url: `https://swapi.info/api/people/${characterId}/`, + }); + if (apiResponse.error) { + throw Error("Request failed"); + } + const { data } = apiResponse; + return Functions.encodeString(data.name); + ``` + 3. Under *Argument*, set the first argument to 1. You are going to fetch the name of the first Star Wars character. 4. Click on *Run code*. Under *Output*, you should see *Luke Skywalker*. @@ -436,6 +448,112 @@ You will test on Sepolia, so you must have an Ethereum web3 wallet with enough t 1. Open the [GettingStartedFunctionsConsumer.sol](https://remix.ethereum.org/#url=https://docs.chain.link/samples/ChainlinkFunctions/GettingStartedFunctionsConsumer.sol) contract in Remix. + ```sol + // SPDX-License-Identifier: MIT + pragma solidity ^0.8.20; + + import {FunctionsClient} from "@chainlink/contracts/src/v0.8/functions/v1_0_0/FunctionsClient.sol"; + + import {FunctionsRequest} from "@chainlink/contracts/src/v0.8/functions/v1_0_0/libraries/FunctionsRequest.sol"; + import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + + /** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/resources/link-token-contracts/ + */ + + /** + * @title GettingStartedFunctionsConsumer + * @notice This is an example contract to show how to make HTTP requests using Chainlink + * @dev This contract uses hardcoded values and should not be used in production. + */ + contract GettingStartedFunctionsConsumer is FunctionsClient, ConfirmedOwner { + using FunctionsRequest for FunctionsRequest.Request; + + // State variables to store the last request ID, response, and error + bytes32 public s_lastRequestId; + bytes public s_lastResponse; + bytes public s_lastError; + + // Custom error type + error UnexpectedRequestID(bytes32 requestId); + + // Event to log responses + event Response(bytes32 indexed requestId, string character, bytes response, bytes err); + + // Router address - Hardcoded for Sepolia + // Check to get the router address for your supported network + // https://docs.chain.link/chainlink-functions/supported-networks + address router = 0xb83E47C2bC239B3bf370bc41e1459A34b41238D0; + + // JavaScript source code + // Fetch character name from the Star Wars API. + // Documentation: https://swapi.info/people + string source = "const characterId = args[0];" "const apiResponse = await Functions.makeHttpRequest({" + "url: `https://swapi.info/api/people/${characterId}/`" "});" "if (apiResponse.error) {" + "throw Error('Request failed');" "}" "const { data } = apiResponse;" "return Functions.encodeString(data.name);"; + + //Callback gas limit + uint32 gasLimit = 300_000; + + // donID - Hardcoded for Sepolia + // Check to get the donID for your supported network https://docs.chain.link/chainlink-functions/supported-networks + bytes32 donID = 0x66756e2d657468657265756d2d7365706f6c69612d3100000000000000000000; + + // State variable to store the returned character information + string public character; + + /** + * @notice Initializes the contract with the Chainlink router address and sets the contract owner + */ + constructor() FunctionsClient(router) ConfirmedOwner(msg.sender) {} + + /** + * @notice Sends an HTTP request for character information + * @param subscriptionId The ID for the Chainlink subscription + * @param args The arguments to pass to the HTTP request + * @return requestId The ID of the request + */ + function sendRequest( + uint64 subscriptionId, + string[] calldata args + ) external onlyOwner returns (bytes32 requestId) { + FunctionsRequest.Request memory req; + req.initializeRequestForInlineJavaScript(source); // Initialize the request with JS code + if (args.length > 0) req.setArgs(args); // Set the arguments for the request + + // Send the request and store the request ID + s_lastRequestId = _sendRequest(req.encodeCBOR(), subscriptionId, gasLimit, donID); + + return s_lastRequestId; + } + + /** + * @notice Callback function for fulfilling a request + * @param requestId The ID of the request to fulfill + * @param response The HTTP response data + * @param err Any errors from the Functions request + */ + function fulfillRequest( + bytes32 requestId, + bytes memory response, + bytes memory err + ) internal override { + if (s_lastRequestId != requestId) { + revert UnexpectedRequestID(requestId); // Check if request IDs match + } + // Update the contract's state variables with the response and any errors + s_lastResponse = response; + character = string(response); + s_lastError = err; + + // Emit an event to log the response + emit Response(requestId, character, s_lastResponse, s_lastError); + } + } + ``` + 2. Compile the contract. 3. Open MetaMask and select the *Sepolia* network. @@ -508,6 +626,112 @@ Chainlink Functions is capable of much more than just retrieving data. Try one o ### Solidity code +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {FunctionsClient} from "@chainlink/contracts/src/v0.8/functions/v1_0_0/FunctionsClient.sol"; + +import {FunctionsRequest} from "@chainlink/contracts/src/v0.8/functions/v1_0_0/libraries/FunctionsRequest.sol"; +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/resources/link-token-contracts/ + */ + +/** + * @title GettingStartedFunctionsConsumer + * @notice This is an example contract to show how to make HTTP requests using Chainlink + * @dev This contract uses hardcoded values and should not be used in production. + */ +contract GettingStartedFunctionsConsumer is FunctionsClient, ConfirmedOwner { + using FunctionsRequest for FunctionsRequest.Request; + + // State variables to store the last request ID, response, and error + bytes32 public s_lastRequestId; + bytes public s_lastResponse; + bytes public s_lastError; + + // Custom error type + error UnexpectedRequestID(bytes32 requestId); + + // Event to log responses + event Response(bytes32 indexed requestId, string character, bytes response, bytes err); + + // Router address - Hardcoded for Sepolia + // Check to get the router address for your supported network + // https://docs.chain.link/chainlink-functions/supported-networks + address router = 0xb83E47C2bC239B3bf370bc41e1459A34b41238D0; + + // JavaScript source code + // Fetch character name from the Star Wars API. + // Documentation: https://swapi.info/people + string source = "const characterId = args[0];" "const apiResponse = await Functions.makeHttpRequest({" + "url: `https://swapi.info/api/people/${characterId}/`" "});" "if (apiResponse.error) {" + "throw Error('Request failed');" "}" "const { data } = apiResponse;" "return Functions.encodeString(data.name);"; + + //Callback gas limit + uint32 gasLimit = 300_000; + + // donID - Hardcoded for Sepolia + // Check to get the donID for your supported network https://docs.chain.link/chainlink-functions/supported-networks + bytes32 donID = 0x66756e2d657468657265756d2d7365706f6c69612d3100000000000000000000; + + // State variable to store the returned character information + string public character; + + /** + * @notice Initializes the contract with the Chainlink router address and sets the contract owner + */ + constructor() FunctionsClient(router) ConfirmedOwner(msg.sender) {} + + /** + * @notice Sends an HTTP request for character information + * @param subscriptionId The ID for the Chainlink subscription + * @param args The arguments to pass to the HTTP request + * @return requestId The ID of the request + */ + function sendRequest( + uint64 subscriptionId, + string[] calldata args + ) external onlyOwner returns (bytes32 requestId) { + FunctionsRequest.Request memory req; + req.initializeRequestForInlineJavaScript(source); // Initialize the request with JS code + if (args.length > 0) req.setArgs(args); // Set the arguments for the request + + // Send the request and store the request ID + s_lastRequestId = _sendRequest(req.encodeCBOR(), subscriptionId, gasLimit, donID); + + return s_lastRequestId; + } + + /** + * @notice Callback function for fulfilling a request + * @param requestId The ID of the request to fulfill + * @param response The HTTP response data + * @param err Any errors from the Functions request + */ + function fulfillRequest( + bytes32 requestId, + bytes memory response, + bytes memory err + ) internal override { + if (s_lastRequestId != requestId) { + revert UnexpectedRequestID(requestId); // Check if request IDs match + } + // Update the contract's state variables with the response and any errors + s_lastResponse = response; + character = string(response); + s_lastError = err; + + // Emit an event to log the response + emit Response(requestId, character, s_lastResponse, s_lastError); + } +} +``` + - To write a Chainlink Functions consumer contract, your contract must import [FunctionsClient.sol](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/functions/v1_0_0/FunctionsClient.sol) and [FunctionsRequest.sol](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/functions/v1_0_0/libraries/FunctionsRequest.sol). You can read the API references: [FunctionsClient](/chainlink-functions/api-reference/functions-client) and [FunctionsRequest](/chainlink-functions/api-reference/functions-request). These contracts are available in an NPM package so that you can import them from within your project. @@ -584,6 +808,18 @@ Chainlink Functions is capable of much more than just retrieving data. Try one o ### JavaScript code +```javascript +const characterId = args[0]; +const apiResponse = await Functions.makeHttpRequest({ + url: `https://swapi.info/api/people/${characterId}/`, +}); +if (apiResponse.error) { + throw Error("Request failed"); +} +const { data } = apiResponse; +return Functions.encodeString(data.name); +``` + This JavaScript source code uses [Functions.makeHttpRequest](/chainlink-functions/api-reference/javascript-source#http-requests) to make HTTP requests. The source code calls the `https://swapi.info/` API to request a Star Wars character name. If you read the [Functions.makeHttpRequest](/chainlink-functions/api-reference/javascript-source#http-requests) documentation and the [Star Wars API documentation](https://swapi.info/people), you notice that URL has the following format where `$characterId` is provided as parameter when making the HTTP request: ``` @@ -1701,6 +1937,147 @@ In this tutorial, you will use a different Chainlink Functions consumer contract 1. [Open the FunctionsConsumerDecoder.sol contract](https://remix.ethereum.org/#url=https://docs.chain.link/samples/ChainlinkFunctions/FunctionsConsumerDecoder.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + pragma solidity ^0.8.20; + + import {FunctionsClient} from "@chainlink/contracts/src/v0.8/functions/v1_0_0/FunctionsClient.sol"; + + import {FunctionsRequest} from "@chainlink/contracts/src/v0.8/functions/v1_0_0/libraries/FunctionsRequest.sol"; + import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + contract FunctionsConsumerDecoder is FunctionsClient, ConfirmedOwner { + using FunctionsRequest for FunctionsRequest.Request; + + bytes32 public s_lastRequestId; + bytes public s_lastResponse; + bytes public s_lastError; + + uint256 public s_answer; + uint256 public s_updatedAt; + uint8 public s_decimals; + string public s_description; + + error UnexpectedRequestID(bytes32 requestId); + + event Response(bytes32 indexed requestId, bytes response, bytes err); + + event DecodedResponse( + bytes32 indexed requestId, uint256 answer, uint256 updatedAt, uint8 decimals, string description + ); + + constructor( + address router + ) FunctionsClient(router) ConfirmedOwner(msg.sender) {} + + /** + * @notice Send a simple request + * @param source JavaScript source code + * @param encryptedSecretsUrls Encrypted URLs where to fetch user secrets + * @param donHostedSecretsSlotID Don hosted secrets slotId + * @param donHostedSecretsVersion Don hosted secrets version + * @param args List of arguments accessible from within the source code + * @param bytesArgs Array of bytes arguments, represented as hex strings + * @param subscriptionId Billing ID + */ + function sendRequest( + string memory source, + bytes memory encryptedSecretsUrls, + uint8 donHostedSecretsSlotID, + uint64 donHostedSecretsVersion, + string[] memory args, + bytes[] memory bytesArgs, + uint64 subscriptionId, + uint32 gasLimit, + bytes32 donID + ) external onlyOwner returns (bytes32 requestId) { + FunctionsRequest.Request memory req; + req.initializeRequestForInlineJavaScript(source); + if (encryptedSecretsUrls.length > 0) { + req.addSecretsReference(encryptedSecretsUrls); + } else if (donHostedSecretsVersion > 0) { + req.addDONHostedSecrets(donHostedSecretsSlotID, donHostedSecretsVersion); + } + if (args.length > 0) req.setArgs(args); + if (bytesArgs.length > 0) req.setBytesArgs(bytesArgs); + s_lastRequestId = _sendRequest(req.encodeCBOR(), subscriptionId, gasLimit, donID); + return s_lastRequestId; + } + + /** + * @notice Send a pre-encoded CBOR request + * @param request CBOR-encoded request data + * @param subscriptionId Billing ID + * @param gasLimit The maximum amount of gas the request can consume + * @param donID ID of the job to be invoked + * @return requestId The ID of the sent request + */ + function sendRequestCBOR( + bytes memory request, + uint64 subscriptionId, + uint32 gasLimit, + bytes32 donID + ) external onlyOwner returns (bytes32 requestId) { + s_lastRequestId = _sendRequest(request, subscriptionId, gasLimit, donID); + return s_lastRequestId; + } + + /** + * @dev Internal function to process the outcome of a data request. It stores the latest response or error and updates + * the contract state accordingly. This function is designed to handle only one of `response` or `err` at a time, not + * both. It decodes the response if present and emits events to log both raw and decoded data. + * + * @param requestId The unique identifier of the request, originally returned by `sendRequest`. Used to match + * responses with requests. + * @param response The raw aggregated response data from the external source. This data is ABI-encoded and is expected + * to contain specific information (e.g., answer, updatedAt) if no error occurred. The function attempts to decode + * this data if `response` is not empty. + * @param err The raw aggregated error information, indicating an issue either from the user's code or within the + * execution of the user Chainlink Function. + * + * Emits a `DecodedResponse` event if the `response` is successfully decoded, providing detailed information about the + * data received. + * Emits a `Response` event for every call to log the raw response and error data. + * + * Requirements: + * - The `requestId` must match the last stored request ID to ensure the response corresponds to the latest request + * sent. + * - Only one of `response` or `err` should contain data for a given call; the other should be empty. + */ + function fulfillRequest( + bytes32 requestId, + bytes memory response, + bytes memory err + ) internal override { + if (s_lastRequestId != requestId) { + revert UnexpectedRequestID(requestId); + } + + s_lastError = err; + s_lastResponse = response; + + if (response.length > 0) { + (uint256 answer, uint256 updatedAt, uint8 decimals, string memory description) = + abi.decode(response, (uint256, uint256, uint8, string)); + + s_answer = answer; + s_updatedAt = updatedAt; + s_decimals = decimals; + s_description = description; + + emit DecodedResponse(requestId, answer, updatedAt, decimals, description); + } + + emit Response(requestId, response, err); + } + } + ``` + 2. Compile the contract. 3. Open MetaMask and select the *Ethereum Sepolia* network. @@ -1797,6 +2174,147 @@ To run the example: ### FunctionsConsumerDecoder.sol +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {FunctionsClient} from "@chainlink/contracts/src/v0.8/functions/v1_0_0/FunctionsClient.sol"; + +import {FunctionsRequest} from "@chainlink/contracts/src/v0.8/functions/v1_0_0/libraries/FunctionsRequest.sol"; +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract FunctionsConsumerDecoder is FunctionsClient, ConfirmedOwner { + using FunctionsRequest for FunctionsRequest.Request; + + bytes32 public s_lastRequestId; + bytes public s_lastResponse; + bytes public s_lastError; + + uint256 public s_answer; + uint256 public s_updatedAt; + uint8 public s_decimals; + string public s_description; + + error UnexpectedRequestID(bytes32 requestId); + + event Response(bytes32 indexed requestId, bytes response, bytes err); + + event DecodedResponse( + bytes32 indexed requestId, uint256 answer, uint256 updatedAt, uint8 decimals, string description + ); + + constructor( + address router + ) FunctionsClient(router) ConfirmedOwner(msg.sender) {} + + /** + * @notice Send a simple request + * @param source JavaScript source code + * @param encryptedSecretsUrls Encrypted URLs where to fetch user secrets + * @param donHostedSecretsSlotID Don hosted secrets slotId + * @param donHostedSecretsVersion Don hosted secrets version + * @param args List of arguments accessible from within the source code + * @param bytesArgs Array of bytes arguments, represented as hex strings + * @param subscriptionId Billing ID + */ + function sendRequest( + string memory source, + bytes memory encryptedSecretsUrls, + uint8 donHostedSecretsSlotID, + uint64 donHostedSecretsVersion, + string[] memory args, + bytes[] memory bytesArgs, + uint64 subscriptionId, + uint32 gasLimit, + bytes32 donID + ) external onlyOwner returns (bytes32 requestId) { + FunctionsRequest.Request memory req; + req.initializeRequestForInlineJavaScript(source); + if (encryptedSecretsUrls.length > 0) { + req.addSecretsReference(encryptedSecretsUrls); + } else if (donHostedSecretsVersion > 0) { + req.addDONHostedSecrets(donHostedSecretsSlotID, donHostedSecretsVersion); + } + if (args.length > 0) req.setArgs(args); + if (bytesArgs.length > 0) req.setBytesArgs(bytesArgs); + s_lastRequestId = _sendRequest(req.encodeCBOR(), subscriptionId, gasLimit, donID); + return s_lastRequestId; + } + + /** + * @notice Send a pre-encoded CBOR request + * @param request CBOR-encoded request data + * @param subscriptionId Billing ID + * @param gasLimit The maximum amount of gas the request can consume + * @param donID ID of the job to be invoked + * @return requestId The ID of the sent request + */ + function sendRequestCBOR( + bytes memory request, + uint64 subscriptionId, + uint32 gasLimit, + bytes32 donID + ) external onlyOwner returns (bytes32 requestId) { + s_lastRequestId = _sendRequest(request, subscriptionId, gasLimit, donID); + return s_lastRequestId; + } + + /** + * @dev Internal function to process the outcome of a data request. It stores the latest response or error and updates + * the contract state accordingly. This function is designed to handle only one of `response` or `err` at a time, not + * both. It decodes the response if present and emits events to log both raw and decoded data. + * + * @param requestId The unique identifier of the request, originally returned by `sendRequest`. Used to match + * responses with requests. + * @param response The raw aggregated response data from the external source. This data is ABI-encoded and is expected + * to contain specific information (e.g., answer, updatedAt) if no error occurred. The function attempts to decode + * this data if `response` is not empty. + * @param err The raw aggregated error information, indicating an issue either from the user's code or within the + * execution of the user Chainlink Function. + * + * Emits a `DecodedResponse` event if the `response` is successfully decoded, providing detailed information about the + * data received. + * Emits a `Response` event for every call to log the raw response and error data. + * + * Requirements: + * - The `requestId` must match the last stored request ID to ensure the response corresponds to the latest request + * sent. + * - Only one of `response` or `err` should contain data for a given call; the other should be empty. + */ + function fulfillRequest( + bytes32 requestId, + bytes memory response, + bytes memory err + ) internal override { + if (s_lastRequestId != requestId) { + revert UnexpectedRequestID(requestId); + } + + s_lastError = err; + s_lastResponse = response; + + if (response.length > 0) { + (uint256 answer, uint256 updatedAt, uint8 decimals, string memory description) = + abi.decode(response, (uint256, uint256, uint8, string)); + + s_answer = answer; + s_updatedAt = updatedAt; + s_decimals = decimals; + s_description = description; + + emit DecodedResponse(requestId, answer, updatedAt, decimals, description); + } + + emit Response(requestId, response, err); + } +} +``` + This Solidity contract is similar to the [FunctionsConsumer.sol](https://remix.ethereum.org/#url=https://docs.chain.link/samples/ChainlinkFunctions/FunctionsConsumer.sol) contract used in the [Using Imports with Functions](/chainlink-functions/tutorials/importing-packages) tutorial. The main difference is the processing of the response in the `fulfillRequest` function: - It uses Solidity `abi.decode` to decode the `response` to retrieve the `answer`, `updatedAt`, `decimals`, and `description`. @@ -3335,6 +3853,130 @@ The consumer contract for Custom Automated Functions is different from the consu 1. Open the [CustomAutomatedFunctionsConsumerExample.sol](https://remix.ethereum.org/#url=https://docs.chain.link/samples/ChainlinkFunctions/CustomAutomatedFunctionsConsumerExample.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + pragma solidity ^0.8.20; + + import {AutomationCompatibleInterface} from "@chainlink/contracts/src/v0.8/automation/AutomationCompatible.sol"; + import {FunctionsClient} from "@chainlink/contracts/src/v0.8/functions/v1_0_0/FunctionsClient.sol"; + + import {FunctionsRequest} from "@chainlink/contracts/src/v0.8/functions/v1_0_0/libraries/FunctionsRequest.sol"; + import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + + /** + * @title Functions contract used for Automation. + * @notice This contract is a demonstration of using Functions and Automation. + * @notice NOT FOR PRODUCTION USE + */ + contract CustomAutomatedFunctionsConsumerExample is FunctionsClient, AutomationCompatibleInterface, ConfirmedOwner { + uint256 public lastBlockNumber; + bytes public request; + uint64 public subscriptionId; + uint32 public gasLimit; + bytes32 public donID; + bytes32 public s_lastRequestId; + bytes public s_lastResponse; + bytes public s_lastError; + uint256 public s_upkeepCounter; + uint256 public s_requestCounter; + uint256 public s_responseCounter; + + error UnexpectedRequestID(bytes32 requestId); + + event Response(bytes32 indexed requestId, bytes response, bytes err); + event RequestRevertedWithErrorMsg(string reason); + event RequestRevertedWithoutErrorMsg(bytes data); + + constructor( + address router + ) FunctionsClient(router) ConfirmedOwner(msg.sender) {} + + /** + * @notice Checks if upkeep is needed based on the difference between the current and the last block number. + * @dev This function checks if the current block number has incremented since the last recorded block number and + * returns a boolean indicating if upkeep is needed. + * @return upkeepNeeded A boolean indicating if upkeep is needed (true if the current block number has incremented + * since the last recorded block number). + * @return performData An empty bytes value since no additional data is needed for the upkeep in this implementation. + */ + function checkUpkeep( + bytes calldata /* checkData */ + ) external view override returns (bool upkeepNeeded, bytes memory performData) { + upkeepNeeded = block.number - lastBlockNumber > 0; // Check if the current block number has incremented since the + // last recorded block number + // We don't use the checkData in this example. The checkData is defined when the Upkeep was registered. + return (upkeepNeeded, ""); // Return an empty bytes value for performData + } + + /** + * @notice Send a pre-encoded CBOR request if the current block number has incremented since the last recorded block + * number. + */ + function performUpkeep( + bytes calldata /* performData */ + ) external override { + if (block.number - lastBlockNumber > 0) { + lastBlockNumber = block.number; + s_upkeepCounter = s_upkeepCounter + 1; + try i_router.sendRequest( + subscriptionId, request, FunctionsRequest.REQUEST_DATA_VERSION, gasLimit, donID + ) returns ( + bytes32 requestId + ) { + s_lastRequestId = requestId; + s_requestCounter = s_requestCounter + 1; + emit RequestSent(requestId); + } catch Error(string memory reason) { + emit RequestRevertedWithErrorMsg(reason); + } catch (bytes memory data) { + emit RequestRevertedWithoutErrorMsg(data); + } + } + // We don't use the performData in this example. The performData is generated by the Automation Node's call to your + // checkUpkeep function + } + + /// @notice Update the request settings + /// @dev Only callable by the owner of the contract + /// @param _request The new encoded CBOR request to be set. The request is encoded offchain + /// @param _subscriptionId The new subscription ID to be set + /// @param _gasLimit The new gas limit to be set + /// @param _donID The new job ID to be set + function updateRequest( + bytes memory _request, + uint64 _subscriptionId, + uint32 _gasLimit, + bytes32 _donID + ) external onlyOwner { + request = _request; + subscriptionId = _subscriptionId; + gasLimit = _gasLimit; + donID = _donID; + } + + /** + * @notice Store latest result/error + * @param requestId The request ID, returned by sendRequest() + * @param response Aggregated response from the user code + * @param err Aggregated error from the user code or from the execution pipeline + * Either response or error parameter will be set, but never both + */ + function fulfillRequest( + bytes32 requestId, + bytes memory response, + bytes memory err + ) internal override { + if (s_lastRequestId != requestId) { + revert UnexpectedRequestID(requestId); + } + s_lastResponse = response; + s_lastError = err; + s_responseCounter = s_responseCounter + 1; + emit Response(requestId, s_lastResponse, s_lastError); + } + } + ``` + 2. Compile the contract. 3. Open MetaMask and select the *Ethereum Sepolia* network. @@ -3488,6 +4130,103 @@ The consumer contract for Automated Functions is different from the consumer in 1. Open the [AutomatedFunctionsConsumerExample.sol](https://remix.ethereum.org/#url=https://docs.chain.link/samples/ChainlinkFunctions/AutomatedFunctionsConsumerExample.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + pragma solidity ^0.8.20; + + import {FunctionsClient} from "@chainlink/contracts/src/v0.8/functions/v1_0_0/FunctionsClient.sol"; + import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + + /** + * @title Functions contract used for Automation. + * @notice This contract is a demonstration of using Functions and Automation. + * @notice You may need to add a Forwarder for additional security. + * @notice NOT FOR PRODUCTION USE + */ + contract AutomatedFunctionsConsumerExample is FunctionsClient, ConfirmedOwner { + address public upkeepContract; + bytes public request; + uint64 public subscriptionId; + uint32 public gasLimit; + bytes32 public donID; + bytes32 public s_lastRequestId; + bytes public s_lastResponse; + bytes public s_lastError; + + error NotAllowedCaller(address caller, address owner, address automationRegistry); + error UnexpectedRequestID(bytes32 requestId); + + event Response(bytes32 indexed requestId, bytes response, bytes err); + + constructor( + address router + ) FunctionsClient(router) ConfirmedOwner(msg.sender) {} + + /** + * @notice Reverts if called by anyone other than the contract owner or automation registry. + */ + modifier onlyAllowed() { + if (msg.sender != owner() && msg.sender != upkeepContract) { + revert NotAllowedCaller(msg.sender, owner(), upkeepContract); + } + _; + } + + function setAutomationCronContract( + address _upkeepContract + ) external onlyOwner { + upkeepContract = _upkeepContract; + } + + /// @notice Update the request settings + /// @dev Only callable by the owner of the contract + /// @param _request The new encoded CBOR request to be set. The request is encoded offchain + /// @param _subscriptionId The new subscription ID to be set + /// @param _gasLimit The new gas limit to be set + /// @param _donID The new job ID to be set + function updateRequest( + bytes memory _request, + uint64 _subscriptionId, + uint32 _gasLimit, + bytes32 _donID + ) external onlyOwner { + request = _request; + subscriptionId = _subscriptionId; + gasLimit = _gasLimit; + donID = _donID; + } + + /** + * @notice Send a pre-encoded CBOR request + * @return requestId The ID of the sent request + */ + function sendRequestCBOR() external onlyAllowed returns (bytes32 requestId) { + s_lastRequestId = _sendRequest(request, subscriptionId, gasLimit, donID); + return s_lastRequestId; + } + + /** + * @notice Store latest result/error + * @param requestId The request ID, returned by sendRequest() + * @param response Aggregated response from the user code + * @param err Aggregated error from the user code or from the execution pipeline + * Either response or error parameter will be set, but never both + */ + function fulfillRequest( + bytes32 requestId, + bytes memory response, + bytes memory err + ) internal override { + if (s_lastRequestId != requestId) { + revert UnexpectedRequestID(requestId); + } + s_lastResponse = response; + s_lastError = err; + emit Response(requestId, s_lastResponse, s_lastError); + } + } + ``` + 2. Compile the contract. 3. Open MetaMask and select the *Ethereum Sepolia* network. diff --git a/src/content/chainlink-local/llms-full.txt b/src/content/chainlink-local/llms-full.txt index 9d11dc72a82..af2568892e6 100644 --- a/src/content/chainlink-local/llms-full.txt +++ b/src/content/chainlink-local/llms-full.txt @@ -8519,10 +8519,184 @@ does not persist the files that you open from an external source. To save files, 3. Copy the content of the [Test CCIP Local Simulator contract](https://docs.chain.link/samples/CCIP/TestCCIPLocalSimulator.sol) into a new file in the workspace. + ```sol + // SPDX-License-Identifier: MIT + pragma solidity 0.8.24; + + // solhint-disable no-unused-import + // import {CCIPLocalSimulator} from "@chainlink/local/src/ccip/CCIPLocalSimulator.sol"; + ``` + 4. Copy the content of the [Sender contract](https://docs.chain.link/samples/CCIP/Sender.sol) into a new file in the workspace. + ```sol + // SPDX-License-Identifier: MIT + 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"; + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + + /// @title - A simple contract for sending string data across chains. + contract Sender is OwnerIsCreator { + // Custom errors to provide more descriptive revert messages. + error NotEnoughBalance(uint256 currentBalance, uint256 calculatedFees); // Used to make sure contract has enough + // balance. + + // Event emitted when a message is sent to another chain. + // The chain selector of the destination chain. + // The address of the receiver on the destination chain. + // The text being sent. + // the token address used to pay CCIP fees. + // The fees paid for sending the CCIP message. + event MessageSent( // The unique ID of the CCIP message. + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address receiver, + string text, + address feeToken, + uint256 fees + ); + + IRouterClient private s_router; + + LinkTokenInterface private s_linkToken; + + /// @notice Constructor initializes the contract with the router address. + /// @param _router The address of the router contract. + /// @param _link The address of the link contract. + constructor( + address _router, + address _link + ) { + s_router = IRouterClient(_router); + s_linkToken = LinkTokenInterface(_link); + } + + /// @notice Sends data to receiver on the destination chain. + /// @dev Assumes your contract has sufficient LINK. + /// @param destinationChainSelector The identifier (aka selector) for the destination blockchain. + /// @param receiver The address of the recipient on the destination blockchain. + /// @param text The string text to be sent. + /// @return messageId The ID of the message that was sent. + function sendMessage( + uint64 destinationChainSelector, + address receiver, + string calldata text + ) external onlyOwner returns (bytes32 messageId) { + // Create an EVM2AnyMessage struct in memory with necessary information for sending a cross-chain message + Client.EVM2AnyMessage memory evm2AnyMessage = Client.EVM2AnyMessage({ + receiver: abi.encode(receiver), // ABI-encoded receiver address + data: abi.encode(text), // ABI-encoded string + tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array indicating no tokens are being sent + extraArgs: Client._argsToBytes( + // Additional arguments, setting gas limit and allowing out-of-order execution. + // Best Practice: For simplicity, the values are hardcoded. It is advisable to use a more dynamic approach + // where you set the extra arguments off-chain. This allows adaptation depending on the lanes, messages, + // and ensures compatibility with future CCIP upgrades. Read more about it here: + // https://docs.chain.link/ccip/concepts/best-practices/evm#using-extraargs + Client.GenericExtraArgsV2({ + gasLimit: 200_000, // Gas limit for the callback on the destination chain + allowOutOfOrderExecution: true // Allows the message to be executed out of order relative to other messages + // from + // the same sender + }) + ), + // Set the feeToken address, indicating LINK will be used for fees + feeToken: address(s_linkToken) + }); + + // Get the fee required to send the message + uint256 fees = s_router.getFee(destinationChainSelector, evm2AnyMessage); + + if (fees > s_linkToken.balanceOf(address(this))) { + revert NotEnoughBalance(s_linkToken.balanceOf(address(this)), fees); + } + + // approve the Router to transfer LINK tokens on contract's behalf. It will spend the fees in LINK + s_linkToken.approve(address(s_router), fees); + + // Send the message through the router and store the returned message ID + messageId = s_router.ccipSend(destinationChainSelector, evm2AnyMessage); + + // Emit an event with message details + emit MessageSent(messageId, destinationChainSelector, receiver, text, address(s_linkToken), fees); + + // Return the message ID + return messageId; + } + } + ``` + 5. Copy the content of the [Receiver contract](https://docs.chain.link/samples/CCIP/Receiver.sol) into a new file in the workspace. + ```sol + // SPDX-License-Identifier: MIT + pragma solidity 0.8.24; + + import {CCIPReceiver} from "@chainlink/contracts-ccip/contracts/applications/CCIPReceiver.sol"; + import {Client} from "@chainlink/contracts-ccip/contracts/libraries/Client.sol"; + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + + /// @title - A simple contract for receiving string data across chains. + contract Receiver is CCIPReceiver { + // Event emitted when a message is received from another chain. + event MessageReceived( // The unique ID of the message. + // The chain selector of the source chain. + // The address of the sender from the source chain. + // The text that was received. + bytes32 indexed messageId, + uint64 indexed sourceChainSelector, + address sender, + string text + ); + + bytes32 private s_lastReceivedMessageId; // Store the last received messageId. + string private s_lastReceivedText; // Store the last received text. + + /// @notice Constructor initializes the contract with the router address. + /// @param router The address of the router contract. + constructor( + address router + ) CCIPReceiver(router) {} + + /// handle a received message + function _ccipReceive( + Client.Any2EVMMessage memory any2EvmMessage + ) internal override { + s_lastReceivedMessageId = any2EvmMessage.messageId; // fetch the messageId + s_lastReceivedText = abi.decode(any2EvmMessage.data, (string)); // abi-decoding of the sent text + + emit MessageReceived( + any2EvmMessage.messageId, + any2EvmMessage.sourceChainSelector, // fetch the source chain identifier (aka selector) + abi.decode(any2EvmMessage.sender, (address)), // abi-decoding of the sender address, + abi.decode(any2EvmMessage.data, (string)) + ); + } + + /// @notice Fetches the details of the last received message. + /// @return messageId The ID of the last received message. + /// @return text The last received text. + function getLastReceivedMessageDetails() external view returns (bytes32 messageId, string memory text) { + return (s_lastReceivedMessageId, s_lastReceivedText); + } + } + ``` + At this point, you should have three files in your workspace: - **TestCCIPLocalSimulator.sol**: The file imports the Chainlink CCIP local simulator contract. diff --git a/src/content/chainlink-nodes/llms-full.txt b/src/content/chainlink-nodes/llms-full.txt index d2cab9f00d9..471148769cd 100644 --- a/src/content/chainlink-nodes/llms-full.txt +++ b/src/content/chainlink-nodes/llms-full.txt @@ -1250,6 +1250,40 @@ Source: https://docs.chain.link/chainlink-nodes/job-specs/direct-request-get-str This is an example v2 (TOML) job spec for returning a *string* in one Chainlink API Call. Note that the job calls the `fulfillOracleRequest2` function. If you are a node operator, use an [Operator contract](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/operatorforwarder/Operator.sol) with this job. To test it from a smart contract, see this [Example](/any-api/get-request/examples/array-response). + +```toml +# THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. +# THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. +# DO NOT USE THIS CODE IN PRODUCTION. + +type = "directrequest" +# evmChainID for Sepolia Testnet +evmChainID = "11155111" +schemaVersion = 1 +name = "Get > String" +contractAddress = "YOUR_ORACLE_CONTRACT_ADDRESS" +maxTaskDuration = "0s" +minIncomingConfirmations = 0 +observationSource = """ + decode_log [type="ethabidecodelog" + abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" + data="$(jobRun.logData)" + topics="$(jobRun.logTopics)"] + + decode_cbor [type="cborparse" data="$(decode_log.data)"] + fetch [type="http" method=GET url="$(decode_cbor.get)" allowUnrestrictedNetworkAccess="true"] + parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] + encode_data [type="ethabiencode" abi="(bytes32 requestId, string value)" data="{ \\"requestId\\": $(decode_log.requestId), \\"value\\": $(parse) }"] + encode_tx [type="ethabiencode" + abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" + data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" + ] + submit_tx [type="ethtx" to="YOUR_ORACLE_CONTRACT_ADDRESS" data="$(encode_tx)"] + + decode_log -> decode_cbor -> fetch -> parse -> encode_data -> encode_tx -> submit_tx +""" +``` + --- # GET > Uint256 Example Job Spec @@ -4034,6 +4068,44 @@ You will create a job that calls an OpenAPI , parses the response and then retur 2. Paste the job specification from above into the text field. + ```toml + # THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. + # THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. + # DO NOT USE THIS CODE IN PRODUCTION. + + name = "Get > Uint256 - (TOML)" + schemaVersion = 1 + type = "directrequest" + # evmChainID for Sepolia Testnet + evmChainID = "11155111" + # Optional External Job ID: Automatically generated if unspecified + # externalJobID = "b1d42cd5-4a3a-4200-b1f7-25a68e48aad8" + contractAddress = "YOUR_OPERATOR_CONTRACT_ADDRESS" + maxTaskDuration = "0s" + minIncomingConfirmations = 0 + observationSource = """ + decode_log [type="ethabidecodelog" + abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" + data="$(jobRun.logData)" + topics="$(jobRun.logTopics)"] + + decode_cbor [type="cborparse" data="$(decode_log.data)"] + fetch [type="http" method=GET url="$(decode_cbor.get)" allowUnrestrictedNetworkAccess="true"] + parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] + + multiply [type="multiply" input="$(parse)" times="$(decode_cbor.times)"] + + encode_data [type="ethabiencode" abi="(bytes32 requestId, uint256 value)" data="{ \\"requestId\\": $(decode_log.requestId), \\"value\\": $(multiply) }"] + encode_tx [type="ethabiencode" + abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" + data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" + ] + submit_tx [type="ethtx" to="YOUR_OPERATOR_CONTRACT_ADDRESS" data="$(encode_tx)"] + + decode_log -> decode_cbor -> fetch -> parse -> multiply -> encode_data -> encode_tx -> submit_tx + """ + ``` + 3. Replace `YOUR_OPERATOR_CONTRACT_ADDRESS` with the address of your deployed operator contract address from the previous steps. 4. Click **Create Job**. If the node creates the job successfully, a notice with the job number appears. @@ -24560,10 +24632,81 @@ This section is similar to the [Fulfilling Requests](/chainlink-nodes/v1/fulfill - `YOUR_OPERATOR_CONTRACT_ADDRESS` with the address of your deployed operator contract address. - `EOA_ADDRESS` with the **first** Chainlink node EOA. + ```toml + # THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. + # THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. + # DO NOT USE THIS CODE IN PRODUCTION. + + # evmChainID for Sepolia Testnet + evmChainID = "11155111" + contractAddress = "YOUR_OPERATOR_CONTRACT_ADDRESS" + forwardingAllowed = true + maxTaskDuration = "0s" + minIncomingConfirmations = 0 + name = "Get > Uint256" + observationSource = """ + decode_log [type="ethabidecodelog" + abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" + data="$(jobRun.logData)" + topics="$(jobRun.logTopics)"] + + decode_cbor [type="cborparse" data="$(decode_log.data)"] + fetch [type="http" method=GET url="$(decode_cbor.get)" allowUnrestrictedNetworkAccess="true"] + parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] + + multiply [type="multiply" input="$(parse)" times="$(decode_cbor.times)"] + + encode_data [type="ethabiencode" abi="(bytes32 requestId, uint256 value)" data="{ \\"requestId\\": $(decode_log.requestId), \\"value\\": $(multiply) }"] + encode_tx [type="ethabiencode" + abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" + data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" + ] + submit_tx [type="ethtx" to="YOUR_OPERATOR_CONTRACT_ADDRESS" data="$(encode_tx)" from="[\\"EOA_ADDRESS\\"]"] + + decode_log -> decode_cbor -> fetch -> parse -> multiply -> encode_data -> encode_tx -> submit_tx + """ + schemaVersion = 1 + type = "directrequest" + ``` + 4. Create the `string` job. Replace: - `YOUR_OPERATOR_CONTRACT_ADDRESS` with the address of your deployed operator contract address. - `EOA_ADDRESS` with the **second** Chainlink node EOA. + ```toml + # THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. + # THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. + # DO NOT USE THIS CODE IN PRODUCTION. + + # evmChainID for Sepolia Testnet + evmChainID = "11155111" + contractAddress = "YOUR_OPERATOR_CONTRACT_ADDRESS" + forwardingAllowed = true + maxTaskDuration = "0s" + minIncomingConfirmations = 0 + name = "Get > String" + observationSource = """ + decode_log [type="ethabidecodelog" + abi="OracleRequest(bytes32 indexed specId, address requester, bytes32 requestId, uint256 payment, address callbackAddr, bytes4 callbackFunctionId, uint256 cancelExpiration, uint256 dataVersion, bytes data)" + data="$(jobRun.logData)" + topics="$(jobRun.logTopics)"] + + decode_cbor [type="cborparse" data="$(decode_log.data)"] + fetch [type="http" method=GET url="$(decode_cbor.get)" allowUnrestrictedNetworkAccess="true"] + parse [type="jsonparse" path="$(decode_cbor.path)" data="$(fetch)"] + encode_data [type="ethabiencode" abi="(bytes32 requestId, string value)" data="{ \\"requestId\\": $(decode_log.requestId), \\"value\\": $(parse) }"] + encode_tx [type="ethabiencode" + abi="fulfillOracleRequest2(bytes32 requestId, uint256 payment, address callbackAddress, bytes4 callbackFunctionId, uint256 expiration, bytes calldata data)" + data="{\\"requestId\\": $(decode_log.requestId), \\"payment\\": $(decode_log.payment), \\"callbackAddress\\": $(decode_log.callbackAddr), \\"callbackFunctionId\\": $(decode_log.callbackFunctionId), \\"expiration\\": $(decode_log.cancelExpiration), \\"data\\": $(encode_data)}" + ] + submit_tx [type="ethtx" to="YOUR_OPERATOR_CONTRACT_ADDRESS" data="$(encode_tx)" from="[\\"EOA_ADDRESS\\"]"] + + decode_log -> decode_cbor -> fetch -> parse -> encode_data -> encode_tx -> submit_tx + """ + schemaVersion = 1 + type = "directrequest" + ``` + 5. After you create the jobs, record the two job IDs. <Aside type="note"> diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 386a9d3bcba..bb53d50fe65 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -2366,6 +2366,27 @@ To be a valid target for the `KeystoneForwarder`, your consumer contract must sa The `KeystoneForwarder` needs a standardized function to call. This is defined by the `IReceiver` interface, which mandates an `onReport` function. +```sol +// 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; +} +``` + - `metadata`: Contains information about the workflow (ID, name, owner). This is encoded by the Forwarder using `abi.encodePacked` with the following structure: `bytes32 workflowId`, `bytes10 workflowName`, `address workflowOwner`. - `report`: The raw, ABI-encoded data payload from your workflow. @@ -2393,10 +2414,280 @@ While you can implement these standards manually, we provide an abstract contrac ### 3.2 Contract Source Code +```sol +// 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 pure virtual override returns (bool) { + return interfaceId == type(IReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; + } +} +``` + ### 3.3 Quick Start The simplest way to use `ReceiverTemplate` is to inherit from it and implement the `_processReport` function: +```sol +// 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); + } +} +``` + ### 3.4 Configuring Permissions The forwarder address is configured at deployment via the constructor and provides your first line of defense. After deploying your contract, the owner can configure additional security checks or update the forwarder address if needed. diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index 7c3c0baa2aa..9fd38ce33b3 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -1955,6 +1955,27 @@ To be a valid target for the `KeystoneForwarder`, your consumer contract must sa The `KeystoneForwarder` needs a standardized function to call. This is defined by the `IReceiver` interface, which mandates an `onReport` function. +```sol +// 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; +} +``` + - `metadata`: Contains information about the workflow (ID, name, owner). This is encoded by the Forwarder using `abi.encodePacked` with the following structure: `bytes32 workflowId`, `bytes10 workflowName`, `address workflowOwner`. - `report`: The raw, ABI-encoded data payload from your workflow. @@ -1982,10 +2003,280 @@ While you can implement these standards manually, we provide an abstract contrac ### 3.2 Contract Source Code +```sol +// 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 pure virtual override returns (bool) { + return interfaceId == type(IReceiver).interfaceId || interfaceId == type(IERC165).interfaceId; + } +} +``` + ### 3.3 Quick Start The simplest way to use `ReceiverTemplate` is to inherit from it and implement the `_processReport` function: +```sol +// 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); + } +} +``` + ### 3.4 Configuring Permissions The forwarder address is configured at deployment via the constructor and provides your first line of defense. After deploying your contract, the owner can configure additional security checks or update the forwarder address if needed. diff --git a/src/content/data-feeds/llms-full.txt b/src/content/data-feeds/llms-full.txt index b65c67cac1b..d24a0c9afc7 100644 --- a/src/content/data-feeds/llms-full.txt +++ b/src/content/data-feeds/llms-full.txt @@ -978,6 +978,15 @@ The example below uses Javascript Web3 library to interact with ENS. See the [EN This example logs the address of the data feed on the Ethereum mainnet for ETH / USD prices. +```js +const Web3 = require("web3") + +const web3 = new Web3("https://rpc.ankr.com/eth") +web3.eth.ens.getAddress("eth-usd.data.eth").then((address) => { + console.log(address) +}) +``` + ### Solidity In Solidity, the address of the ENS registry must be known. According to [ENS documentation](https://docs.ens.domains/ens-deployments), this address is the same across Mainnet and testnet: @@ -988,6 +997,52 @@ Also, instead of using readable string names like `eth-usd.data.eth`, resolvers "ETH / USD" hash: `0xf599f4cd075a34b92169cf57271da65a7a936c35e3f31e854447fbb3e7eb736d` +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +// ENS Registry Contract +interface ENS { + function resolver( + bytes32 node + ) external view returns (Resolver); +} + +// Chainlink Resolver +interface Resolver { + function addr( + bytes32 node + ) external view returns (address); +} + +// Consumer contract +contract ENSConsumer { + ENS ens; + + // ENS registry address: 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e + constructor( + address ensAddress + ) { + ens = ENS(ensAddress); + } + + // Use ID Hash instead of readable name + // ETH / USD hash: 0xf599f4cd075a34b92169cf57271da65a7a936c35e3f31e854447fbb3e7eb736d + function resolve( + bytes32 node + ) public view returns (address) { + Resolver resolver = ens.resolver(node); + return resolver.addr(node); + } +} +``` + --- # Feed Types @@ -1029,6 +1084,59 @@ If you are new to smart contract development, learn how to [Deploy Your First Sm This example contract obtains the latest price answer from the [BTC / USD feed](/data-feeds/price-feeds/addresses) on the Sepolia testnet, but you can modify it to read any of the different [Types of Data Feeds](/data-feeds#types-of-data-feeds). +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED + * VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/** + * If you are reading data feeds on L2 networks, you must + * check the latest answer from the L2 Sequencer Uptime + * Feed to ensure that the data is accurate in the event + * of an L2 sequencer outage. See the + * https://docs.chain.link/data-feeds/l2-sequencer-feeds + * page for details. + */ +contract DataConsumerV3 { + AggregatorV3Interface internal dataFeed; + + /** + * Network: Sepolia + * Aggregator: BTC/USD + * Address: 0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43 + */ + constructor() { + dataFeed = AggregatorV3Interface(0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43); + } + + /** + * Returns the latest answer. + */ + function getChainlinkDataFeedLatestAnswer() public view returns (int256) { + // prettier-ignore + ( + /* uint80 roundId */ + , + int256 answer, + /*uint256 startedAt*/ + , + /*uint256 updatedAt*/ + , + /*uint80 answeredInRound*/ + ) = dataFeed.latestRoundData(); + return answer; + } +} +``` + The contract has the following components: - The `import` line imports an interface named `AggregatorV3Interface`. Interfaces define functions without their implementation, which leaves inheriting contracts to define the actual implementation themselves. In this case, `AggregatorV3Interface` defines that all v3 Aggregators have the function `latestRoundData`. You can [see the complete code](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol) for the `AggregatorV3Interface` on GitHub. @@ -1183,12 +1291,160 @@ The [`getRoundData` function](/data-feeds/api-reference/#getrounddata) returns t ### Solidity +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract HistoricalDataConsumerV3 { + AggregatorV3Interface internal dataFeed; + + /** + * Network: Sepolia + * Aggregator: ETH/USD + * Address: 0x694AA1769357215DE4FAC081bf1f309aDC325306 + */ + constructor() { + dataFeed = AggregatorV3Interface(0x694AA1769357215DE4FAC081bf1f309aDC325306); + } + + /** + * Returns historical data for a round ID. + * roundId is NOT incremental. Not all roundIds are valid. + * You must know a valid roundId before consuming historical data. + * + * ROUNDID VALUES: + * InValid: 18446744073709562300 + * Valid: 18446744073709554683 + * + * @dev A timestamp with zero value means the round is not complete and should not be used. + */ + function getHistoricalData( + uint80 roundId + ) public view returns (int256) { + // prettier-ignore + ( + /*uint80 roundID*/ + , + int256 answer, + /*uint startedAt*/ + , + /*uint timeStamp*/ + , + /*uint80 answeredInRound*/ + ) = dataFeed.getRoundData(roundId); + return answer; + } +} +``` + ### Javascript -<HistoricalPrice client:idle feedAddress={priceFeedAddresses.btc.usd.sepolia.address} roundId={priceFeedAddresses.btc.usd.sepolia.historicalRound} supportedChain="ETHEREUM_SEPOLIA" /> +```js +/** + * THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +const Web3 = require("web3") // for nodejs only +// Replace the provider URL with your own endpoint URL +const web3 = new Web3("https://rpc.ankr.com/eth_sepolia") +const aggregatorV3InterfaceABI = [ + { + inputs: [], + name: "decimals", + outputs: [{ internalType: "uint8", name: "", type: "uint8" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "description", + outputs: [{ internalType: "string", name: "", type: "string" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "uint80", name: "_roundId", type: "uint80" }], + name: "getRoundData", + outputs: [ + { internalType: "uint80", name: "roundId", type: "uint80" }, + { internalType: "int256", name: "answer", type: "int256" }, + { internalType: "uint256", name: "startedAt", type: "uint256" }, + { internalType: "uint256", name: "updatedAt", type: "uint256" }, + { internalType: "uint80", name: "answeredInRound", type: "uint80" }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "latestRoundData", + outputs: [ + { internalType: "uint80", name: "roundId", type: "uint80" }, + { internalType: "int256", name: "answer", type: "int256" }, + { internalType: "uint256", name: "startedAt", type: "uint256" }, + { internalType: "uint256", name: "updatedAt", type: "uint256" }, + { internalType: "uint80", name: "answeredInRound", type: "uint80" }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "version", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, +] +const addr = "0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43" +const dataFeed = new web3.eth.Contract(aggregatorV3InterfaceABI, addr) + +// Valid roundId must be known. They are NOT incremental. +let validId = BigInt("18446744073709554177") +dataFeed.methods + .getRoundData(validId) + .call() + .then((historicalRoundData) => { + document.getElementById("get-data-field").value = historicalRoundData.answer + }) +``` ### Python +```py +# THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. +# THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. +# DO NOT USE THIS CODE IN PRODUCTION. + +from web3 import Web3 + +# Change this to use your own RPC URL +web3 = Web3(Web3.HTTPProvider('https://rpc.ankr.com/eth_sepolia')) +# AggregatorV3Interface ABI +abi = '[{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]' +# Feed address +addr = '0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43' + +# Set up contract instance +contract = web3.eth.contract(address=addr, abi=abi) + +# Valid roundId must be known. They are NOT incremental. +# invalidRoundId = 18446744073709562300 +validRoundId = 18446744073709554177 + +historicalData = contract.functions.getRoundData(validRoundId).call() +print(historicalData) +``` + --- # Chainlink Data Feeds @@ -1461,6 +1717,83 @@ This example code works on any network that supports Solidity. Create the consum - Configure the `sequencerUptimeFeed` object with the [sequencer uptime feed proxy address](#supported-networks) for your L2 network. - Configure the `dataFeed` object with one of the [Data Feed proxy addresses](/data-feeds/price-feeds/addresses) that are available for your network. +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import {AggregatorV2V3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV2V3Interface.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract DataConsumerWithSequencerCheck { + AggregatorV2V3Interface internal dataFeed; + AggregatorV2V3Interface internal sequencerUptimeFeed; + + uint256 private constant GRACE_PERIOD_TIME = 3600; + + error SequencerDown(); + error GracePeriodNotOver(); + + /** + * Network: OP Mainnet + * Data Feed: BTC/USD + * Data Feed address: 0xD702DD976Fb76Fffc2D3963D037dfDae5b04E593 + * Uptime Feed address: 0x371EAD81c9102C9BF4874A9075FFFf170F2Ee389 + * For a list of available Sequencer Uptime Feed proxy addresses, see: + * https://docs.chain.link/docs/data-feeds/l2-sequencer-feeds + */ + constructor() { + dataFeed = AggregatorV2V3Interface(0xD702DD976Fb76Fffc2D3963D037dfDae5b04E593); + sequencerUptimeFeed = AggregatorV2V3Interface(0x371EAD81c9102C9BF4874A9075FFFf170F2Ee389); + } + + // Check the sequencer status and return the latest data + function getChainlinkDataFeedLatestAnswer() public view returns (int256) { + // prettier-ignore + ( + /*uint80 roundID*/ + , + int256 answer, + uint256 startedAt, + /*uint256 updatedAt*/ + , + /*uint80 answeredInRound*/ + ) = sequencerUptimeFeed.latestRoundData(); + + // Answer == 0: Sequencer is up + // Answer == 1: Sequencer is down + bool isSequencerUp = answer == 0; + if (!isSequencerUp) { + revert SequencerDown(); + } + + // Make sure the grace period has passed after the + // sequencer is back up. + uint256 timeSinceUp = block.timestamp - startedAt; + if (timeSinceUp <= GRACE_PERIOD_TIME) { + revert GracePeriodNotOver(); + } + + // prettier-ignore + ( + /*uint80 roundID*/ + , + int256 data, + /*uint startedAt*/ + , + /*uint timeStamp*/ + , + /*uint80 answeredInRound*/ + ) = dataFeed.latestRoundData(); + + return data; + } +} +``` + The `sequencerUptimeFeed` object returns the following values: - `answer`: A variable with a value of either `0` or `1` @@ -2412,6 +2745,157 @@ Below is a full example that demonstrates how to: 5. Update the field names in `consumeData()` to match your struct </Aside> +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {IBundleAggregatorProxy} from "@chainlink/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol"; + +/** + * @notice This struct defines the exact data structure of the MVR feed + * @dev The order and types must match exactly what's defined in the feed + */ +struct Data { + uint256 netAssetValue; + uint256 assetsUnderManagement; + uint256 outstandingShares; + uint256 netIncomeExpenses; + bool openToNewInvestors; +} + +contract MVRDataConsumer { + // Reference to the MVR feed proxy + IBundleAggregatorProxy public s_proxy; + + // Maximum allowed staleness duration for the data + // IMPORTANT: This should be configured based on the specific feed's heartbeat interval + // Check the feed's documentation for the appropriate value instead of using this example value + uint256 public immutable STALENESS_THRESHOLD; + + // Storage for scaled values (after dividing by decimals) + uint256 public netAssetValue; + uint256 public assetsUnderManagement; + uint256 public outstandingShares; + uint256 public netIncomeExpenses; + bool public openToNewInvestors; + + // Storage for original onchain values (no decimal adjustments) + uint256 public rawNetAssetValue; + uint256 public rawAssetsUnderManagement; + uint256 public rawOutstandingShares; + uint256 public rawNetIncomeExpenses; + + // Keep track of decimals for each field in the struct. + // Non-numeric fields (e.g., bool) typically return 0. + uint8[] public decimals; + + // Error for stale data + error StaleData(uint256 lastUpdateTimestamp, uint256 blockTimestamp, uint256 threshold); + + // Error for insufficient decimals array + error InsufficientDecimals(uint256 expected, uint256 actual); + + /** + * @notice Constructor that sets the staleness threshold for the feed + * @param _proxy The address of the MVR feed's proxy contract + * @param _stalenessThreshold Maximum time (in seconds) since last update before data is considered stale + * @dev The threshold should be based on the feed's heartbeat interval from documentation + * For example, if a feed updates every 24 hours (86400s), you might set this to 86400s + some buffer + */ + constructor( + IBundleAggregatorProxy _proxy, + uint256 _stalenessThreshold + ) { + s_proxy = _proxy; + STALENESS_THRESHOLD = _stalenessThreshold; + } + + /** + * @notice Stores the decimals array in your contract for repeated usage. + * @dev Index mapping for this example: + * 0 -> netAssetValue, + * 1 -> assetsUnderManagement, + * 2 -> outstandingShares, + * 3 -> netIncomeExpenses, + * 4 -> openToNewInvestors (likely returns 0). + */ + function storeDecimals() external { + decimals = s_proxy.bundleDecimals(); + } + + /** + * @notice Returns the timestamp of the most recent MVR feed update. + */ + function getLatestBundleTimestamp() external view returns (uint256) { + return s_proxy.latestBundleTimestamp(); + } + + /** + * @notice Simple boolean check for data freshness (block explorer friendly) + * @return true if data is fresh, false if stale + */ + function isDataFresh() public view returns (bool) { + uint256 lastUpdateTime = s_proxy.latestBundleTimestamp(); + return (block.timestamp - lastUpdateTime) <= STALENESS_THRESHOLD; + } + + /** + * @notice Fetches and decodes the latest MVR feed data, then stores both the raw and scaled values. + * @dev This process demonstrates the complete flow of consuming MVR feed data: + * 1. Check data freshness + * 2. Fetch the raw bytes + * 3. Decode into the struct matching the feed's data structure + * 4. Store raw values (preserving original precision) + * 5. Apply decimal conversions to get the true numerical values + */ + function consumeData() external { + // Check data freshness before proceeding + if (!isDataFresh()) { + uint256 lastUpdateTime = s_proxy.latestBundleTimestamp(); + revert StaleData(lastUpdateTime, block.timestamp, STALENESS_THRESHOLD); + } + + // Ensure we have the decimals array - if not, fetch it + if (decimals.length == 0) { + decimals = s_proxy.bundleDecimals(); + } + + // Verify we have enough decimal values for our struct fields + if (decimals.length < 4) { + revert InsufficientDecimals(4, decimals.length); + } + + // 1. Retrieve the raw bytes from the MVR feed + // This is the encoded form of all data fields packed together + bytes memory b = s_proxy.latestBundle(); + + // 2. Decode the raw bytes into our known struct + // The struct Data must match exactly what the feed encodes + Data memory d = abi.decode(b, (Data)); + + // 3. Store the raw (original onchain) values + // These preserve the full precision as reported by the feed + rawNetAssetValue = d.netAssetValue; + rawAssetsUnderManagement = d.assetsUnderManagement; + rawOutstandingShares = d.outstandingShares; + rawNetIncomeExpenses = d.netIncomeExpenses; + openToNewInvestors = d.openToNewInvestors; // Boolean, no need for decimal adjustment + + // 4. Convert values by dividing by 10^decimals[i] + // This removes the decimal scaling factor to get the human-readable representation + // Note: This uses integer division which truncates decimal places + // For example, if decimals[0] = 8 and rawNetAssetValue = 1850000000, + // then netAssetValue = 18 (integer division, decimals are truncated) + netAssetValue = d.netAssetValue / (10 ** decimals[0]); + assetsUnderManagement = d.assetsUnderManagement / (10 ** decimals[1]); + outstandingShares = d.outstandingShares / (10 ** decimals[2]); + netIncomeExpenses = d.netIncomeExpenses / (10 ** decimals[3]); + // Note: We don't need to apply decimals to boolean fields + // The openToNewInvestors field typically has 0 decimals in the array + } +} +``` + **Key Points**: - **Exact Order Matters**: The struct fields and their types must match the feed's definition. @@ -3470,6 +3954,45 @@ Using Solidity, your smart contract should reference [`AggregatorV3Interface`](h Example for reading a Proof of Reserve feed: +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; + +contract ReserveConsumerV3 { + AggregatorV3Interface internal reserveFeed; + + /** + * Network: Ethereum Mainnet + * Aggregator: WBTC PoR + * Address: 0xa81FE04086865e63E12dD3776978E49DEEa2ea4e + */ + constructor() { + reserveFeed = AggregatorV3Interface(0xa81FE04086865e63E12dD3776978E49DEEa2ea4e); + } + + /** + * Returns the latest price + */ + function getLatestReserve() public view returns (int256) { + // prettier-ignore + ( + /*uint80 roundID*/ + , + int256 reserve, + /*uint startedAt*/ + , + /*uint timeStamp*/ + , + /*uint80 answeredInRound*/ + ) = reserveFeed.latestRoundData(); + + return reserve; + } +} +``` + ### Using MVR Feeds [MVR feeds](/data-feeds/mvr-feeds) require a different approach compared to single-value SmartData feeds. Instead of returning a single numeric value, they return a bytes array that must be decoded into a specific data structure. @@ -3647,7 +4170,85 @@ Install the necessary components and include the example code in your project. O 9. Copy the sample code into your project. This example queries price data offchain. By default, the script reads the SOL/USD feed, but you can change the `CHAINLINK_FEED_ADDRESS` variable to point to the [feed account addresses](/data-feeds/price-feeds/addresses?network=solana) that you want to query. You can take the components of these code samples and integrate them with your existing project. Because these examples read data feeds without making any onchain changes, no lamports are required to run them. - <CodeSample src="samples/Solana/PriceFeeds/off-chain-read.ts" /> + ```js + /** + * THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + + const anchor = require("@project-serum/anchor") + const chainlink = require("@chainlink/solana-sdk") + const provider = anchor.AnchorProvider.env() + + async function main() { + anchor.setProvider(provider) + + const CHAINLINK_FEED_ADDRESS = "99B2bTijsU6f1GCT73HmdR7HCFFjGMBcPZY6jZ96ynrR" + const CHAINLINK_PROGRAM_ID = new anchor.web3.PublicKey("cjg3oHmg9uuPsP8D6g29NWvhySJkdYdAo9D25PRbKXJ") + const feedAddress = new anchor.web3.PublicKey(CHAINLINK_FEED_ADDRESS) //SOL-USD Devnet Feed + + //load the data feed account + let dataFeed = await chainlink.OCR2Feed.load(CHAINLINK_PROGRAM_ID, provider) + let listener = null + + //listen for events agains the price feed, and grab the latest rounds price data + listener = dataFeed.onRound(feedAddress, (event) => { + console.log(event.answer.toNumber()) + }) + + //block execution and keep waiting for events to be emitted with price data + await new Promise(function () {}) + } + + main().then( + () => process.exit(), + (err) => { + console.error(err) + process.exit(-1) + } + ) + ``` + + ```ts + /** + * THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + + import * as anchor from "@project-serum/anchor" + import { OCR2Feed } from "@chainlink/solana-sdk" + + async function main() { + const provider = anchor.AnchorProvider.env() + anchor.setProvider(provider) + + const CHAINLINK_FEED_ADDRESS = "99B2bTijsU6f1GCT73HmdR7HCFFjGMBcPZY6jZ96ynrR" + const CHAINLINK_PROGRAM_ID = new anchor.web3.PublicKey("cjg3oHmg9uuPsP8D6g29NWvhySJkdYdAo9D25PRbKXJ") + const feedAddress = new anchor.web3.PublicKey(CHAINLINK_FEED_ADDRESS) //SOL-USD Devnet Feed + + //load the data feed account + let dataFeed = await OCR2Feed.load(CHAINLINK_PROGRAM_ID, provider) + let listener: null | number = null + + //listen for events agains the price feed, and grab the latest rounds price data + listener = dataFeed.onRound(feedAddress, (event) => { + console.log(event.answer.toNumber()) + }) + + //block execution and keep waiting for events to be emitted with price data + await new Promise(function () {}) + } + + main().then( + () => process.exit(), + (err) => { + console.error(err) + process.exit(-1) + } + ) + ``` You can run these examples using the following commands: @@ -4897,6 +5498,34 @@ The decoding process involves understanding two function calls: Below is an example of an ABI definition for the `forward` and `transmitSecondary` function interfaces to help you decode the function calls: +```json +[ + { + "type": "function", + "name": "forward", + "inputs": [ + { "name": "to", "type": "address" }, + { "name": "callData", "type": "bytes" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transmitSecondary", + "inputs": [ + { "name": "reportContext", "type": "bytes32[3]", "internalType": "bytes32[3]" }, + { "name": "report", "type": "bytes", "internalType": "bytes" }, + { "name": "rs", "type": "bytes32[]", "internalType": "bytes32[]" }, + { "name": "ss", "type": "bytes32[]", "internalType": "bytes32[]" }, + { "name": "rawVs", "type": "bytes32", "internalType": "bytes32" } + ], + "outputs": [], + "stateMutability": "nonpayable" + } +] +``` + The following code samples demonstrate the complete decoding process, including extracting the median price from the nested report structure. These implementations show how to: 1. Decode the `forward` function call @@ -5261,6 +5890,59 @@ These code examples demonstrate how to deploy a consumer contract onchain that r To consume price data, your smart contract should reference [`AggregatorV3Interface`](https://github.com/smartcontractkit/chainlink/blob/contracts-v1.3.0/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol), which defines the external functions implemented by Data Feeds. +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED + * VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/** + * If you are reading data feeds on L2 networks, you must + * check the latest answer from the L2 Sequencer Uptime + * Feed to ensure that the data is accurate in the event + * of an L2 sequencer outage. See the + * https://docs.chain.link/data-feeds/l2-sequencer-feeds + * page for details. + */ +contract DataConsumerV3 { + AggregatorV3Interface internal dataFeed; + + /** + * Network: Sepolia + * Aggregator: BTC/USD + * Address: 0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43 + */ + constructor() { + dataFeed = AggregatorV3Interface(0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43); + } + + /** + * Returns the latest answer. + */ + function getChainlinkDataFeedLatestAnswer() public view returns (int256) { + // prettier-ignore + ( + /* uint80 roundId */ + , + int256 answer, + /*uint256 startedAt*/ + , + /*uint256 updatedAt*/ + , + /*uint80 answeredInRound*/ + ) = dataFeed.latestRoundData(); + return answer; + } +} +``` + The `latestRoundData` function returns five values representing information about the latest price data. See the [Data Feeds API Reference](/data-feeds/api-reference) for more details. ### Vyper @@ -5282,6 +5964,27 @@ This example uses [web3.js](https://web3js.readthedocs.io/) to retrieve feed dat This example uses [Web3.py](https://web3py.readthedocs.io/en/stable/) to retrieve feed data from the [BTC / USD feed](https://sepolia.etherscan.io/address/0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43) on the Sepolia testnet. +```py +# THIS IS EXAMPLE CODE THAT USES HARDCODED VALUES FOR CLARITY. +# THIS IS EXAMPLE CODE THAT USES UN-AUDITED CODE. +# DO NOT USE THIS CODE IN PRODUCTION. + +from web3 import Web3 + +# Change this to use your own RPC URL +web3 = Web3(Web3.HTTPProvider('https://rpc.ankr.com/eth_sepolia')) +# AggregatorV3Interface ABI +abi = '[{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]' +# Price Feed address +addr = '0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43' + +# Set up contract instance +contract = web3.eth.contract(address=addr, abi=abi) +# Make call to latestRoundData() +latestData = contract.functions.latestRoundData().call() +print(latestData) +``` + ### Golang You can find an example with all the source files [here](https://github.com/smartcontractkit/smart-contract-examples/tree/main/pricefeed-golang). This example uses [go-ethereum](https://github.com/ethereum/go-ethereum) to retrieve feed data from the [BTC / USD feed](https://sepolia.etherscan.io/address/0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43) on the Sepolia testnet. @@ -5299,6 +6002,60 @@ If you require a denomination other than what is provided, you can use two data If your contracts require Solidity versions that are `>=0.6.0 <0.8.0`, use [OpenZeppelin's SafeMath version 3.4](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/math/SafeMath.sol). </Aside> +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; + +/** + * Network: Sepolia + * Base: BTC/USD + * Base Address: 0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43 + * Quote: EUR/USD + * Quote Address: 0x1a81afB8146aeFfCFc5E50e8479e826E7D55b910 + * Decimals: 8 + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract PriceConverter { + function getDerivedPrice( + address _base, + address _quote, + uint8 _decimals + ) public view returns (int256) { + require(_decimals > uint8(0) && _decimals <= uint8(18), "Invalid _decimals"); + int256 decimals = int256(10 ** uint256(_decimals)); + (, int256 basePrice,,,) = AggregatorV3Interface(_base).latestRoundData(); + uint8 baseDecimals = AggregatorV3Interface(_base).decimals(); + basePrice = scalePrice(basePrice, baseDecimals, _decimals); + + (, int256 quotePrice,,,) = AggregatorV3Interface(_quote).latestRoundData(); + uint8 quoteDecimals = AggregatorV3Interface(_quote).decimals(); + quotePrice = scalePrice(quotePrice, quoteDecimals, _decimals); + + return (basePrice * decimals) / quotePrice; + } + + function scalePrice( + int256 _price, + uint8 _priceDecimals, + uint8 _decimals + ) internal pure returns (int256) { + if (_priceDecimals < _decimals) { + return _price * int256(10 ** uint256(_decimals - _priceDecimals)); + } else if (_priceDecimals > _decimals) { + return _price / int256(10 ** uint256(_priceDecimals - _decimals)); + } + return _price; + } +} +``` + ## More aggregator functions Getting the latest price is not the only data that aggregators can retrieve. You can also retrieve historical price data. To learn more, see the [Historical Price Data](/data-feeds/historical-data) page. diff --git a/src/content/data-streams/llms-full.txt b/src/content/data-streams/llms-full.txt index fac89ea8d21..b23224bbed8 100644 --- a/src/content/data-streams/llms-full.txt +++ b/src/content/data-streams/llms-full.txt @@ -5527,6 +5527,226 @@ Data Streams require several interfaces in order to retrieve and verify reports. In the current code example for using Data Streams with Automation, these interfaces are specified in the example itself. Imports for these interfaces will be available in the future. +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {ILogAutomation, Log} from "@chainlink/contracts/src/v0.8/automation/interfaces/ILogAutomation.sol"; +import { + StreamsLookupCompatibleInterface +} from "@chainlink/contracts/src/v0.8/automation/interfaces/StreamsLookupCompatibleInterface.sol"; +import {Common} from "@chainlink/contracts/src/v0.8/llo-feeds/libraries/Common.sol"; + +import {IRewardManager} from "@chainlink/contracts/src/v0.8/llo-feeds/v0.3.0/interfaces/IRewardManager.sol"; +import {IVerifierFeeManager} from "@chainlink/contracts/src/v0.8/llo-feeds/v0.3.0/interfaces/IVerifierFeeManager.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE FOR DEMONSTRATION PURPOSES. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +// Custom interfaces for IVerifierProxy and IFeeManager +interface IVerifierProxy { + /** + * @notice Verifies that the data encoded has been signed. + * correctly by routing to the correct verifier, and bills the user if applicable. + * @param payload The encoded data to be verified, including the signed + * report. + * @param parameterPayload Fee metadata for billing. For the current implementation this is just the abi-encoded fee + * token ERC-20 address. + * @return verifierResponse The encoded report from the verifier. + */ + function verify( + bytes calldata payload, + bytes calldata parameterPayload + ) external payable returns (bytes memory verifierResponse); + + function s_feeManager() external view returns (IVerifierFeeManager); +} + +interface IFeeManager { + /** + * @notice Calculates the fee and reward associated with verifying a report, including discounts for subscribers. + * This function assesses the fee and reward for report verification, applying a discount for recognized subscriber + * addresses. + * @param subscriber The address attempting to verify the report. A discount is applied if this address + * is recognized as a subscriber. + * @param unverifiedReport The report data awaiting verification. The content of this report is used to + * determine the base fee and reward, before considering subscriber discounts. + * @param quoteAddress The payment token address used for quoting fees and rewards. + * @return fee The fee assessed for verifying the report, with subscriber discounts applied where applicable. + * @return reward The reward allocated to the caller for successfully verifying the report. + * @return totalDiscount The total discount amount deducted from the fee for subscribers + */ + function getFeeAndReward( + address subscriber, + bytes memory unverifiedReport, + address quoteAddress + ) external returns (Common.Asset memory, Common.Asset memory, uint256); + + function i_linkAddress() external view returns (address); + + function i_nativeAddress() external view returns (address); + + function i_rewardManager() external view returns (address); +} + +contract StreamsUpkeep is ILogAutomation, StreamsLookupCompatibleInterface { + error InvalidReportVersion(uint16 version); // Thrown when an unsupported report version is provided to verifyReport. + + /** + * @dev Represents a data report from a Data Streams stream for v3 schema (used for crypto and DEX State Price + * streams). + * The `price`, `bid`, and `ask` values are carried to either 8 or 18 decimal places, depending on the stream. + * `bid`, and `ask` values are not available for DEX State Price streams. + * For more information, see https://docs.chain.link/data-streams/crypto-streams and + * https://docs.chain.link/data-streams/reference/report-schema + */ + struct ReportV3 { + bytes32 feedId; // The stream ID the report has data for. + uint32 validFromTimestamp; // Earliest timestamp for which price is applicable. + uint32 observationsTimestamp; // Latest timestamp for which price is applicable. + uint192 nativeFee; // Base cost to validate a transaction using the report, denominated in the chain’s native + // token (e.g., WETH/ETH). + uint192 linkFee; // Base cost to validate a transaction using the report, denominated in LINK. + uint32 expiresAt; // Latest timestamp where the report can be verified onchain. + int192 price; // DON consensus median price (8 or 18 decimals). + int192 bid; // Simulated price impact of a buy order up to the X% depth of liquidity utilisation (8 or 18 decimals). + // Note: not available for DEX State Price streams. + int192 ask; // Simulated price impact of a sell order up to the X% depth of liquidity utilisation (8 or 18 + // decimals). Note: not available for DEX State Price streams. + } + + /** + * @dev Represents a data report from a Data Streams stream for v4 schema (RWA streams). + * The `price` value is carried to either 8 or 18 decimal places, depending on the stream. + * The `marketStatus` indicates whether the market is currently open. Possible values: `0` (`Unknown`), `1` + * (`Closed`), `2` (`Open`). + * For more information, see https://docs.chain.link/data-streams/rwa-streams and + * https://docs.chain.link/data-streams/reference/report-schema-v4 + */ + struct ReportV4 { + bytes32 feedId; // The stream ID the report has data for. + uint32 validFromTimestamp; // Earliest timestamp for which price is applicable. + uint32 observationsTimestamp; // Latest timestamp for which price is applicable. + uint192 nativeFee; // Base cost to validate a transaction using the report, denominated in the chain’s native + // token (e.g., WETH/ETH). + uint192 linkFee; // Base cost to validate a transaction using the report, denominated in LINK. + uint32 expiresAt; // Latest timestamp where the report can be verified onchain. + int192 price; // DON consensus median benchmark price (8 or 18 decimals). + uint32 marketStatus; // The DON's consensus on whether the market is currently open. + } + + struct Quote { + address quoteAddress; + } + + IVerifierProxy public verifier; + + address public FEE_ADDRESS; + string public constant DATASTREAMS_FEEDLABEL = "feedIDs"; + string public constant DATASTREAMS_QUERYLABEL = "timestamp"; + int192 public lastDecodedPrice; + + // This example reads the ID for the ETH/USD report. + // Find a complete list of IDs at https://docs.chain.link/data-streams/crypto-streams. + string[] public feedIds = ["0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782"]; + + constructor( + address _verifier + ) { + verifier = IVerifierProxy(_verifier); + } + + // This function uses revert to convey call information. + // See https://eips.ethereum.org/EIPS/eip-3668#rationale for details. + function checkLog( + Log calldata log, + bytes memory + ) external returns (bool upkeepNeeded, bytes memory performData) { + revert StreamsLookup(DATASTREAMS_FEEDLABEL, feedIds, DATASTREAMS_QUERYLABEL, log.timestamp, ""); + } + + /** + * @notice this is a new, optional function in streams lookup. It is meant to surface streams lookup errors. + * @return upkeepNeeded boolean to indicate whether the keeper should call performUpkeep or not. + * @return performData bytes that the keeper should call performUpkeep with, if + * upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. + */ + function checkErrorHandler( + uint256, /*errCode*/ + bytes memory /*extraData*/ + ) external pure returns (bool upkeepNeeded, bytes memory performData) { + return (true, "0"); + // Hardcoded to always perform upkeep. + // Read the StreamsLookup error handler guide for more information. + // https://docs.chain.link/chainlink-automation/guides/streams-lookup-error-handler + } + + // The Data Streams report bytes is passed here. + // extraData is context data from stream lookup process. + // Your contract may include logic to further process this data. + // This method is intended only to be simulated offchain by Automation. + // The data returned will then be passed by Automation into performUpkeep + function checkCallback( + bytes[] calldata values, + bytes calldata extraData + ) external pure returns (bool, bytes memory) { + return (true, abi.encode(values, extraData)); + } + + // function will be performed onchain + function performUpkeep( + bytes calldata performData + ) external { + // Decode the performData bytes passed in by CL Automation. + // This contains the data returned by your implementation in checkCallback(). + (bytes[] memory signedReports, bytes memory extraData) = abi.decode(performData, (bytes[], bytes)); + + bytes memory unverifiedReport = signedReports[0]; + + (, /* bytes32[3] reportContextData */ bytes memory reportData) = abi.decode(unverifiedReport, (bytes32[3], bytes)); + + // Extract report version from reportData + uint16 reportVersion = (uint16(uint8(reportData[0])) << 8) | uint16(uint8(reportData[1])); + + // Validate report version + if (reportVersion != 3 && reportVersion != 4) { + revert InvalidReportVersion(uint8(reportVersion)); + } + + // Report verification fees + IFeeManager feeManager = IFeeManager(address(verifier.s_feeManager())); + IRewardManager rewardManager = IRewardManager(address(feeManager.i_rewardManager())); + + address feeTokenAddress = feeManager.i_linkAddress(); + (Common.Asset memory fee,,) = feeManager.getFeeAndReward(address(this), reportData, feeTokenAddress); + + // Approve rewardManager to spend this contract's balance in fees + IERC20(feeTokenAddress).approve(address(rewardManager), fee.amount); + + // Verify the report + bytes memory verifiedReportData = verifier.verify(unverifiedReport, abi.encode(feeTokenAddress)); + + // Decode verified report data into the appropriate Report struct based on reportVersion + if (reportVersion == 3) { + // v3 report schema + ReportV3 memory verifiedReport = abi.decode(verifiedReportData, (ReportV3)); + + // Store the price from the report + lastDecodedPrice = verifiedReport.price; + } else if (reportVersion == 4) { + // v4 report schema + ReportV4 memory verifiedReport = abi.decode(verifiedReportData, (ReportV4)); + + // Store the price from the report + lastDecodedPrice = verifiedReport.price; + } + } +} +``` + --- # Supported Networks @@ -5581,6 +5801,228 @@ Deploy a `ClientReportsVerifier` contract on *Arbitrum Sepolia*. This contract i 1. [Open the ClientReportsVerifier.sol](https://remix.ethereum.org/#url=https://docs.chain.link/samples/DataStreams/ClientReportsVerifier.sol) contract in Remix. + ```sol + // SPDX-License-Identifier: MIT + pragma solidity ^0.8.20; + + import {Common} from "@chainlink/contracts/src/v0.8/llo-feeds/libraries/Common.sol"; + import {IVerifierFeeManager} from "@chainlink/contracts/src/v0.8/llo-feeds/v0.3.0/interfaces/IVerifierFeeManager.sol"; + import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + + using SafeERC20 for IERC20; + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE FOR DEMONSTRATION PURPOSES. + * DO NOT USE THIS CODE IN PRODUCTION. + * + * This contract can verify Chainlink Data Streams reports onchain and pay + * the verification fee in LINK (when required). + * + * - If `VerifierProxy.s_feeManager()` returns a non-zero address, the network + * expects you to interact with that FeeManager for every verification call: + * quote fees, approve the RewardManager, then call `verify()`. + * + * - If `s_feeManager()` returns the zero address, no FeeManager contract has + * been deployed on that chain. In that case there is nothing to quote or pay + * onchain, so the contract skips the fee logic entirely. + * + * The `if (address(feeManager) != address(0))` check below chooses the + * correct path automatically, making the same bytecode usable on any chain. + */ + + // ──────────────────────────────────────────────────────────────────────────── + // Interfaces + // ──────────────────────────────────────────────────────────────────────────── + + interface IVerifierProxy { + /** + * @notice Route a report to the correct verifier and (optionally) bill fees. + * @param payload Full report payload (header + signed report). + * @param parameterPayload ABI-encoded fee metadata. + */ + function verify( + bytes calldata payload, + bytes calldata parameterPayload + ) external payable returns (bytes memory verifierResponse); + + function verifyBulk( + bytes[] calldata payloads, + bytes calldata parameterPayload + ) external payable returns (bytes[] memory verifiedReports); + + function s_feeManager() external view returns (IVerifierFeeManager); + } + + interface IFeeManager { + /** + * @return fee, reward, totalDiscount + */ + function getFeeAndReward( + address subscriber, + bytes memory unverifiedReport, + address quoteAddress + ) external returns (Common.Asset memory, Common.Asset memory, uint256); + + function i_linkAddress() external view returns (address); + + function i_nativeAddress() external view returns (address); + + function i_rewardManager() external view returns (address); + } + + // ──────────────────────────────────────────────────────────────────────────── + // Contract + // ──────────────────────────────────────────────────────────────────────────── + + /** + * @dev This contract implements functionality to verify Data Streams reports from + * the Data Streams API, with payment in LINK tokens. + */ + contract ClientReportsVerifier { + // ----------------- Errors ----------------- + error NothingToWithdraw(); + error NotOwner(address caller); + error InvalidReportVersion(uint16 version); + + // ----------------- Report schemas ----------------- + // More info: https://docs.chain.link/data-streams/reference/report-schema-v3 + /** + * @dev Data Streams report schema v3 (crypto streams). + * Prices, bids and asks use 8 or 18 decimals depending on the stream. + */ + struct ReportV3 { + bytes32 feedId; + uint32 validFromTimestamp; + uint32 observationsTimestamp; + uint192 nativeFee; + uint192 linkFee; + uint32 expiresAt; + int192 price; + int192 bid; + int192 ask; + } + + /** + * @dev Data Streams report schema v8 (RWA streams). + */ + struct ReportV8 { + bytes32 feedId; + uint32 validFromTimestamp; + uint32 observationsTimestamp; + uint192 nativeFee; + uint192 linkFee; + uint32 expiresAt; + uint64 lastUpdateTimestamp; + int192 midPrice; + uint32 marketStatus; + } + + // ----------------- Storage ----------------- + IVerifierProxy public immutable i_verifierProxy; + address private immutable i_owner; + + int192 public lastDecodedPrice; + + // ----------------- Events ----------------- + event DecodedPrice(int192 price); + + // ----------------- Constructor / modifier ----------------- + /** + * @param _verifierProxy Address of the VerifierProxy on the target network. + * Addresses: https://docs.chain.link/data-streams/crypto-streams + */ + constructor( + address _verifierProxy + ) { + i_owner = msg.sender; + i_verifierProxy = IVerifierProxy(_verifierProxy); + } + + modifier onlyOwner() { + if (msg.sender != i_owner) revert NotOwner(msg.sender); + _; + } + + // ----------------- Public API ----------------- + + /** + * @notice Verify a Data Streams report (schema v3 or v8). + * + * @dev Steps: + * 1. Decode the unverified report to get `reportData`. + * 2. Read the first two bytes → schema version (`0x0003` or `0x0008`). + * - Revert if the version is unsupported. + * 3. Fee handling: + * - Query `s_feeManager()` on the proxy. + * – Non-zero → quote the fee, approve the RewardManager, + * ABI-encode the fee token address for `verify()`. + * – Zero → no FeeManager; skip quoting/approval and pass `""`. + * 4. Call `VerifierProxy.verify()`. + * 5. Decode the verified report into the correct struct and emit the price. + * + * @param unverifiedReport Full payload returned by Streams Direct. + * @custom:reverts InvalidReportVersion when schema ≠ v3/v8. + */ + function verifyReport( + bytes memory unverifiedReport + ) external { + // ─── 1. & 2. Extract reportData and schema version ── + (, bytes memory reportData) = abi.decode(unverifiedReport, (bytes32[3], bytes)); + + uint16 reportVersion = (uint16(uint8(reportData[0])) << 8) | uint16(uint8(reportData[1])); + if (reportVersion != 3 && reportVersion != 8) { + revert InvalidReportVersion(reportVersion); + } + + // ─── 3. Fee handling ── + IFeeManager feeManager = IFeeManager(address(i_verifierProxy.s_feeManager())); + + bytes memory parameterPayload; + if (address(feeManager) != address(0)) { + // FeeManager exists — always quote & approve + address feeToken = feeManager.i_linkAddress(); + + (Common.Asset memory fee,,) = feeManager.getFeeAndReward(address(this), reportData, feeToken); + + IERC20(feeToken).approve(feeManager.i_rewardManager(), fee.amount); + parameterPayload = abi.encode(feeToken); + } else { + // No FeeManager deployed on this chain + parameterPayload = bytes(""); + } + + // ─── 4. Verify through the proxy ── + bytes memory verified = i_verifierProxy.verify(unverifiedReport, parameterPayload); + + // ─── 5. Decode & store price ── + if (reportVersion == 3) { + int192 price = abi.decode(verified, (ReportV3)).price; + lastDecodedPrice = price; + emit DecodedPrice(price); + } else { + int192 price = abi.decode(verified, (ReportV8)).midPrice; + lastDecodedPrice = price; + emit DecodedPrice(price); + } + } + + /** + * @notice Withdraw all balance of an ERC-20 token held by this contract. + * @param _beneficiary Address that receives the tokens. + * @param _token ERC-20 token address. + */ + function withdrawToken( + address _beneficiary, + address _token + ) external onlyOwner { + uint256 amount = IERC20(_token).balanceOf(address(this)); + if (amount == 0) revert NothingToWithdraw(); + IERC20(_token).safeTransfer(_beneficiary, amount); + } + } + ``` + 2. Select the `ClientReportsVerifier.sol` contract in the **Solidity Compiler** tab. 3. Compile the contract. @@ -5624,6 +6066,228 @@ For this tutorial on *Arbitrum Sepolia*, fees are required, so you need to fund The example code you deployed has all the interfaces and functions required to verify Data Streams reports onchain. +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {Common} from "@chainlink/contracts/src/v0.8/llo-feeds/libraries/Common.sol"; +import {IVerifierFeeManager} from "@chainlink/contracts/src/v0.8/llo-feeds/v0.3.0/interfaces/IVerifierFeeManager.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +using SafeERC20 for IERC20; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE FOR DEMONSTRATION PURPOSES. + * DO NOT USE THIS CODE IN PRODUCTION. + * + * This contract can verify Chainlink Data Streams reports onchain and pay + * the verification fee in LINK (when required). + * + * - If `VerifierProxy.s_feeManager()` returns a non-zero address, the network + * expects you to interact with that FeeManager for every verification call: + * quote fees, approve the RewardManager, then call `verify()`. + * + * - If `s_feeManager()` returns the zero address, no FeeManager contract has + * been deployed on that chain. In that case there is nothing to quote or pay + * onchain, so the contract skips the fee logic entirely. + * + * The `if (address(feeManager) != address(0))` check below chooses the + * correct path automatically, making the same bytecode usable on any chain. + */ + +// ──────────────────────────────────────────────────────────────────────────── +// Interfaces +// ──────────────────────────────────────────────────────────────────────────── + +interface IVerifierProxy { + /** + * @notice Route a report to the correct verifier and (optionally) bill fees. + * @param payload Full report payload (header + signed report). + * @param parameterPayload ABI-encoded fee metadata. + */ + function verify( + bytes calldata payload, + bytes calldata parameterPayload + ) external payable returns (bytes memory verifierResponse); + + function verifyBulk( + bytes[] calldata payloads, + bytes calldata parameterPayload + ) external payable returns (bytes[] memory verifiedReports); + + function s_feeManager() external view returns (IVerifierFeeManager); +} + +interface IFeeManager { + /** + * @return fee, reward, totalDiscount + */ + function getFeeAndReward( + address subscriber, + bytes memory unverifiedReport, + address quoteAddress + ) external returns (Common.Asset memory, Common.Asset memory, uint256); + + function i_linkAddress() external view returns (address); + + function i_nativeAddress() external view returns (address); + + function i_rewardManager() external view returns (address); +} + +// ──────────────────────────────────────────────────────────────────────────── +// Contract +// ──────────────────────────────────────────────────────────────────────────── + +/** + * @dev This contract implements functionality to verify Data Streams reports from + * the Data Streams API, with payment in LINK tokens. + */ +contract ClientReportsVerifier { + // ----------------- Errors ----------------- + error NothingToWithdraw(); + error NotOwner(address caller); + error InvalidReportVersion(uint16 version); + + // ----------------- Report schemas ----------------- + // More info: https://docs.chain.link/data-streams/reference/report-schema-v3 + /** + * @dev Data Streams report schema v3 (crypto streams). + * Prices, bids and asks use 8 or 18 decimals depending on the stream. + */ + struct ReportV3 { + bytes32 feedId; + uint32 validFromTimestamp; + uint32 observationsTimestamp; + uint192 nativeFee; + uint192 linkFee; + uint32 expiresAt; + int192 price; + int192 bid; + int192 ask; + } + + /** + * @dev Data Streams report schema v8 (RWA streams). + */ + struct ReportV8 { + bytes32 feedId; + uint32 validFromTimestamp; + uint32 observationsTimestamp; + uint192 nativeFee; + uint192 linkFee; + uint32 expiresAt; + uint64 lastUpdateTimestamp; + int192 midPrice; + uint32 marketStatus; + } + + // ----------------- Storage ----------------- + IVerifierProxy public immutable i_verifierProxy; + address private immutable i_owner; + + int192 public lastDecodedPrice; + + // ----------------- Events ----------------- + event DecodedPrice(int192 price); + + // ----------------- Constructor / modifier ----------------- + /** + * @param _verifierProxy Address of the VerifierProxy on the target network. + * Addresses: https://docs.chain.link/data-streams/crypto-streams + */ + constructor( + address _verifierProxy + ) { + i_owner = msg.sender; + i_verifierProxy = IVerifierProxy(_verifierProxy); + } + + modifier onlyOwner() { + if (msg.sender != i_owner) revert NotOwner(msg.sender); + _; + } + + // ----------------- Public API ----------------- + + /** + * @notice Verify a Data Streams report (schema v3 or v8). + * + * @dev Steps: + * 1. Decode the unverified report to get `reportData`. + * 2. Read the first two bytes → schema version (`0x0003` or `0x0008`). + * - Revert if the version is unsupported. + * 3. Fee handling: + * - Query `s_feeManager()` on the proxy. + * – Non-zero → quote the fee, approve the RewardManager, + * ABI-encode the fee token address for `verify()`. + * – Zero → no FeeManager; skip quoting/approval and pass `""`. + * 4. Call `VerifierProxy.verify()`. + * 5. Decode the verified report into the correct struct and emit the price. + * + * @param unverifiedReport Full payload returned by Streams Direct. + * @custom:reverts InvalidReportVersion when schema ≠ v3/v8. + */ + function verifyReport( + bytes memory unverifiedReport + ) external { + // ─── 1. & 2. Extract reportData and schema version ── + (, bytes memory reportData) = abi.decode(unverifiedReport, (bytes32[3], bytes)); + + uint16 reportVersion = (uint16(uint8(reportData[0])) << 8) | uint16(uint8(reportData[1])); + if (reportVersion != 3 && reportVersion != 8) { + revert InvalidReportVersion(reportVersion); + } + + // ─── 3. Fee handling ── + IFeeManager feeManager = IFeeManager(address(i_verifierProxy.s_feeManager())); + + bytes memory parameterPayload; + if (address(feeManager) != address(0)) { + // FeeManager exists — always quote & approve + address feeToken = feeManager.i_linkAddress(); + + (Common.Asset memory fee,,) = feeManager.getFeeAndReward(address(this), reportData, feeToken); + + IERC20(feeToken).approve(feeManager.i_rewardManager(), fee.amount); + parameterPayload = abi.encode(feeToken); + } else { + // No FeeManager deployed on this chain + parameterPayload = bytes(""); + } + + // ─── 4. Verify through the proxy ── + bytes memory verified = i_verifierProxy.verify(unverifiedReport, parameterPayload); + + // ─── 5. Decode & store price ── + if (reportVersion == 3) { + int192 price = abi.decode(verified, (ReportV3)).price; + lastDecodedPrice = price; + emit DecodedPrice(price); + } else { + int192 price = abi.decode(verified, (ReportV8)).midPrice; + lastDecodedPrice = price; + emit DecodedPrice(price); + } + } + + /** + * @notice Withdraw all balance of an ERC-20 token held by this contract. + * @param _beneficiary Address that receives the tokens. + * @param _token ERC-20 token address. + */ + function withdrawToken( + address _beneficiary, + address _token + ) external onlyOwner { + uint256 amount = IERC20(_token).balanceOf(address(this)); + if (amount == 0) revert NothingToWithdraw(); + IERC20(_token).safeTransfer(_beneficiary, amount); + } +} +``` + ### Initializing the contract When deploying the contract, you define the verifier proxy address for the stream you want to read from. You can find this address on the [Stream Addresses](/data-streams/crypto-streams) page. The verifier proxy address provides functions that are required for this example: diff --git a/src/content/datalink/llms-full.txt b/src/content/datalink/llms-full.txt index 28ca7c36e33..e9aa0662c97 100644 --- a/src/content/datalink/llms-full.txt +++ b/src/content/datalink/llms-full.txt @@ -1177,6 +1177,227 @@ Deploy a `ClientReportsVerifier` contract on *Arbitrum Sepolia*. This contract i 1. [Open the ClientReportsVerifier.sol](https://remix.ethereum.org/#url=https://docs.chain.link/samples/DataLink/ClientReportsVerifier.sol) contract in Remix. + ```sol + // SPDX-License-Identifier: MIT + pragma solidity 0.8.24; + + import {Common} from "@chainlink/contracts/src/v0.8/llo-feeds/libraries/Common.sol"; + import {IVerifierFeeManager} from "@chainlink/contracts/src/v0.8/llo-feeds/v0.3.0/interfaces/IVerifierFeeManager.sol"; + import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + + using SafeERC20 for IERC20; + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE FOR DEMONSTRATION PURPOSES. + * DO NOT USE THIS CODE IN PRODUCTION. + * + * This contract can verify Chainlink DataLink reports onchain and pay + * the verification fee in LINK (when required). + * + * - If `VerifierProxy.s_feeManager()` returns a non-zero address, the network + * expects you to interact with that FeeManager for every verification call: + * quote fees, approve the RewardManager, then call `verify()`. + * + * - If `s_feeManager()` returns the zero address, no FeeManager contract has + * been deployed on that chain. In that case there is nothing to quote or pay + * onchain, so the contract skips the fee logic entirely. + * + * The `if (address(feeManager) != address(0))` check below chooses the + * correct path automatically, making the same bytecode usable on any chain. + */ + + // ──────────────────────────────────────────────────────────────────────────── + // Interfaces + // ──────────────────────────────────────────────────────────────────────────── + + interface IVerifierProxy { + /** + * @notice Route a report to the correct verifier and (optionally) bill fees. + * @param payload Full report payload (header + signed report). + * @param parameterPayload ABI-encoded fee metadata. + */ + function verify( + bytes calldata payload, + bytes calldata parameterPayload + ) external payable returns (bytes memory verifierResponse); + + function verifyBulk( + bytes[] calldata payloads, + bytes calldata parameterPayload + ) external payable returns (bytes[] memory verifiedReports); + + function s_feeManager() external view returns (IVerifierFeeManager); + } + + interface IFeeManager { + /** + * @return fee, reward, totalDiscount + */ + function getFeeAndReward( + address subscriber, + bytes memory unverifiedReport, + address quoteAddress + ) external returns (Common.Asset memory, Common.Asset memory, uint256); + + function i_linkAddress() external view returns (address); + + function i_nativeAddress() external view returns (address); + + function i_rewardManager() external view returns (address); + } + + // ──────────────────────────────────────────────────────────────────────────── + // Contract + // ──────────────────────────────────────────────────────────────────────────── + + /** + * @dev This contract implements functionality to verify DataLink reports from + * the API, with payment in LINK tokens. + */ + contract ClientReportsVerifier { + // ----------------- Errors ----------------- + error NothingToWithdraw(); + error NotOwner(address caller); + error InvalidReportVersion(uint16 version); + + // ----------------- Report schemas ----------------- + // Extract schema version from feed ID (first 2 bytes of the feed ID) + /** + * @dev DataLink report schema v3. + * Prices, bids and asks use 8 or 18 decimals depending on the feed. + */ + struct ReportV3 { + bytes32 feedId; + uint32 validFromTimestamp; + uint32 observationsTimestamp; + uint192 nativeFee; + uint192 linkFee; + uint32 expiresAt; + int192 price; + int192 bid; + int192 ask; + } + + /** + * @dev DataLink report schema v4. + */ + struct ReportV4 { + bytes32 feedId; + uint32 validFromTimestamp; + uint32 observationsTimestamp; + uint192 nativeFee; + uint192 linkFee; + uint32 expiresAt; + int192 price; + uint32 marketStatus; + } + + // ----------------- Storage ----------------- + IVerifierProxy public immutable i_verifierProxy; + address private immutable i_owner; + + int192 public lastDecodedPrice; + + // ----------------- Events ----------------- + event DecodedPrice(int192 price); + + // ----------------- Constructor / modifier ----------------- + /** + * @param _verifierProxy Address of the VerifierProxy on the target network. + * Addresses: https://docs.chain.link/datalink/pull-delivery/verifier-proxy-addresses + */ + constructor( + address _verifierProxy + ) { + i_owner = msg.sender; + i_verifierProxy = IVerifierProxy(_verifierProxy); + } + + modifier onlyOwner() { + if (msg.sender != i_owner) revert NotOwner(msg.sender); + _; + } + + // ----------------- Public API ----------------- + + /** + * @notice Verify a DataLink report (schema v3 or v4). + * + * @dev Steps: + * 1. Decode the unverified report to get `reportData`. + * 2. Read the first two bytes → schema version (`0x0003` or `0x0004`). + * - Revert if the version is unsupported. + * 3. Fee handling: + * - Query `s_feeManager()` on the proxy. + * – Non-zero → quote the fee, approve the RewardManager, + * ABI-encode the fee token address for `verify()`. + * – Zero → no FeeManager; skip quoting/approval and pass `""`. + * 4. Call `VerifierProxy.verify()`. + * 5. Decode the verified report into the correct struct and emit the price. + * + * @param unverifiedReport Full payload returned. + * @custom:reverts InvalidReportVersion when schema ≠ v3/v4. + */ + function verifyReport( + bytes memory unverifiedReport + ) external { + // ─── 1. & 2. Extract reportData and schema version ── + (, bytes memory reportData) = abi.decode(unverifiedReport, (bytes32[3], bytes)); + + uint16 reportVersion = (uint16(uint8(reportData[0])) << 8) | uint16(uint8(reportData[1])); + if (reportVersion != 3 && reportVersion != 4) { + revert InvalidReportVersion(reportVersion); + } + + // ─── 3. Fee handling ── + IFeeManager feeManager = IFeeManager(address(i_verifierProxy.s_feeManager())); + + bytes memory parameterPayload; + if (address(feeManager) != address(0)) { + // FeeManager exists — always quote & approve + address feeToken = feeManager.i_linkAddress(); + + (Common.Asset memory fee,,) = feeManager.getFeeAndReward(address(this), reportData, feeToken); + + IERC20(feeToken).approve(feeManager.i_rewardManager(), fee.amount); + parameterPayload = abi.encode(feeToken); + } else { + // No FeeManager deployed on this chain + parameterPayload = bytes(""); + } + + // ─── 4. Verify through the proxy ── + bytes memory verified = i_verifierProxy.verify(unverifiedReport, parameterPayload); + + // ─── 5. Decode & store price ── + if (reportVersion == 3) { + int192 price = abi.decode(verified, (ReportV3)).price; + lastDecodedPrice = price; + emit DecodedPrice(price); + } else { + int192 price = abi.decode(verified, (ReportV4)).price; + lastDecodedPrice = price; + emit DecodedPrice(price); + } + } + + /** + * @notice Withdraw all balance of an ERC-20 token held by this contract. + * @param _beneficiary Address that receives the tokens. + * @param _token ERC-20 token address. + */ + function withdrawToken( + address _beneficiary, + address _token + ) external onlyOwner { + uint256 amount = IERC20(_token).balanceOf(address(this)); + if (amount == 0) revert NothingToWithdraw(); + IERC20(_token).safeTransfer(_beneficiary, amount); + } + } + ``` + 2. Select the `ClientReportsVerifier.sol` contract in the **Solidity Compiler** tab. 3. Compile the contract. @@ -1222,6 +1443,227 @@ For this tutorial on *Arbitrum Sepolia*, fees are required, so you need to fund The example code you deployed has all the interfaces and functions required to verify DataLink reports onchain. +```sol +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import {Common} from "@chainlink/contracts/src/v0.8/llo-feeds/libraries/Common.sol"; +import {IVerifierFeeManager} from "@chainlink/contracts/src/v0.8/llo-feeds/v0.3.0/interfaces/IVerifierFeeManager.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +using SafeERC20 for IERC20; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE FOR DEMONSTRATION PURPOSES. + * DO NOT USE THIS CODE IN PRODUCTION. + * + * This contract can verify Chainlink DataLink reports onchain and pay + * the verification fee in LINK (when required). + * + * - If `VerifierProxy.s_feeManager()` returns a non-zero address, the network + * expects you to interact with that FeeManager for every verification call: + * quote fees, approve the RewardManager, then call `verify()`. + * + * - If `s_feeManager()` returns the zero address, no FeeManager contract has + * been deployed on that chain. In that case there is nothing to quote or pay + * onchain, so the contract skips the fee logic entirely. + * + * The `if (address(feeManager) != address(0))` check below chooses the + * correct path automatically, making the same bytecode usable on any chain. + */ + +// ──────────────────────────────────────────────────────────────────────────── +// Interfaces +// ──────────────────────────────────────────────────────────────────────────── + +interface IVerifierProxy { + /** + * @notice Route a report to the correct verifier and (optionally) bill fees. + * @param payload Full report payload (header + signed report). + * @param parameterPayload ABI-encoded fee metadata. + */ + function verify( + bytes calldata payload, + bytes calldata parameterPayload + ) external payable returns (bytes memory verifierResponse); + + function verifyBulk( + bytes[] calldata payloads, + bytes calldata parameterPayload + ) external payable returns (bytes[] memory verifiedReports); + + function s_feeManager() external view returns (IVerifierFeeManager); +} + +interface IFeeManager { + /** + * @return fee, reward, totalDiscount + */ + function getFeeAndReward( + address subscriber, + bytes memory unverifiedReport, + address quoteAddress + ) external returns (Common.Asset memory, Common.Asset memory, uint256); + + function i_linkAddress() external view returns (address); + + function i_nativeAddress() external view returns (address); + + function i_rewardManager() external view returns (address); +} + +// ──────────────────────────────────────────────────────────────────────────── +// Contract +// ──────────────────────────────────────────────────────────────────────────── + +/** + * @dev This contract implements functionality to verify DataLink reports from + * the API, with payment in LINK tokens. + */ +contract ClientReportsVerifier { + // ----------------- Errors ----------------- + error NothingToWithdraw(); + error NotOwner(address caller); + error InvalidReportVersion(uint16 version); + + // ----------------- Report schemas ----------------- + // Extract schema version from feed ID (first 2 bytes of the feed ID) + /** + * @dev DataLink report schema v3. + * Prices, bids and asks use 8 or 18 decimals depending on the feed. + */ + struct ReportV3 { + bytes32 feedId; + uint32 validFromTimestamp; + uint32 observationsTimestamp; + uint192 nativeFee; + uint192 linkFee; + uint32 expiresAt; + int192 price; + int192 bid; + int192 ask; + } + + /** + * @dev DataLink report schema v4. + */ + struct ReportV4 { + bytes32 feedId; + uint32 validFromTimestamp; + uint32 observationsTimestamp; + uint192 nativeFee; + uint192 linkFee; + uint32 expiresAt; + int192 price; + uint32 marketStatus; + } + + // ----------------- Storage ----------------- + IVerifierProxy public immutable i_verifierProxy; + address private immutable i_owner; + + int192 public lastDecodedPrice; + + // ----------------- Events ----------------- + event DecodedPrice(int192 price); + + // ----------------- Constructor / modifier ----------------- + /** + * @param _verifierProxy Address of the VerifierProxy on the target network. + * Addresses: https://docs.chain.link/datalink/pull-delivery/verifier-proxy-addresses + */ + constructor( + address _verifierProxy + ) { + i_owner = msg.sender; + i_verifierProxy = IVerifierProxy(_verifierProxy); + } + + modifier onlyOwner() { + if (msg.sender != i_owner) revert NotOwner(msg.sender); + _; + } + + // ----------------- Public API ----------------- + + /** + * @notice Verify a DataLink report (schema v3 or v4). + * + * @dev Steps: + * 1. Decode the unverified report to get `reportData`. + * 2. Read the first two bytes → schema version (`0x0003` or `0x0004`). + * - Revert if the version is unsupported. + * 3. Fee handling: + * - Query `s_feeManager()` on the proxy. + * – Non-zero → quote the fee, approve the RewardManager, + * ABI-encode the fee token address for `verify()`. + * – Zero → no FeeManager; skip quoting/approval and pass `""`. + * 4. Call `VerifierProxy.verify()`. + * 5. Decode the verified report into the correct struct and emit the price. + * + * @param unverifiedReport Full payload returned. + * @custom:reverts InvalidReportVersion when schema ≠ v3/v4. + */ + function verifyReport( + bytes memory unverifiedReport + ) external { + // ─── 1. & 2. Extract reportData and schema version ── + (, bytes memory reportData) = abi.decode(unverifiedReport, (bytes32[3], bytes)); + + uint16 reportVersion = (uint16(uint8(reportData[0])) << 8) | uint16(uint8(reportData[1])); + if (reportVersion != 3 && reportVersion != 4) { + revert InvalidReportVersion(reportVersion); + } + + // ─── 3. Fee handling ── + IFeeManager feeManager = IFeeManager(address(i_verifierProxy.s_feeManager())); + + bytes memory parameterPayload; + if (address(feeManager) != address(0)) { + // FeeManager exists — always quote & approve + address feeToken = feeManager.i_linkAddress(); + + (Common.Asset memory fee,,) = feeManager.getFeeAndReward(address(this), reportData, feeToken); + + IERC20(feeToken).approve(feeManager.i_rewardManager(), fee.amount); + parameterPayload = abi.encode(feeToken); + } else { + // No FeeManager deployed on this chain + parameterPayload = bytes(""); + } + + // ─── 4. Verify through the proxy ── + bytes memory verified = i_verifierProxy.verify(unverifiedReport, parameterPayload); + + // ─── 5. Decode & store price ── + if (reportVersion == 3) { + int192 price = abi.decode(verified, (ReportV3)).price; + lastDecodedPrice = price; + emit DecodedPrice(price); + } else { + int192 price = abi.decode(verified, (ReportV4)).price; + lastDecodedPrice = price; + emit DecodedPrice(price); + } + } + + /** + * @notice Withdraw all balance of an ERC-20 token held by this contract. + * @param _beneficiary Address that receives the tokens. + * @param _token ERC-20 token address. + */ + function withdrawToken( + address _beneficiary, + address _token + ) external onlyOwner { + uint256 amount = IERC20(_token).balanceOf(address(this)); + if (amount == 0) revert NothingToWithdraw(); + IERC20(_token).safeTransfer(_beneficiary, amount); + } +} +``` + ### Initializing the contract When deploying the contract, you define the verifier proxy address for the feed you want to read from. You can find this address on the [Verifier Proxy Addresses](/datalink/pull-delivery/verifier-proxy-addresses) page. The verifier proxy address provides functions that are required for this example: diff --git a/src/content/getting-started/llms-full.txt b/src/content/getting-started/llms-full.txt index efe408fcceb..19d0a8d9ba2 100644 --- a/src/content/getting-started/llms-full.txt +++ b/src/content/getting-started/llms-full.txt @@ -29,6 +29,32 @@ Some networks are not EVM-compatible and use languages other than Solidity for s The structure of a smart contract is similar to that of a class in Javascript, with a few differences. For example, the following `HelloWorld` contract is a simple smart contract that stores a single variable and includes a function to update the value of that variable. +```sol +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.7; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract HelloWorld { + string public message; + + constructor( + string memory initialMessage + ) { + message = initialMessage; + } + + function updateMessage( + string memory newMessage + ) public { + message = newMessage; + } +} +``` + ### Solidity versions The first thing that every Solidity file must have is the Solidity version definition. The `HelloWorld.sol` contract uses version `0.8.7`, which is defined in the contract as `pragma solidity 0.8.7;` @@ -102,6 +128,38 @@ Functions use visibility modifiers to define the access level. Learn more about An **interface** is another concept that is familiar to programmers of other languages. Interfaces define functions without their implementation, which leaves inheriting contracts to define the actual implementation themselves. This makes it easier to know what functions to call in a contract. Here's an example of an interface: +```sol +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.7; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +interface numberComparison { + function isSameNum( + uint256 a, + uint256 b + ) external view returns (bool); +} + +contract Test is numberComparison { + constructor() {} + + function isSameNum( + uint256 a, + uint256 b + ) external pure override returns (bool) { + if (a == b) { + return true; + } else { + return false; + } + } +} +``` + For this example, `override` is necessary in the `Test` contract function because it overrides the base function contained in the `numberComparison` interface. The contract uses `pure` instead of `view` because the `isSameNum` function in the `Test` contract does not return a storage variable. ## What does "deploying" mean? diff --git a/src/content/vrf/llms-full.txt b/src/content/vrf/llms-full.txt index ffabc17a636..86ee6c1fc8e 100644 --- a/src/content/vrf/llms-full.txt +++ b/src/content/vrf/llms-full.txt @@ -373,6 +373,182 @@ contract VRFD20 is VRFConsumerBaseV2Plus { ``` +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * @notice A Chainlink VRF consumer which uses randomness to mimic the rolling + * of a 20 sided dice + */ + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract VRFD20 is VRFConsumerBaseV2Plus { + uint256 private constant ROLL_IN_PROGRESS = 42; + + // Your subscription ID. + uint256 public s_subscriptionId; + + // Sepolia coordinator. For other networks, + // see https://docs.chain.link/vrf/v2-5/supported-networks#configurations + address public vrfCoordinator = 0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/vrf/v2-5/supported-networks#configurations + bytes32 public s_keyHash = 0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 40,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 40_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 1 random value in one request. + // Cannot exceed VRFCoordinatorV2_5.MAX_NUM_WORDS. + uint32 public numWords = 1; + + // map rollers to requestIds + mapping(uint256 => address) private s_rollers; + // map vrf results to rollers + mapping(address => uint256) private s_results; + + event DiceRolled(uint256 indexed requestId, address indexed roller); + event DiceLanded(uint256 indexed requestId, uint256 indexed result); + + /** + * @notice Constructor inherits VRFConsumerBaseV2Plus + * + * @dev NETWORK: Sepolia + * + * @param subscriptionId subscription ID that this consumer contract can use + */ + constructor( + uint256 subscriptionId + ) VRFConsumerBaseV2Plus(vrfCoordinator) { + s_subscriptionId = subscriptionId; + } + + /** + * @notice Requests randomness + * @dev Warning: if the VRF response is delayed, avoid calling requestRandomness repeatedly + * as that would give miners/VRF operators latitude about which VRF response arrives first. + * @dev You must review your implementation details with extreme care. + * + * @param roller address of the roller + */ + function rollDice( + address roller + ) public onlyOwner returns (uint256 requestId) { + require(s_results[roller] == 0, "Already rolled"); + // Will revert if subscription is not set and funded. + requestId = s_vrfCoordinator.requestRandomWords( + VRFV2PlusClient.RandomWordsRequest({ + keyHash: s_keyHash, + subId: s_subscriptionId, + requestConfirmations: requestConfirmations, + callbackGasLimit: callbackGasLimit, + numWords: numWords, + extraArgs: VRFV2PlusClient._argsToBytes( + // Set nativePayment to true to pay for VRF requests with Sepolia ETH instead of LINK + VRFV2PlusClient.ExtraArgsV1({nativePayment: false}) + ) + }) + ); + + s_rollers[requestId] = roller; + s_results[roller] = ROLL_IN_PROGRESS; + emit DiceRolled(requestId, roller); + } + + /** + * @notice Callback function used by VRF Coordinator to return the random number to this contract. + * + * @dev Some action on the contract state should be taken here, like storing the result. + * @dev WARNING: take care to avoid having multiple VRF requests in flight if their order of arrival would result + * in contract states with different outcomes. Otherwise miners or the VRF operator would could take advantage + * by controlling the order. + * @dev The VRF Coordinator will only send this function verified responses, and the parent VRFConsumerBaseV2 + * contract ensures that this method only receives randomness from the designated VRFCoordinator. + * + * @param requestId uint256 + * @param randomWords uint256[] The random result returned by the oracle. + */ + function fulfillRandomWords( + uint256 requestId, + uint256[] calldata randomWords + ) internal override { + uint256 d20Value = (randomWords[0] % 20) + 1; + s_results[s_rollers[requestId]] = d20Value; + emit DiceLanded(requestId, d20Value); + } + + /** + * @notice Get the house assigned to the player once the address has rolled + * @param player address + * @return house as a string + */ + function house( + address player + ) public view returns (string memory) { + require(s_results[player] != 0, "Dice not rolled"); + require(s_results[player] != ROLL_IN_PROGRESS, "Roll in progress"); + return _getHouseName(s_results[player]); + } + + /** + * @notice Get the house name from the id + * @param id uint256 + * @return house name string + */ + function _getHouseName( + uint256 id + ) private pure returns (string memory) { + string[20] memory houseNames = [ + "Targaryen", + "Lannister", + "Stark", + "Tyrell", + "Baratheon", + "Martell", + "Tully", + "Bolton", + "Greyjoy", + "Arryn", + "Frey", + "Mormont", + "Tarley", + "Dayne", + "Umber", + "Valeryon", + "Manderly", + "Clegane", + "Glover", + "Karstark" + ]; + return houseNames[id - 1]; + } +} +``` + You have now completed all necessary functions to generate randomness and assign the user a *Game of Thrones* house. We've added a few helper functions in there to make using the contract easier and more flexible. You can deploy and interact with the complete contract in Remix. ## How do I deploy to testnet? @@ -473,6 +649,128 @@ If using subscriptions, [create and fund a new VRF v2.5 subscription](/vrf/v2-5/ For direct funding, deploy the [`DirectFundingConsumer`](/samples/VRF/v2-5/DirectFundingConsumer.sol) example: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.20; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {VRFV2PlusWrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapperConsumerBase.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract DirectFundingConsumer is VRFV2PlusWrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 public numWords = 2; + + // Address LINK - hardcoded for Sepolia + address public linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address public wrapperAddress = 0x195f15F2d49d693cE265b4fB0fdDbE15b1850Cc1; + + constructor() ConfirmedOwner(msg.sender) VRFV2PlusWrapperConsumerBase(wrapperAddress) {} + + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256) { + bytes memory extraArgs = + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})); + uint256 requestId; + uint256 reqPrice; + if (enableNativePayment) { + (requestId, reqPrice) = requestRandomnessPayInNative(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } else { + (requestId, reqPrice) = requestRandomness(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } + s_requests[requestId] = RequestStatus({paid: reqPrice, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + + /// @notice withdrawNative withdraws the amount specified in amount to the owner + /// @param amount the amount to withdraw, in wei + function withdrawNative( + uint256 amount + ) external onlyOwner { + (bool success,) = payable(owner()).call{value: amount}(""); + // solhint-disable-next-line gas-custom-errors + require(success, "withdrawNative failed"); + } + + event Received(address, uint256); + + receive() external payable { + emit Received(msg.sender, msg.value); + } +} +``` + ### Update your code To modify your existing smart contract code to work with VRF v2.5, complete the following changes: @@ -486,6 +784,118 @@ The example `SubscriptionConsumer` contract shows the migration steps above, app Open the full example `SubscriptionConsumer` contract: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.20; + +import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract SubscriptionConsumer is VRFConsumerBaseV2Plus { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // Your subscription ID. + uint256 public s_subscriptionId; + + // Past request IDs. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/vrf/v2-5/supported-networks + bytes32 public keyHash = 0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2_5.MAX_NUM_WORDS. + uint32 public numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B + */ + constructor( + uint256 subscriptionId + ) VRFConsumerBaseV2Plus(0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B) { + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + // @param enableNativePayment: Set to `true` to enable payment in native tokens, or + // `false` to pay in LINK + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256 requestId) { + // Will revert if subscription is not set and funded. + requestId = s_vrfCoordinator.requestRandomWords( + VRFV2PlusClient.RandomWordsRequest({ + keyHash: keyHash, + subId: s_subscriptionId, + requestConfirmations: requestConfirmations, + callbackGasLimit: callbackGasLimit, + numWords: numWords, + extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})) + }) + ); + s_requests[requestId] = RequestStatus({randomWords: new uint256[](0), exists: true, fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] calldata _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } +} +``` + Compare the major changes between V2.5 and V2: @@ -495,6 +905,128 @@ The example `DirectFundingConsumer` contract shows the migration steps above, ap Open the full example `DirectFundingConsumer` contract: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.20; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {VRFV2PlusWrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapperConsumerBase.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract DirectFundingConsumer is VRFV2PlusWrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 public numWords = 2; + + // Address LINK - hardcoded for Sepolia + address public linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address public wrapperAddress = 0x195f15F2d49d693cE265b4fB0fdDbE15b1850Cc1; + + constructor() ConfirmedOwner(msg.sender) VRFV2PlusWrapperConsumerBase(wrapperAddress) {} + + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256) { + bytes memory extraArgs = + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})); + uint256 requestId; + uint256 reqPrice; + if (enableNativePayment) { + (requestId, reqPrice) = requestRandomnessPayInNative(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } else { + (requestId, reqPrice) = requestRandomness(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } + s_requests[requestId] = RequestStatus({paid: reqPrice, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + + /// @notice withdrawNative withdraws the amount specified in amount to the owner + /// @param amount the amount to withdraw, in wei + function withdrawNative( + uint256 amount + ) external onlyOwner { + (bool success,) = payable(owner()).call{value: amount}(""); + // solhint-disable-next-line gas-custom-errors + require(success, "withdrawNative failed"); + } + + event Received(address, uint256); + + receive() external payable { + emit Received(msg.sender, msg.value); + } +} +``` + Compare the major changes between V2.5 and V2: --- @@ -545,6 +1077,128 @@ If using subscriptions, [create and fund a new VRF v2.5 subscription](/vrf/v2-5/ For direct funding, deploy the [`DirectFundingConsumer`](/samples/VRF/v2-5/DirectFundingConsumer.sol) example: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.20; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {VRFV2PlusWrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapperConsumerBase.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract DirectFundingConsumer is VRFV2PlusWrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 public numWords = 2; + + // Address LINK - hardcoded for Sepolia + address public linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address public wrapperAddress = 0x195f15F2d49d693cE265b4fB0fdDbE15b1850Cc1; + + constructor() ConfirmedOwner(msg.sender) VRFV2PlusWrapperConsumerBase(wrapperAddress) {} + + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256) { + bytes memory extraArgs = + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})); + uint256 requestId; + uint256 reqPrice; + if (enableNativePayment) { + (requestId, reqPrice) = requestRandomnessPayInNative(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } else { + (requestId, reqPrice) = requestRandomness(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } + s_requests[requestId] = RequestStatus({paid: reqPrice, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + + /// @notice withdrawNative withdraws the amount specified in amount to the owner + /// @param amount the amount to withdraw, in wei + function withdrawNative( + uint256 amount + ) external onlyOwner { + (bool success,) = payable(owner()).call{value: amount}(""); + // solhint-disable-next-line gas-custom-errors + require(success, "withdrawNative failed"); + } + + event Received(address, uint256); + + receive() external payable { + emit Received(msg.sender, msg.value); + } +} +``` + ### Update your code To modify your existing smart contract code to work with VRF v2.5, complete the following changes: @@ -556,8 +1210,242 @@ View example code for both VRF 2.5 subscription and direct funding: Open the full example `SubscriptionConsumer` contract: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.20; + +import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract SubscriptionConsumer is VRFConsumerBaseV2Plus { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // Your subscription ID. + uint256 public s_subscriptionId; + + // Past request IDs. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/vrf/v2-5/supported-networks + bytes32 public keyHash = 0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2_5.MAX_NUM_WORDS. + uint32 public numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B + */ + constructor( + uint256 subscriptionId + ) VRFConsumerBaseV2Plus(0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B) { + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + // @param enableNativePayment: Set to `true` to enable payment in native tokens, or + // `false` to pay in LINK + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256 requestId) { + // Will revert if subscription is not set and funded. + requestId = s_vrfCoordinator.requestRandomWords( + VRFV2PlusClient.RandomWordsRequest({ + keyHash: keyHash, + subId: s_subscriptionId, + requestConfirmations: requestConfirmations, + callbackGasLimit: callbackGasLimit, + numWords: numWords, + extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})) + }) + ); + s_requests[requestId] = RequestStatus({randomWords: new uint256[](0), exists: true, fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] calldata _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } +} +``` + Open the full example `DirectFundingConsumer` contract: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.20; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {VRFV2PlusWrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapperConsumerBase.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract DirectFundingConsumer is VRFV2PlusWrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 public numWords = 2; + + // Address LINK - hardcoded for Sepolia + address public linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address public wrapperAddress = 0x195f15F2d49d693cE265b4fB0fdDbE15b1850Cc1; + + constructor() ConfirmedOwner(msg.sender) VRFV2PlusWrapperConsumerBase(wrapperAddress) {} + + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256) { + bytes memory extraArgs = + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})); + uint256 requestId; + uint256 reqPrice; + if (enableNativePayment) { + (requestId, reqPrice) = requestRandomnessPayInNative(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } else { + (requestId, reqPrice) = requestRandomness(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } + s_requests[requestId] = RequestStatus({paid: reqPrice, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + + /// @notice withdrawNative withdraws the amount specified in amount to the owner + /// @param amount the amount to withdraw, in wei + function withdrawNative( + uint256 amount + ) external onlyOwner { + (bool success,) = payable(owner()).call{value: amount}(""); + // solhint-disable-next-line gas-custom-errors + require(success, "withdrawNative failed"); + } + + event Received(address, uint256); + + receive() external payable { + emit Received(msg.sender, msg.value); + } +} +``` + --- # Supported Networks @@ -1383,6 +2271,118 @@ Build and deploy the contract on Sepolia. 1. Open the [SubscriptionConsumer.sol](https://remix.ethereum.org/#url=https://docs.chain.link/samples/VRF/v2-5/SubscriptionConsumer.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + // An example of a consumer contract that relies on a subscription for funding. + pragma solidity ^0.8.20; + + import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol"; + import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + + /** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + contract SubscriptionConsumer is VRFConsumerBaseV2Plus { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // Your subscription ID. + uint256 public s_subscriptionId; + + // Past request IDs. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/vrf/v2-5/supported-networks + bytes32 public keyHash = 0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2_5.MAX_NUM_WORDS. + uint32 public numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B + */ + constructor( + uint256 subscriptionId + ) VRFConsumerBaseV2Plus(0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B) { + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + // @param enableNativePayment: Set to `true` to enable payment in native tokens, or + // `false` to pay in LINK + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256 requestId) { + // Will revert if subscription is not set and funded. + requestId = s_vrfCoordinator.requestRandomWords( + VRFV2PlusClient.RandomWordsRequest({ + keyHash: keyHash, + subId: s_subscriptionId, + requestConfirmations: requestConfirmations, + callbackGasLimit: callbackGasLimit, + numWords: numWords, + extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})) + }) + ); + s_requests[requestId] = RequestStatus({randomWords: new uint256[](0), exists: true, fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] calldata _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } + } + ``` + 2. On the **Compile** tab in Remix, compile the `SubscriptionConsumer.sol` contract. 3. Configure your deployment. On the **Deploy** tab in Remix, select the **Injected Provider** environment, select the `SubscriptionConsumer` contract from the contract list, and specify your `subscriptionId` so the constructor can set it. @@ -1435,6 +2435,118 @@ You deployed a simple contract that can request and receive random values from C In this example, your MetaMask wallet is the subscription owner and you created a consuming contract to use that subscription. The consuming contract uses static configuration parameters. +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.20; + +import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract SubscriptionConsumer is VRFConsumerBaseV2Plus { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // Your subscription ID. + uint256 public s_subscriptionId; + + // Past request IDs. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/vrf/v2-5/supported-networks + bytes32 public keyHash = 0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2_5.MAX_NUM_WORDS. + uint32 public numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B + */ + constructor( + uint256 subscriptionId + ) VRFConsumerBaseV2Plus(0x9DdfaCa8183c41ad55329BdeeD9F6A8d53168B1B) { + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + // @param enableNativePayment: Set to `true` to enable payment in native tokens, or + // `false` to pay in LINK + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256 requestId) { + // Will revert if subscription is not set and funded. + requestId = s_vrfCoordinator.requestRandomWords( + VRFV2PlusClient.RandomWordsRequest({ + keyHash: keyHash, + subId: s_subscriptionId, + requestConfirmations: requestConfirmations, + callbackGasLimit: callbackGasLimit, + numWords: numWords, + extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})) + }) + ); + s_requests[requestId] = RequestStatus({randomWords: new uint256[](0), exists: true, fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] calldata _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } +} +``` + The parameters define how your requests will be processed. You can find the values for your network in the [Configuration](/vrf/v2-5/supported-networks) page. - `uint256 s_subscriptionId`: The subscription ID that this contract uses for funding requests. @@ -1506,8 +2618,113 @@ For local testing, use the default "Remix VM" environment. Open *VRFv2_5Consumer* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.20; + +import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/** + * @title The RandomNumberConsumerV2_5 contract + * @notice A contract that gets random values from Chainlink VRF V2_5 + */ +contract RandomNumberConsumerV2_5 is VRFConsumerBaseV2Plus { + // Your subscription ID. + uint256 immutable s_subscriptionId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf-contracts/#configurations + bytes32 immutable s_keyHash; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 constant CALLBACK_GAS_LIMIT = 100_000; + + // The default is 3, but you can set this higher. + uint16 constant REQUEST_CONFIRMATIONS = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2_5.MAX_NUM_WORDS. + uint32 constant NUM_WORDS = 2; + + uint256[] public s_randomWords; + uint256 public s_requestId; + + event ReturnedRandomness(uint256[] randomWords); + + /** + * @notice Constructor inherits VRFConsumerBaseV2Plus + * + * @param subscriptionId - the subscription ID that this contract uses for funding requests + * @param vrfCoordinator - coordinator, check https://docs.chain.link/vrf/v2-5/supported-networks + * @param keyHash - the gas lane to use, which specifies the maximum gas price to bump to + */ + constructor( + uint256 subscriptionId, + address vrfCoordinator, + bytes32 keyHash + ) VRFConsumerBaseV2Plus(vrfCoordinator) { + s_keyHash = keyHash; + s_subscriptionId = subscriptionId; + } + + /** + * @notice Requests randomness + * Assumes the subscription is funded sufficiently; "Words" refers to unit of data in Computer Science + */ + function requestRandomWords() external onlyOwner { + // Will revert if subscription is not set and funded. + s_requestId = s_vrfCoordinator.requestRandomWords( + VRFV2PlusClient.RandomWordsRequest({ + keyHash: s_keyHash, + subId: s_subscriptionId, + requestConfirmations: REQUEST_CONFIRMATIONS, + callbackGasLimit: CALLBACK_GAS_LIMIT, + numWords: NUM_WORDS, + extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: false})) + }) + ); + } + + /** + * @notice Callback function used by VRF Coordinator + * + * @param - id of the request + * @param randomWords - array of random results from VRF Coordinator + */ + function fulfillRandomWords( + uint256, + /* requestId */ + uint256[] calldata randomWords + ) internal override { + s_randomWords = randomWords; + emit ReturnedRandomness(randomWords); + } +} +``` + Open *VRFCoordinatorV2_5Mock* in Remix: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@chainlink/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2_5Mock.sol"; +``` + On the *Solidity Compiler* tab, expand the *Advanced Configurations* section and check the *Enable optimization* box before you compile the *VRFCoordinatorV2_5Mock* contract: Your Remix IDE file explorer should display *VRFCoordinatorV2_5Mock.sol* and *VRFv2_5Consumer.sol*: @@ -1630,6 +2847,128 @@ Build and deploy the contract on Sepolia. 1. Open the [`DirectFundingConsumer.sol` contract](https://remix.ethereum.org/#url=https://docs.chain.link/samples/VRF/v2-5/DirectFundingConsumer.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + // An example of a consumer contract that directly pays for each request. + pragma solidity ^0.8.20; + + import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; + import {VRFV2PlusWrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapperConsumerBase.sol"; + import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + + /** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + contract DirectFundingConsumer is VRFV2PlusWrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 public numWords = 2; + + // Address LINK - hardcoded for Sepolia + address public linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address public wrapperAddress = 0x195f15F2d49d693cE265b4fB0fdDbE15b1850Cc1; + + constructor() ConfirmedOwner(msg.sender) VRFV2PlusWrapperConsumerBase(wrapperAddress) {} + + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256) { + bytes memory extraArgs = + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})); + uint256 requestId; + uint256 reqPrice; + if (enableNativePayment) { + (requestId, reqPrice) = requestRandomnessPayInNative(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } else { + (requestId, reqPrice) = requestRandomness(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } + s_requests[requestId] = RequestStatus({paid: reqPrice, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + + /// @notice withdrawNative withdraws the amount specified in amount to the owner + /// @param amount the amount to withdraw, in wei + function withdrawNative( + uint256 amount + ) external onlyOwner { + (bool success,) = payable(owner()).call{value: amount}(""); + // solhint-disable-next-line gas-custom-errors + require(success, "withdrawNative failed"); + } + + event Received(address, uint256); + + receive() external payable { + emit Received(msg.sender, msg.value); + } + } + ``` + 2. On the **Compile** tab in Remix, compile the `DirectFundingConsumer` contract. 3. Configure your deployment. On the **Deploy** tab in Remix, select the **Injected Web3 Environment** and select the `DirectFundingConsumer` contract from the contract list. @@ -1670,6 +3009,128 @@ The deployed contract requests random values from Chainlink VRF, receives those In this example, the consuming contract uses static configuration parameters. +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.20; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {VRFV2PlusWrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapperConsumerBase.sol"; +import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract DirectFundingConsumer is VRFV2PlusWrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 public callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 public requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 public numWords = 2; + + // Address LINK - hardcoded for Sepolia + address public linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address public wrapperAddress = 0x195f15F2d49d693cE265b4fB0fdDbE15b1850Cc1; + + constructor() ConfirmedOwner(msg.sender) VRFV2PlusWrapperConsumerBase(wrapperAddress) {} + + function requestRandomWords( + bool enableNativePayment + ) external onlyOwner returns (uint256) { + bytes memory extraArgs = + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: enableNativePayment})); + uint256 requestId; + uint256 reqPrice; + if (enableNativePayment) { + (requestId, reqPrice) = requestRandomnessPayInNative(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } else { + (requestId, reqPrice) = requestRandomness(callbackGasLimit, requestConfirmations, numWords, extraArgs); + } + s_requests[requestId] = RequestStatus({paid: reqPrice, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + + /// @notice withdrawNative withdraws the amount specified in amount to the owner + /// @param amount the amount to withdraw, in wei + function withdrawNative( + uint256 amount + ) external onlyOwner { + (bool success,) = payable(owner()).call{value: amount}(""); + // solhint-disable-next-line gas-custom-errors + require(success, "withdrawNative failed"); + } + + event Received(address, uint256); + + receive() external payable { + emit Received(msg.sender, msg.value); + } +} +``` + The parameters define how your requests will be processed. You can find the values for your network in the [Supported networks](/vrf/v2-5/supported-networks) page. - `uint32 callbackGasLimit`: The limit for how much gas to use for the callback request to your contract's `fulfillRandomWords()` function. It must be less than the `maxGasLimit` limit on the coordinator contract minus the `wrapperGasOverhead`. See the [VRF v2.5 Direct funding limits](/vrf/v2-5/overview/direct-funding#limits) for more details. Adjust this value for larger requests depending on how your `fulfillRandomWords()` function processes and stores the received random values. If your `callbackGasLimit` is not sufficient, the callback will fail and your consuming contract is still charged for the work done to generate your requested random values. @@ -2096,6 +3557,71 @@ Note, the below values have to be configured correctly for VRF requests to work. testnet LINK](/resources/acquire-link) and [Fund your contract](/resources/fund-your-contract)**. </Aside> +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import {VRFConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBase.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ +contract RandomNumberConsumer is VRFConsumerBase { + event RequestFulfilled(bytes32 requestId, uint256 randomness); + + bytes32 internal keyHash; + uint256 internal fee; + uint256 public randomResult; + + /** + * Constructor inherits VRFConsumerBase + * + * Network: Sepolia + * Chainlink VRF Coordinator address: 0x271682DEB8C4E0901D1a1550aD2e64D568E69909 + * LINK token address: 0x779877A7B0D9E8603169DdbD7836e478b4624789 + * Key Hash: 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c + */ + constructor() + VRFConsumerBase( + 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625, // VRF Coordinator + 0x779877A7B0D9E8603169DdbD7836e478b4624789 // LINK Token + ) + { + keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + fee = 0.1 * 10 ** 18; // 0.1 LINK (Varies by network) + } + + /** + * Requests randomness + */ + function getRandomNumber() public returns (bytes32 requestId) { + require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK - fill contract with faucet"); + return requestRandomness(keyHash, fee); + } + + /** + * Callback function used by VRF Coordinator + */ + function fulfillRandomness( + bytes32 requestId, + uint256 randomness + ) internal override { + randomResult = randomness; + emit RequestFulfilled(requestId, randomness); + } + + // function withdrawLink() external {} - Implement a withdraw function to avoid locking your LINK in the contract +} +``` + <Aside type="note" title="Maximum Gas for Callback"> If your `fulfillRandomness` function uses more than 200k gas, the transaction will fail. </Aside> @@ -2346,38 +3872,158 @@ function fulfillRandomWords( } ``` -You could also map the `requestId` to an index to keep track of the order in which a request was made. +You could also map the `requestId` to an index to keep track of the order in which a request was made. + + +```solidity +mapping(uint256 => uint256) s_requestIdToRequestIndex; +mapping(uint256 => uint256[]) public s_requestIndexToRandomWords; +uint256 public requestCounter; + +function requestRandomWords() external onlyOwner { + uint256 requestId = COORDINATOR.requestRandomWords( + keyHash, + s_subscriptionId, + requestConfirmations, + callbackGasLimit, + numWords + ); + s_requestIdToRequestIndex[requestId] = requestCounter; + requestCounter += 1; +} + +function fulfillRandomWords( + uint256 requestId, + uint256[] memory randomWords + ) internal override { + uint256 requestNumber = s_requestIdToRequestIndex[requestId]; + s_requestIndexToRandomWords[requestNumber] = randomWords; +} +``` + +## Processing VRF responses through different execution paths + +If you want to process VRF responses depending on predetermined conditions, you can create an `enum`. When requesting for randomness, map each `requestId` to an enum. This way, you can handle different execution paths in `fulfillRandomWords`. See the following example: + +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +// It shows how to setup multiple execution paths for handling a response. +pragma solidity ^0.8.7; + +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract VRFv2MultiplePaths is VRFConsumerBaseV2 { + VRFCoordinatorV2Interface COORDINATOR; + + // Your subscription ID. + uint64 s_subscriptionId; + + // Sepolia coordinator. For other networks, + // see https://docs.chain.link/docs/vrf/v2/supported-networks/#configurations + address vrfCoordinator = 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf/v2/supported-networks/#configurations + bytes32 keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + + uint32 callbackGasLimit = 100_000; + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; -```solidity -mapping(uint256 => uint256) s_requestIdToRequestIndex; -mapping(uint256 => uint256[]) public s_requestIndexToRandomWords; -uint256 public requestCounter; + // For this example, retrieve 1 random value in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 numWords = 1; -function requestRandomWords() external onlyOwner { - uint256 requestId = COORDINATOR.requestRandomWords( - keyHash, - s_subscriptionId, - requestConfirmations, - callbackGasLimit, - numWords - ); - s_requestIdToRequestIndex[requestId] = requestCounter; - requestCounter += 1; -} + enum Variable { + A, + B, + C + } -function fulfillRandomWords( + uint256 public variableA; + uint256 public variableB; + uint256 public variableC; + + mapping(uint256 => Variable) public requests; + + // events + event FulfilledA(uint256 requestId, uint256 value); + event FulfilledB(uint256 requestId, uint256 value); + event FulfilledC(uint256 requestId, uint256 value); + + constructor( + uint64 subscriptionId + ) VRFConsumerBaseV2(vrfCoordinator) { + COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); + s_subscriptionId = subscriptionId; + } + + function updateVariable( + uint256 input + ) public { + uint256 requestId = + COORDINATOR.requestRandomWords(keyHash, s_subscriptionId, requestConfirmations, callbackGasLimit, numWords); + + if (input % 2 == 0) { + requests[requestId] = Variable.A; + } else if (input % 3 == 0) { + requests[requestId] = Variable.B; + } else { + requests[requestId] = Variable.C; + } + } + + function fulfillRandomWords( uint256 requestId, uint256[] memory randomWords ) internal override { - uint256 requestNumber = s_requestIdToRequestIndex[requestId]; - s_requestIndexToRandomWords[requestNumber] = randomWords; -} -``` + Variable variable = requests[requestId]; + if (variable == Variable.A) { + fulfillA(requestId, randomWords[0]); + } else if (variable == Variable.B) { + fulfillB(requestId, randomWords[0]); + } else if (variable == Variable.C) { + fulfillC(requestId, randomWords[0]); + } + } -## Processing VRF responses through different execution paths + function fulfillA( + uint256 requestId, + uint256 randomWord + ) private { + // execution path A + variableA = randomWord; + emit FulfilledA(requestId, randomWord); + } -If you want to process VRF responses depending on predetermined conditions, you can create an `enum`. When requesting for randomness, map each `requestId` to an enum. This way, you can handle different execution paths in `fulfillRandomWords`. See the following example: + function fulfillB( + uint256 requestId, + uint256 randomWord + ) private { + // execution path B + variableB = randomWord; + emit FulfilledB(requestId, randomWord); + } + + function fulfillC( + uint256 requestId, + uint256 randomWord + ) private { + // execution path C + variableC = randomWord; + emit FulfilledC(requestId, randomWord); + } +} +``` --- @@ -2412,6 +4058,104 @@ Build and deploy the contract on Sepolia. 1. Open the [`VRFv2DirectFundingConsumer.sol` contract](https://remix.ethereum.org/#url=https://docs.chain.link/samples/VRF/VRFv2DirectFundingConsumer.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + // An example of a consumer contract that directly pays for each request. + pragma solidity ^0.8.7; + + import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + + import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; + import {VRFV2WrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol"; + + /** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + contract VRFv2DirectFundingConsumer is VRFV2WrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 numWords = 2; + + // Address LINK - hardcoded for Sepolia + address linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address wrapperAddress = 0xab18414CD93297B0d12ac29E63Ca20f515b3DB46; + + constructor() ConfirmedOwner(msg.sender) VRFV2WrapperConsumerBase(linkAddress, wrapperAddress) {} + + function requestRandomWords() external onlyOwner returns (uint256 requestId) { + requestId = requestRandomness(callbackGasLimit, requestConfirmations, numWords); + s_requests[requestId] = RequestStatus({ + paid: VRF_V2_WRAPPER.calculateRequestPrice(callbackGasLimit), randomWords: new uint256[](0), fulfilled: false + }); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } + } + ``` + 2. On the **Compile** tab in Remix, compile the `VRFv2DirectFundingConsumer` contract. 3. Configure your deployment. On the **Deploy** tab in Remix, select the **Injected Web3 Environment** and select the `VRFv2DirectFundingConsumer` contract from the contract list. @@ -2463,6 +4207,104 @@ The deployed contract requests random values from Chainlink VRF, receives those In this example, the consuming contract uses static configuration parameters. +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.7; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; +import {VRFV2WrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract VRFv2DirectFundingConsumer is VRFV2WrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + uint32 numWords = 2; + + // Address LINK - hardcoded for Sepolia + address linkAddress = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // address WRAPPER - hardcoded for Sepolia + address wrapperAddress = 0xab18414CD93297B0d12ac29E63Ca20f515b3DB46; + + constructor() ConfirmedOwner(msg.sender) VRFV2WrapperConsumerBase(linkAddress, wrapperAddress) {} + + function requestRandomWords() external onlyOwner returns (uint256 requestId) { + requestId = requestRandomness(callbackGasLimit, requestConfirmations, numWords); + s_requests[requestId] = RequestStatus({ + paid: VRF_V2_WRAPPER.calculateRequestPrice(callbackGasLimit), randomWords: new uint256[](0), fulfilled: false + }); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].paid > 0, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, s_requests[_requestId].paid); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].paid > 0, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink() public onlyOwner { + LinkTokenInterface link = LinkTokenInterface(linkAddress); + require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); + } +} +``` + The parameters define how your requests will be processed. You can find the values for your network in the [Supported networks](/vrf/v2/direct-funding/supported-networks) page. - `uint32 callbackGasLimit`: The limit for how much gas to use for the callback request to your contract's `fulfillRandomWords()` function. It must be less than the `maxGasLimit` limit on the coordinator contract minus the `wrapperGasOverhead`. See the [VRF v2 Direct funding limits](/vrf/v2/direct-funding/#limits) for more details. Adjust this value for larger requests depending on how your `fulfillRandomWords()` function processes and stores the received random values. If your `callbackGasLimit` is not sufficient, the callback will fail and your consuming contract is still charged for the work done to generate your requested random values. @@ -2550,14 +4392,142 @@ This guide will require you to finetune the gas limit when fulfilling requests. Open *VRFCoordinatorV2Mock* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import "@chainlink/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2Mock.sol"; +``` + Open *MockV3Aggregator* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import "@chainlink/contracts/src/v0.8/shared/mocks/MockV3Aggregator.sol"; +``` + Open *LinkToken* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@chainlink/contracts/src/v0.8/shared/token/ERC677/LinkToken.sol"; +``` + Open *VRFV2Wrapper* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.6; + +import "@chainlink/contracts/src/v0.8/vrf/VRFV2Wrapper.sol"; +``` + Open *RandomNumberDirectFundingConsumerV2* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that directly pays for each request. +pragma solidity ^0.8.7; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {VRFV2WrapperConsumerBase} from "@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UNAUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract RandomNumberDirectFundingConsumerV2 is VRFV2WrapperConsumerBase, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords, uint256 paid); + event RequestFulfilled(uint256 requestId, uint256[] randomWords, uint256 payment); + + error InsufficientFunds(uint256 balance, uint256 paid); + error RequestNotFound(uint256 requestId); + error LinkTransferError(address sender, address receiver, uint256 amount); + + struct RequestStatus { + uint256 paid; // amount paid in link + bool fulfilled; // whether the request has been successfully fulfilled + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // configuration: https://docs.chain.link/vrf/v2/direct-funding/supported-networks#configurations + constructor( + address _linkAddress, + address _wrapperAddress + ) ConfirmedOwner(msg.sender) VRFV2WrapperConsumerBase(_linkAddress, _wrapperAddress) {} + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + // The default is 3, but you can set this higher. + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFV2Wrapper.getConfig().maxNumWords. + function requestRandomWords( + uint32 _callbackGasLimit, + uint16 _requestConfirmations, + uint32 _numWords + ) external onlyOwner returns (uint256 requestId) { + requestId = requestRandomness(_callbackGasLimit, _requestConfirmations, _numWords); + uint256 paid = VRF_V2_WRAPPER.calculateRequestPrice(_callbackGasLimit); + uint256 balance = LINK.balanceOf(address(this)); + if (balance < paid) revert InsufficientFunds(balance, paid); + s_requests[requestId] = RequestStatus({paid: paid, randomWords: new uint256[](0), fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, _numWords, paid); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + RequestStatus storage request = s_requests[_requestId]; + if (request.paid == 0) revert RequestNotFound(_requestId); + request.fulfilled = true; + request.randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords, request.paid); + } + + function getNumberOfRequests() external view returns (uint256) { + return requestIds.length; + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (uint256 paid, bool fulfilled, uint256[] memory randomWords) { + RequestStatus memory request = s_requests[_requestId]; + if (request.paid == 0) revert RequestNotFound(_requestId); + return (request.paid, request.fulfilled, request.randomWords); + } + + /** + * Allow withdraw of Link tokens from the contract + */ + function withdrawLink( + address _receiver + ) public onlyOwner { + bool success = LINK.transfer(_receiver, LINK.balanceOf(address(this))); + if (!success) { + revert LinkTransferError(msg.sender, _receiver, LINK.balanceOf(address(this))); + } + } +} +``` + Your RemixIDE file explorer should display the opened contracts: ### Select the correct RemixIDE environment @@ -3423,6 +5393,181 @@ contract VRFD20 is VRFConsumerBaseV2 { ``` +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; + +/** + * @notice A Chainlink VRF consumer which uses randomness to mimic the rolling + * of a 20 sided dice + */ + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract VRFD20 is VRFConsumerBaseV2 { + uint256 private constant ROLL_IN_PROGRESS = 42; + + VRFCoordinatorV2Interface COORDINATOR; + + // Your subscription ID. + uint64 s_subscriptionId; + + // Sepolia coordinator. For other networks, + // see https://docs.chain.link/docs/vrf-contracts/#configurations + address vrfCoordinator = 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf-contracts/#configurations + bytes32 s_keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 40,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 callbackGasLimit = 40_000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 1 random value in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 numWords = 1; + address s_owner; + + // map rollers to requestIds + mapping(uint256 => address) private s_rollers; + // map vrf results to rollers + mapping(address => uint256) private s_results; + + event DiceRolled(uint256 indexed requestId, address indexed roller); + event DiceLanded(uint256 indexed requestId, uint256 indexed result); + + /** + * @notice Constructor inherits VRFConsumerBaseV2 + * + * @dev NETWORK: Sepolia + * + * @param subscriptionId subscription id that this consumer contract can use + */ + constructor( + uint64 subscriptionId + ) VRFConsumerBaseV2(vrfCoordinator) { + COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); + s_owner = msg.sender; + s_subscriptionId = subscriptionId; + } + + /** + * @notice Requests randomness + * @dev Warning: if the VRF response is delayed, avoid calling requestRandomness repeatedly + * as that would give miners/VRF operators latitude about which VRF response arrives first. + * @dev You must review your implementation details with extreme care. + * + * @param roller address of the roller + */ + function rollDice( + address roller + ) public onlyOwner returns (uint256 requestId) { + require(s_results[roller] == 0, "Already rolled"); + // Will revert if subscription is not set and funded. + requestId = + COORDINATOR.requestRandomWords(s_keyHash, s_subscriptionId, requestConfirmations, callbackGasLimit, numWords); + + s_rollers[requestId] = roller; + s_results[roller] = ROLL_IN_PROGRESS; + emit DiceRolled(requestId, roller); + } + + /** + * @notice Callback function used by VRF Coordinator to return the random number to this contract. + * + * @dev Some action on the contract state should be taken here, like storing the result. + * @dev WARNING: take care to avoid having multiple VRF requests in flight if their order of arrival would result + * in contract states with different outcomes. Otherwise miners or the VRF operator would could take advantage + * by controlling the order. + * @dev The VRF Coordinator will only send this function verified responses, and the parent VRFConsumerBaseV2 + * contract ensures that this method only receives randomness from the designated VRFCoordinator. + * + * @param requestId uint256 + * @param randomWords uint256[] The random result returned by the oracle. + */ + function fulfillRandomWords( + uint256 requestId, + uint256[] memory randomWords + ) internal override { + uint256 d20Value = (randomWords[0] % 20) + 1; + s_results[s_rollers[requestId]] = d20Value; + emit DiceLanded(requestId, d20Value); + } + + /** + * @notice Get the house assigned to the player once the address has rolled + * @param player address + * @return house as a string + */ + function house( + address player + ) public view returns (string memory) { + require(s_results[player] != 0, "Dice not rolled"); + require(s_results[player] != ROLL_IN_PROGRESS, "Roll in progress"); + return getHouseName(s_results[player]); + } + + /** + * @notice Get the house name from the id + * @param id uint256 + * @return house name string + */ + function getHouseName( + uint256 id + ) private pure returns (string memory) { + string[20] memory houseNames = [ + "Targaryen", + "Lannister", + "Stark", + "Tyrell", + "Baratheon", + "Martell", + "Tully", + "Bolton", + "Greyjoy", + "Arryn", + "Frey", + "Mormont", + "Tarley", + "Dayne", + "Umber", + "Valeryon", + "Manderly", + "Clegane", + "Glover", + "Karstark" + ]; + return houseNames[id - 1]; + } + + modifier onlyOwner() { + require(msg.sender == s_owner); + _; + } +} +``` + You have now completed all necessary functions to generate randomness and assign the user a *Game of Thrones* house. We've added a few helper functions in there to make using the contract easier and more flexible. You can deploy and interact with the complete contract in Remix. ## How do I deploy to testnet? @@ -3593,6 +5738,109 @@ Build and deploy the contract on Sepolia. 1. Open the [`VRFv2Consumer.sol` contract](https://remix.ethereum.org/#url=https://docs.chain.link/samples/VRF/VRFv2Consumer.sol) in Remix. + ```sol + // SPDX-License-Identifier: MIT + // An example of a consumer contract that relies on a subscription for funding. + pragma solidity ^0.8.7; + + import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; + import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; + import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; + + /** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + + /** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + contract VRFv2Consumer is VRFConsumerBaseV2, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + VRFCoordinatorV2Interface COORDINATOR; + + // Your subscription ID. + uint64 s_subscriptionId; + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf/v2/subscription/supported-networks/#configurations + bytes32 keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625 + */ + constructor( + uint64 subscriptionId + ) VRFConsumerBaseV2(0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625) ConfirmedOwner(msg.sender) { + COORDINATOR = VRFCoordinatorV2Interface(0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625); + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + function requestRandomWords() external onlyOwner returns (uint256 requestId) { + // Will revert if subscription is not set and funded. + requestId = + COORDINATOR.requestRandomWords(keyHash, s_subscriptionId, requestConfirmations, callbackGasLimit, numWords); + s_requests[requestId] = RequestStatus({randomWords: new uint256[](0), exists: true, fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } + } + ``` + 2. On the **Compile** tab in Remix, compile the `VRFv2Consumer.sol` contract. 3. Configure your deployment. On the **Deploy** tab in Remix, select the **Injected Provider** environment, select the `VRFv2Consumer` contract from the contract list, and specify your `subscriptionId` so the constructor can set it. @@ -3640,6 +5888,109 @@ You deployed a simple contract that can request and receive random values from C In this example, your MetaMask wallet is the subscription owner and you created a consuming contract to use that subscription. The consuming contract uses static configuration parameters. +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.7; + +import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol"; +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract VRFv2Consumer is VRFConsumerBaseV2, ConfirmedOwner { + event RequestSent(uint256 requestId, uint32 numWords); + event RequestFulfilled(uint256 requestId, uint256[] randomWords); + + struct RequestStatus { + bool fulfilled; // whether the request has been successfully fulfilled + bool exists; // whether a requestId exists + uint256[] randomWords; + } + + mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */ + VRFCoordinatorV2Interface COORDINATOR; + + // Your subscription ID. + uint64 s_subscriptionId; + + // past requests Id. + uint256[] public requestIds; + uint256 public lastRequestId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf/v2/subscription/supported-networks/#configurations + bytes32 keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 numWords = 2; + + /** + * HARDCODED FOR SEPOLIA + * COORDINATOR: 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625 + */ + constructor( + uint64 subscriptionId + ) VRFConsumerBaseV2(0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625) ConfirmedOwner(msg.sender) { + COORDINATOR = VRFCoordinatorV2Interface(0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625); + s_subscriptionId = subscriptionId; + } + + // Assumes the subscription is funded sufficiently. + function requestRandomWords() external onlyOwner returns (uint256 requestId) { + // Will revert if subscription is not set and funded. + requestId = + COORDINATOR.requestRandomWords(keyHash, s_subscriptionId, requestConfirmations, callbackGasLimit, numWords); + s_requests[requestId] = RequestStatus({randomWords: new uint256[](0), exists: true, fulfilled: false}); + requestIds.push(requestId); + lastRequestId = requestId; + emit RequestSent(requestId, numWords); + return requestId; + } + + function fulfillRandomWords( + uint256 _requestId, + uint256[] memory _randomWords + ) internal override { + require(s_requests[_requestId].exists, "request not found"); + s_requests[_requestId].fulfilled = true; + s_requests[_requestId].randomWords = _randomWords; + emit RequestFulfilled(_requestId, _randomWords); + } + + function getRequestStatus( + uint256 _requestId + ) external view returns (bool fulfilled, uint256[] memory randomWords) { + require(s_requests[_requestId].exists, "request not found"); + RequestStatus memory request = s_requests[_requestId]; + return (request.fulfilled, request.randomWords); + } +} +``` + The parameters define how your requests will be processed. You can find the values for your network in the [Configuration](/vrf/v2/subscription/supported-networks) page. - `uint64 s_subscriptionId`: The subscription ID that this contract uses for funding requests. @@ -3714,6 +6065,137 @@ In this example, the contract operates as a subscription owner and can run funct Subscription owners and consumers do not have to be separate. This contract not only allows adding consumers with `addConsumer(address consumerAddress)` but can also act as a consumer by running its own `requestRandomWords()` function. This example contract includes a `createNewSubscription()` function in the `constructor()` that creates the subscription and adds itself as a consumer automatically when you deploy it. +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that also owns and manages the subscription +pragma solidity ^0.8.7; + +import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol"; + +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; + +/** + * Request testnet LINK and ETH here: https://faucets.chain.link/ + * Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: + * https://docs.chain.link/docs/link-token-contracts/ + */ + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ +contract VRFv2SubscriptionManager is VRFConsumerBaseV2 { + VRFCoordinatorV2Interface COORDINATOR; + LinkTokenInterface LINKTOKEN; + + // Sepolia coordinator. For other networks, + // see https://docs.chain.link/docs/vrf-contracts/#configurations + address vrfCoordinator = 0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625; + + // Sepolia LINK token contract. For other networks, see + // https://docs.chain.link/docs/vrf-contracts/#configurations + address link_token_contract = 0x779877A7B0D9E8603169DdbD7836e478b4624789; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf-contracts/#configurations + bytes32 keyHash = 0x474e34a077df58807dbe9c96d3c009b23b3c6d0cce433e59bbf5b34f823bc56c; + + // A reasonable default is 100000, but this value could be different + // on other networks. + uint32 callbackGasLimit = 100_000; + + // The default is 3, but you can set this higher. + uint16 requestConfirmations = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 numWords = 2; + + // Storage parameters + uint256[] public s_randomWords; + uint256 public s_requestId; + uint64 public s_subscriptionId; + address s_owner; + + constructor() VRFConsumerBaseV2(vrfCoordinator) { + COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); + LINKTOKEN = LinkTokenInterface(link_token_contract); + s_owner = msg.sender; + //Create a new subscription when you deploy the contract. + createNewSubscription(); + } + + // Assumes the subscription is funded sufficiently. + function requestRandomWords() external onlyOwner { + // Will revert if subscription is not set and funded. + s_requestId = + COORDINATOR.requestRandomWords(keyHash, s_subscriptionId, requestConfirmations, callbackGasLimit, numWords); + } + + function fulfillRandomWords( + uint256, + /* requestId */ + uint256[] memory randomWords + ) internal override { + s_randomWords = randomWords; + } + + // Create a new subscription when the contract is initially deployed. + function createNewSubscription() private onlyOwner { + s_subscriptionId = COORDINATOR.createSubscription(); + // Add this contract as a consumer of its own subscription. + COORDINATOR.addConsumer(s_subscriptionId, address(this)); + } + + // Assumes this contract owns link. + // 1000000000000000000 = 1 LINK + function topUpSubscription( + uint256 amount + ) external onlyOwner { + LINKTOKEN.transferAndCall(address(COORDINATOR), amount, abi.encode(s_subscriptionId)); + } + + function addConsumer( + address consumerAddress + ) external onlyOwner { + // Add a consumer contract to the subscription. + COORDINATOR.addConsumer(s_subscriptionId, consumerAddress); + } + + function removeConsumer( + address consumerAddress + ) external onlyOwner { + // Remove a consumer contract from the subscription. + COORDINATOR.removeConsumer(s_subscriptionId, consumerAddress); + } + + function cancelSubscription( + address receivingWallet + ) external onlyOwner { + // Cancel the subscription and send the remaining LINK to a wallet address. + COORDINATOR.cancelSubscription(s_subscriptionId, receivingWallet); + s_subscriptionId = 0; + } + + // Transfer this contract's funds to an address. + // 1000000000000000000 = 1 LINK + function withdraw( + uint256 amount, + address to + ) external onlyOwner { + LINKTOKEN.transfer(to, amount); + } + + modifier onlyOwner() { + require(msg.sender == s_owner); + _; + } +} +``` + To use this contract, compile and deploy it in Remix. 1. Open the contract in [Remix](https://remix.ethereum.org/#url=https://docs.chain.link/samples/VRF/VRFv2SubscriptionManager.sol). @@ -3750,6 +6232,27 @@ To use this contract, compile and deploy it in Remix. You can fund a subscription and request randomness in a single transaction. You must estimate how much the transaction might cost and determine the amount of funding to send to the subscription yourself. See the [Subscription billing](/vrf/v2/subscription/#subscription-limits) page to learn how to estimate request costs. +```sol +// Assumes this contract owns link +// You must estimate LINK cost yourself based on the gas lane and limits. +// 1_000_000_000_000_000_000 = 1 LINK +function fundAndRequestRandomWords(uint256 amount) external onlyOwner { + LINKTOKEN.transferAndCall( + address(COORDINATOR), + amount, + abi.encode(s_subscriptionId) + ); + // Will revert if subscription is not set and funded. + s_requestId = COORDINATOR.requestRandomWords( + keyHash, + s_subscriptionId, + requestConfirmations, + callbackGasLimit, + numWords + ); +} +``` + Add this function to your contracts if you need to provide funding simultaneously with your requests. The `transferAndCall()` function sends LINK from your contract to the subscription, and the `requestRandomWords()` function requests the random words. Your contract still needs the `fulfillRandomWords()` callback function to receive the random values. --- @@ -3789,8 +6292,115 @@ Complete the following tasks to test your VRF v2 consumer locally: Open *VRFCoordinatorV2Mock* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.7; + +import "@chainlink/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2Mock.sol"; +``` + Open *VRFv2Consumer* and compile in Remix: +```sol +// SPDX-License-Identifier: MIT +// An example of a consumer contract that relies on a subscription for funding. +pragma solidity ^0.8.7; + +import {VRFConsumerBaseV2} from "@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol"; +import {VRFCoordinatorV2Interface} from "@chainlink/contracts/src/v0.8/vrf/interfaces/VRFCoordinatorV2Interface.sol"; + +/** + * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY. + * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE. + * DO NOT USE THIS CODE IN PRODUCTION. + */ + +/** + * @title The RandomNumberConsumerV2 contract + * @notice A contract that gets random values from Chainlink VRF V2 + */ +contract RandomNumberConsumerV2 is VRFConsumerBaseV2 { + VRFCoordinatorV2Interface immutable COORDINATOR; + + // Your subscription ID. + uint64 immutable s_subscriptionId; + + // The gas lane to use, which specifies the maximum gas price to bump to. + // For a list of available gas lanes on each network, + // see https://docs.chain.link/docs/vrf-contracts/#configurations + bytes32 immutable s_keyHash; + + // Depends on the number of requested values that you want sent to the + // fulfillRandomWords() function. Storing each word costs about 20,000 gas, + // so 100,000 is a safe default for this example contract. Test and adjust + // this limit based on the network that you select, the size of the request, + // and the processing of the callback request in the fulfillRandomWords() + // function. + uint32 constant CALLBACK_GAS_LIMIT = 100_000; + + // The default is 3, but you can set this higher. + uint16 constant REQUEST_CONFIRMATIONS = 3; + + // For this example, retrieve 2 random values in one request. + // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS. + uint32 constant NUM_WORDS = 2; + + uint256[] public s_randomWords; + uint256 public s_requestId; + address s_owner; + + event ReturnedRandomness(uint256[] randomWords); + + /** + * @notice Constructor inherits VRFConsumerBaseV2 + * + * @param subscriptionId - the subscription ID that this contract uses for funding requests + * @param vrfCoordinator - coordinator, check https://docs.chain.link/docs/vrf-contracts/#configurations + * @param keyHash - the gas lane to use, which specifies the maximum gas price to bump to + */ + constructor( + uint64 subscriptionId, + address vrfCoordinator, + bytes32 keyHash + ) VRFConsumerBaseV2(vrfCoordinator) { + COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); + s_keyHash = keyHash; + s_owner = msg.sender; + s_subscriptionId = subscriptionId; + } + + /** + * @notice Requests randomness + * Assumes the subscription is funded sufficiently; "Words" refers to unit of data in Computer Science + */ + function requestRandomWords() external onlyOwner { + // Will revert if subscription is not set and funded. + s_requestId = + COORDINATOR.requestRandomWords(s_keyHash, s_subscriptionId, REQUEST_CONFIRMATIONS, CALLBACK_GAS_LIMIT, NUM_WORDS); + } + + /** + * @notice Callback function used by VRF Coordinator + * + * @param - id of the request + * @param randomWords - array of random results from VRF Coordinator + */ + function fulfillRandomWords( + uint256, + /* requestId */ + uint256[] memory randomWords + ) internal override { + s_randomWords = randomWords; + emit ReturnedRandomness(randomWords); + } + + modifier onlyOwner() { + require(msg.sender == s_owner); + _; + } +} +``` + Your RemixIDE file explorer should display *VRFCoordinatorV2Mock.sol* and *VRFv2Consumer.sol*: ### Deploy VRFCoordinatorV2Mock diff --git a/src/scripts/generate-llms.ts b/src/scripts/generate-llms.ts index 042d46a0e71..33221c5d5b4 100644 --- a/src/scripts/generate-llms.ts +++ b/src/scripts/generate-llms.ts @@ -578,6 +578,53 @@ async function transformMarkdown(markdown: string, mdxAbsPath: string, targetLan } } + // Handle CodeSample component - inline the code from public/{src} + if ( + parent && + typeof index === "number" && + node.type === "mdxJsxFlowElement" && + (node as MdxJsxNode).name === "CodeSample" + ) { + try { + const srcAttr = (node as MdxJsxNode).attributes?.find((a) => a.name === "src") + const langAttr = (node as MdxJsxNode).attributes?.find((a) => a.name === "lang") + + if (srcAttr?.value) { + const srcValue = typeof srcAttr.value === "string" ? srcAttr.value : undefined + + if (srcValue) { + const publicDir = path.resolve(process.cwd(), "public") + const codePath = path.join(publicDir, srcValue) + + if (fsSync.existsSync(codePath)) { + let codeContent = fsSync.readFileSync(codePath, "utf-8") + + // Strip highlighter comments + codeContent = stripHighlightComments(codeContent) + + // Determine language from lang attribute or file extension + let lang = typeof langAttr?.value === "string" ? langAttr.value : undefined + if (!lang) { + const ext = path.extname(codePath).slice(1) + lang = ext || "text" + } + + // Replace with code block + parent.children[index] = { + type: "code", + lang, + value: codeContent.trim(), + } as Literal + + return + } + } + } + } catch (e) { + console.warn(`Failed to process CodeSample in ${mdxAbsPath}:`, e) + } + } + // Handle CopyText inline component - extract the text attribute if ( parent && From f4da76591b300f3a380fc841a8ff180dc95985e5 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Fri, 9 Jan 2026 12:39:36 -0500 Subject: [PATCH 102/214] fix codesample copy page api (#3346) --- scripts/cleanup-vercel-function.mjs | 3 ++- src/lib/markdown/componentHandlers.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/cleanup-vercel-function.mjs b/scripts/cleanup-vercel-function.mjs index 85991f22925..04eaea1a707 100755 --- a/scripts/cleanup-vercel-function.mjs +++ b/scripts/cleanup-vercel-function.mjs @@ -22,12 +22,13 @@ async function cleanup() { 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`, + // `${FUNCTION_DIR}/public/samples`, // Kept for API route access `${FUNCTION_DIR}/public/changelog.json`, ] diff --git a/src/lib/markdown/componentHandlers.ts b/src/lib/markdown/componentHandlers.ts index f97bb69e859..47cd21c125f 100644 --- a/src/lib/markdown/componentHandlers.ts +++ b/src/lib/markdown/componentHandlers.ts @@ -424,7 +424,8 @@ export function handleCodeSample( } as Parent } else { // Try to inline the code - const possiblePaths = [path.resolve(`public/${src}`), path.resolve(src), path.resolve(`src/${src}`)] + 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) { From 84169887e3de2a656178190d2f7b90d7797e99c3 Mon Sep 17 00:00:00 2001 From: devin distefano <devin.distefano@smartcontract.com> Date: Fri, 9 Jan 2026 14:15:50 -0800 Subject: [PATCH 103/214] schema-rename (#3347) --- src/config/sidebar.ts | 4 +- .../data-streams/concepts/best-practices.mdx | 6 +-- src/content/data-streams/llms-full.txt | 44 +++++++++---------- .../reference/report-schema-overview.mdx | 12 ++--- .../reference/report-schema-v10.mdx | 6 +-- .../reference/report-schema-v9.mdx | 21 ++++++--- .../index.mdx | 0 .../evm-onchain-report-verification.mdx | 2 +- .../common/ReportSchemaTabs.astro | 2 +- src/features/feeds/components/Tables.tsx | 2 +- 10 files changed, 55 insertions(+), 44 deletions(-) rename src/content/data-streams/{backed-streams => tokenized-asset-streams}/index.mdx (100%) diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index d9cadf64fc9..972be94e0e4 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -885,14 +885,14 @@ export const SIDEBAR: Partial<Record<Sections, SectionEntry[]>> = { url: "data-streams/nav-streams", children: [ { - title: "Report Schema v9 (NAV)", + title: "Report Schema v9 (SmartData)", url: "data-streams/reference/report-schema-v9", }, ], }, { title: "Tokenized Asset", - url: "data-streams/backed-streams", + url: "data-streams/tokenized-asset-streams", children: [ { title: "Report Schema v10 (Tokenized Asset)", diff --git a/src/content/data-streams/concepts/best-practices.mdx b/src/content/data-streams/concepts/best-practices.mdx index 67bdbb86243..b57c17867e2 100644 --- a/src/content/data-streams/concepts/best-practices.mdx +++ b/src/content/data-streams/concepts/best-practices.mdx @@ -150,9 +150,9 @@ Positions may need to be manually adjusted if the DEX doesn't support tracking t #### Stock splits & reverse splits <Aside type="note" title="Tokenized Stocks Guidance"> - Tokenized stocks such as [Backed xStock](/data-streams/reference/report-schema-v10) handle stock splits differently - using activation dates and staged multipliers to maintain price continuity. [Learn more about advanced stock split - handling](#handling-stock-splits-for-tokenized-assets). + Tokenized stocks such as [Tokenized Asset streams](/data-streams/reference/report-schema-v10) handle stock splits + differently using activation dates and staged multipliers to maintain price continuity. [Learn more about advanced + stock split handling](#handling-stock-splits-for-tokenized-assets). </Aside> A stock split increases the number of shares while reducing the price per share (e.g., 2-for-1 split), often making shares more accessible to investors. A reverse split does the opposite, consolidating shares to increase the price per share. diff --git a/src/content/data-streams/llms-full.txt b/src/content/data-streams/llms-full.txt index b23224bbed8..863aaca66ad 100644 --- a/src/content/data-streams/llms-full.txt +++ b/src/content/data-streams/llms-full.txt @@ -111,17 +111,6 @@ Automatic failover handles availability and traffic routing in the following sce --- -# Tokenized Asset Data Streams -Source: https://docs.chain.link/data-streams/backed-streams - -<Aside type="danger" title="Weekend Usage Disclaimer"> - **Users should not use these streams during weekends** due to limited exchange activity. - - If usage is necessary, increase fees to mitigate risks. Developers are solely responsible for monitoring and mitigating market integrity risks, as outlined in the [Developer Responsibilities](/data-streams/developer-responsibilities) documentation. -</Aside> - ---- - # Data Streams Billing Source: https://docs.chain.link/data-streams/billing @@ -265,9 +254,9 @@ Positions may need to be manually adjusted if the DEX doesn't support tracking t #### Stock splits & reverse splits <Aside type="note" title="Tokenized Stocks Guidance"> - Tokenized stocks such as [Backed xStock](/data-streams/reference/report-schema-v10) handle stock splits differently - using activation dates and staged multipliers to maintain price continuity. [Learn more about advanced stock split - handling](#handling-stock-splits-for-tokenized-assets). + Tokenized stocks such as [Tokenized Asset streams](/data-streams/reference/report-schema-v10) handle stock splits + differently using activation dates and staged multipliers to maintain price continuity. [Learn more about advanced + stock split handling](#handling-stock-splits-for-tokenized-assets). </Aside> A stock split increases the number of shares while reducing the price per share (e.g., 2-for-1 split), often making shares more accessible to investors. A reverse split does the opposite, consolidating shares to increase the price per share. @@ -5196,7 +5185,7 @@ These advanced fields enable protocols to implement more sophisticated risk mana ## Net Asset Value (NAV) -[Chainlink NAV streams](/data-streams/nav-streams) use the [NAV (v9)](/data-streams/reference/report-schema-v9) report schema to provide real-time, tamper-proof access to the Net Asset Value (`navPerShare`) of tokenized assets, funds, or portfolios. Each report includes NAV per share (`navPerShare`), NAV date (`navDate`), assets under management (`aum`), and ripcord status (`ripcord`). The ripcord is set to true (`1`) by the asset issuer when the consumer should ignore the value being sent (for cases such as maintenance, upstream data source outages, etc). The feed data will remain stale until the ripcord returns false (`0`). +[Chainlink NAV streams](/data-streams/nav-streams) use the [SmartData (v9)](/data-streams/reference/report-schema-v9) report schema to provide real-time, tamper-proof access to the Net Asset Value (`navPerShare`) of tokenized assets, funds, or portfolios. Each report includes NAV per share (`navPerShare`), NAV date (`navDate`), assets under management (`aum`), and ripcord status (`ripcord`). The ripcord is set to true (`1`) by the asset issuer when the consumer should ignore the value being sent (for cases such as maintenance, upstream data source outages, etc). The feed data will remain stale until the ripcord returns false (`0`). NAV is a fundamental financial metric that represents the value of an investment vehicle such as a mutual fund or ETF and is calculated as the total assets minus the total liabilities. @@ -5204,11 +5193,11 @@ Data Streams ensures that any NAV update, whenever it occurs, is captured and ma ## Tokenized Asset -[Chainlink Tokenized Asset streams](/data-streams/backed-streams) use the [Tokenized Asset (v10)](/data-streams/reference/report-schema-v10) report schema to provide financial market data for tokenized equities such as [xStock](https://xstocks.com/us) assets. These streams combine data from US equity streams with data from the tokenization service to enable users to handle corporate actions affecting the underlying equities. Each report includes the staleness measure (`lastUpdateTimestamp`), consensus mid price (`price`), market status (`marketStatus`), current multiplier (`currentMultiplier`, the number of underlying shares each xStock is redeemable for), new multiplier (`newMultiplier`, the future number of shares after a scheduled corporate action), activation date/time of the corporate action (`activationDateTime`) and the tokenized price if available on primary or secondary markets (`tokenizedPrice`). +[Chainlink Tokenized Asset streams](/data-streams/tokenized-asset-streams) use the [Tokenized Asset (v10)](/data-streams/reference/report-schema-v10) report schema to provide financial market data for tokenized equities. These streams combine data from US equity streams with data from tokenization services to enable users to handle corporate actions affecting the underlying equities. Each report includes the staleness measure (`lastUpdateTimestamp`), consensus mid price (`price`), market status (`marketStatus`), current multiplier (`currentMultiplier`, the number of underlying shares each tokenized asset is redeemable for), new multiplier (`newMultiplier`, the future number of shares after a scheduled corporate action), activation date/time of the corporate action (`activationDateTime`) and the tokenized price if available on primary or secondary markets (`tokenizedPrice`). The underlying US equities trade on traditional exchanges during [market hours](/data-streams/market-hours). These market hours depend per asset class and can be subject to unexpected halts, pauses and other behaviors affecting traditional markets. For this reason, this class of Data Streams contains a market hours flag and a staleness measure to equip our users to handle these events correctly. It is critical that users implement correct safeguards on their end to pause markets, add more conservative risk caps, or implement other measures appropriate for their application. -[Tokenized Asset (v10)](/data-streams/reference/report-schema-v10) is designed specifically for tokenized equities such as xStocks and contains data from the Chainlink US equities streams, combined with data provided by the tokenizer to properly handle corporate actions. With this enhanced data users are able to handle expected and unexpected market events such as pauses, halts and market off hours. The tokenization provider layers in data around the `currentMultiplier`, the `newMultiplier` and the `activationDateTime` of the new multiplier to handle corporate actions. +[Tokenized Asset (v10)](/data-streams/reference/report-schema-v10) is designed specifically for tokenized equities and contains data from the Chainlink US equities streams, combined with data provided by the tokenizer to properly handle corporate actions. With this enhanced data users are able to handle expected and unexpected market events such as pauses, halts and market off hours. The tokenization provider layers in data around the `currentMultiplier`, the `newMultiplier` and the `activationDateTime` of the new multiplier to handle corporate actions. --- @@ -5217,7 +5206,7 @@ Source: https://docs.chain.link/data-streams/reference/report-schema-v10 <DataStreams section="dsNotes" /> -Chainlink Backed xStock Data Streams adhere to the report schema outlined below. +Chainlink Tokenized Asset Data Streams adhere to the report schema outlined below. ### Schema Fields @@ -5246,7 +5235,7 @@ Chainlink Backed xStock Data Streams adhere to the report schema outlined below. **Notes:** -- Future Backed xStock streams may use different report schemas. +- Future Tokenized Asset streams may use different report schemas. - `price` updates in real time during market open, but may become stale during market closed periods. - `currentMultiplier` reflects all past corporate actions and is updated only when a new action is activated. - `activationDateTime` and `newMultiplier` provide advance notice of upcoming corporate actions, allowing protocols to prepare. @@ -5444,12 +5433,12 @@ RWA streams adhere to the report schema outlined below. --- -# Report Schema: NAV (v9) +# Report Schema: SmartData (v9) Source: https://docs.chain.link/data-streams/reference/report-schema-v9 <DataStreams section="dsNotes" /> -Chainlink NAV Data Streams streams adhere to the report schema outlined below. +Chainlink SmartData streams adhere to the report schema outlined below. This schema supports NAV (Net Asset Value) and POR (Proof of Reserve) feeds. ### Schema Fields @@ -5774,6 +5763,17 @@ Streams Trade is currently available on the following networks: --- +# Tokenized Asset Data Streams +Source: https://docs.chain.link/data-streams/tokenized-asset-streams + +<Aside type="danger" title="Weekend Usage Disclaimer"> + **Users should not use these streams during weekends** due to limited exchange activity. + + If usage is necessary, increase fees to mitigate risks. Developers are solely responsible for monitoring and mitigating market integrity risks, as outlined in the [Developer Responsibilities](/data-streams/developer-responsibilities) documentation. +</Aside> + +--- + # Verify report data onchain (EVM) Source: https://docs.chain.link/data-streams/tutorials/evm-onchain-report-verification @@ -6306,7 +6306,7 @@ The `verifyReport` function is the core function that handles onchain report ver - Schema version `0x0003` corresponds to the [Crypto Advanced (v3)](/data-streams/reference/report-schema-v3). - Schema version `0x0008` corresponds to the [RWA Standard (v8)](/data-streams/reference/report-schema-v8). - Schema version `0x0007` corresponds to the [Redemption Rates (v7)](/data-streams/reference/report-schema-v7). - - Schema version `0x0009` corresponds to the [NAV (v9)](/data-streams/reference/report-schema-v9). + - Schema version `0x0009` corresponds to the [SmartData (v9)](/data-streams/reference/report-schema-v9). - Schema version `0x000A` corresponds to the [Tokenized Asset (v10)](/data-streams/reference/report-schema-v10). - Schema version `0x000B` corresponds to the [RWA Advanced (v11)](/data-streams/reference/report-schema-v11). - If the report version is unsupported, the function reverts with an InvalidReportVersion error. diff --git a/src/content/data-streams/reference/report-schema-overview.mdx b/src/content/data-streams/reference/report-schema-overview.mdx index 1ad3b81d699..d30eab13232 100644 --- a/src/content/data-streams/reference/report-schema-overview.mdx +++ b/src/content/data-streams/reference/report-schema-overview.mdx @@ -86,7 +86,7 @@ Each stream category uses one or more report schemas to deliver data. Several ca <a href="/data-streams/nav-streams">NAV</a> </td> <td> - <a href="/data-streams/reference/report-schema-v9">NAV (v9)</a> + <a href="/data-streams/reference/report-schema-v9">SmartData (v9)</a> </td> <td>Net Asset Value (NAV)</td> <td> @@ -95,12 +95,12 @@ Each stream category uses one or more report schemas to deliver data. Several ca </tr> <tr> <td> - <a href="/data-streams/backed-streams">Tokenized Asset</a> + <a href="/data-streams/tokenized-asset-streams">Tokenized Asset</a> </td> <td> <a href="/data-streams/reference/report-schema-v10">Tokenized Asset (v10)</a> </td> - <td>Backed xStock</td> + <td>Tokenized equities</td> <td> <code>price</code>, <code>tokenizedPrice</code>, <code>marketStatus</code>, <code>currentMultiplier</code>,{" "} <code>newMultiplier</code> @@ -157,7 +157,7 @@ These advanced fields enable protocols to implement more sophisticated risk mana ## Net Asset Value (NAV) -[Chainlink NAV streams](/data-streams/nav-streams) use the [NAV (v9)](/data-streams/reference/report-schema-v9) report schema to provide real-time, tamper-proof access to the Net Asset Value (`navPerShare`) of tokenized assets, funds, or portfolios. Each report includes NAV per share (`navPerShare`), NAV date (`navDate`), assets under management (`aum`), and ripcord status (`ripcord`). The ripcord is set to true (`1`) by the asset issuer when the consumer should ignore the value being sent (for cases such as maintenance, upstream data source outages, etc). The feed data will remain stale until the ripcord returns false (`0`). +[Chainlink NAV streams](/data-streams/nav-streams) use the [SmartData (v9)](/data-streams/reference/report-schema-v9) report schema to provide real-time, tamper-proof access to the Net Asset Value (`navPerShare`) of tokenized assets, funds, or portfolios. Each report includes NAV per share (`navPerShare`), NAV date (`navDate`), assets under management (`aum`), and ripcord status (`ripcord`). The ripcord is set to true (`1`) by the asset issuer when the consumer should ignore the value being sent (for cases such as maintenance, upstream data source outages, etc). The feed data will remain stale until the ripcord returns false (`0`). NAV is a fundamental financial metric that represents the value of an investment vehicle such as a mutual fund or ETF and is calculated as the total assets minus the total liabilities. @@ -165,8 +165,8 @@ Data Streams ensures that any NAV update, whenever it occurs, is captured and ma ## Tokenized Asset -[Chainlink Tokenized Asset streams](/data-streams/backed-streams) use the [Tokenized Asset (v10)](/data-streams/reference/report-schema-v10) report schema to provide financial market data for tokenized equities such as [xStock](https://xstocks.com/us) assets. These streams combine data from US equity streams with data from the tokenization service to enable users to handle corporate actions affecting the underlying equities. Each report includes the staleness measure (`lastUpdateTimestamp`), consensus mid price (`price`), market status (`marketStatus`), current multiplier (`currentMultiplier`, the number of underlying shares each xStock is redeemable for), new multiplier (`newMultiplier`, the future number of shares after a scheduled corporate action), activation date/time of the corporate action (`activationDateTime`) and the tokenized price if available on primary or secondary markets (`tokenizedPrice`). +[Chainlink Tokenized Asset streams](/data-streams/tokenized-asset-streams) use the [Tokenized Asset (v10)](/data-streams/reference/report-schema-v10) report schema to provide financial market data for tokenized equities. These streams combine data from US equity streams with data from tokenization services to enable users to handle corporate actions affecting the underlying equities. Each report includes the staleness measure (`lastUpdateTimestamp`), consensus mid price (`price`), market status (`marketStatus`), current multiplier (`currentMultiplier`, the number of underlying shares each tokenized asset is redeemable for), new multiplier (`newMultiplier`, the future number of shares after a scheduled corporate action), activation date/time of the corporate action (`activationDateTime`) and the tokenized price if available on primary or secondary markets (`tokenizedPrice`). The underlying US equities trade on traditional exchanges during [market hours](/data-streams/market-hours). These market hours depend per asset class and can be subject to unexpected halts, pauses and other behaviors affecting traditional markets. For this reason, this class of Data Streams contains a market hours flag and a staleness measure to equip our users to handle these events correctly. It is critical that users implement correct safeguards on their end to pause markets, add more conservative risk caps, or implement other measures appropriate for their application. -[Tokenized Asset (v10)](/data-streams/reference/report-schema-v10) is designed specifically for tokenized equities such as xStocks and contains data from the Chainlink US equities streams, combined with data provided by the tokenizer to properly handle corporate actions. With this enhanced data users are able to handle expected and unexpected market events such as pauses, halts and market off hours. The tokenization provider layers in data around the `currentMultiplier`, the `newMultiplier` and the `activationDateTime` of the new multiplier to handle corporate actions. +[Tokenized Asset (v10)](/data-streams/reference/report-schema-v10) is designed specifically for tokenized equities and contains data from the Chainlink US equities streams, combined with data provided by the tokenizer to properly handle corporate actions. With this enhanced data users are able to handle expected and unexpected market events such as pauses, halts and market off hours. The tokenization provider layers in data around the `currentMultiplier`, the `newMultiplier` and the `activationDateTime` of the new multiplier to handle corporate actions. diff --git a/src/content/data-streams/reference/report-schema-v10.mdx b/src/content/data-streams/reference/report-schema-v10.mdx index 08f8498104a..ef99f9d7f3b 100644 --- a/src/content/data-streams/reference/report-schema-v10.mdx +++ b/src/content/data-streams/reference/report-schema-v10.mdx @@ -5,7 +5,7 @@ title: "Report Schema: Tokenized Asset (v10)" metadata: title: "Tokenized Asset (v10) | Chainlink Data Streams" description: "Learn about Chainlink Data Streams Tokenized Asset (v10) schema, including fields, encoding, and examples for integrating tokenized asset data in your applications." - keywords: ["Report Schema", "Tokenized Assets", "Backed xStock", "v10 Schema", "Data Format", "Report Structure"] + keywords: ["Report Schema", "Tokenized Assets", "Tokenized Equities", "v10 Schema", "Data Format", "Report Structure"] --- import DataStreams from "@features/data-streams/common/DataStreams.astro" @@ -16,7 +16,7 @@ import Aside from "@components/Aside.astro" <ReportSchemaTabs /> -Chainlink Backed xStock Data Streams adhere to the report schema outlined below. +Chainlink Tokenized Asset Data Streams adhere to the report schema outlined below. ### Schema Fields @@ -45,7 +45,7 @@ Chainlink Backed xStock Data Streams adhere to the report schema outlined below. **Notes:** -- Future Backed xStock streams may use different report schemas. +- Future Tokenized Asset streams may use different report schemas. - `price` updates in real time during market open, but may become stale during market closed periods. - `currentMultiplier` reflects all past corporate actions and is updated only when a new action is activated. - `activationDateTime` and `newMultiplier` provide advance notice of upcoming corporate actions, allowing protocols to prepare. diff --git a/src/content/data-streams/reference/report-schema-v9.mdx b/src/content/data-streams/reference/report-schema-v9.mdx index 6474bacd7ef..3d412ff26eb 100644 --- a/src/content/data-streams/reference/report-schema-v9.mdx +++ b/src/content/data-streams/reference/report-schema-v9.mdx @@ -1,11 +1,22 @@ --- section: dataStreams date: Last Modified -title: "Report Schema: NAV (v9)" +title: "Report Schema: SmartData (v9)" metadata: - title: "NAV (v9) | Chainlink Data Streams" - description: "Learn about Chainlink Data Streams NAV (v9) schema, including fields, encoding, and examples for integrating NAV data in your applications." - keywords: ["Report Schema", "NAV", "Net Asset Value", "v9 Schema", "Data Format", "Report Structure"] + title: "SmartData (v9) | Chainlink Data Streams" + description: "Learn about Chainlink Data Streams SmartData (v9) schema, including fields, encoding, and examples for integrating NAV and POR data in your applications." + keywords: + [ + "Report Schema", + "SmartData", + "NAV", + "POR", + "Net Asset Value", + "Proof of Reserve", + "v9 Schema", + "Data Format", + "Report Structure", + ] --- import DataStreams from "@features/data-streams/common/DataStreams.astro" @@ -15,7 +26,7 @@ import ReportSchemaTabs from "@features/data-streams/common/ReportSchemaTabs.ast <ReportSchemaTabs /> -Chainlink NAV Data Streams streams adhere to the report schema outlined below. +Chainlink SmartData streams adhere to the report schema outlined below. This schema supports NAV (Net Asset Value) and POR (Proof of Reserve) feeds. ### Schema Fields diff --git a/src/content/data-streams/backed-streams/index.mdx b/src/content/data-streams/tokenized-asset-streams/index.mdx similarity index 100% rename from src/content/data-streams/backed-streams/index.mdx rename to src/content/data-streams/tokenized-asset-streams/index.mdx diff --git a/src/content/data-streams/tutorials/evm-onchain-report-verification.mdx b/src/content/data-streams/tutorials/evm-onchain-report-verification.mdx index a8156064cdb..7db36c88e7f 100644 --- a/src/content/data-streams/tutorials/evm-onchain-report-verification.mdx +++ b/src/content/data-streams/tutorials/evm-onchain-report-verification.mdx @@ -172,7 +172,7 @@ The `verifyReport` function is the core function that handles onchain report ver - Schema version `0x0003` corresponds to the [Crypto Advanced (v3)](/data-streams/reference/report-schema-v3). - Schema version `0x0008` corresponds to the [RWA Standard (v8)](/data-streams/reference/report-schema-v8). - Schema version `0x0007` corresponds to the [Redemption Rates (v7)](/data-streams/reference/report-schema-v7). - - Schema version `0x0009` corresponds to the [NAV (v9)](/data-streams/reference/report-schema-v9). + - Schema version `0x0009` corresponds to the [SmartData (v9)](/data-streams/reference/report-schema-v9). - Schema version `0x000A` corresponds to the [Tokenized Asset (v10)](/data-streams/reference/report-schema-v10). - Schema version `0x000B` corresponds to the [RWA Advanced (v11)](/data-streams/reference/report-schema-v11). - If the report version is unsupported, the function reverts with an InvalidReportVersion error. 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/feeds/components/Tables.tsx b/src/features/feeds/components/Tables.tsx index b6f47b96d7d..da7d8047741 100644 --- a/src/features/feeds/components/Tables.tsx +++ b/src/features/feeds/components/Tables.tsx @@ -1017,7 +1017,7 @@ export const StreamsTr = ({ metadata, isMainnet }) => { </dt> <dd> <a href="/data-streams/reference/report-schema-v9" rel="noreferrer" target="_blank"> - Report Schema v9 (NAV) + Report Schema v9 (SmartData) </a> </dd> </div> From 8ac0f5fc733f6493b10565337fabb8a55f2f6f53 Mon Sep 17 00:00:00 2001 From: devin distefano <devin.distefano@smartcontract.com> Date: Fri, 9 Jan 2026 14:55:21 -0800 Subject: [PATCH 104/214] schema-rename-fix (#3348) --- src/config/sidebar.ts | 4 ++-- src/content/data-streams/llms-full.txt | 24 +++++++++---------- .../reference/report-schema-overview.mdx | 10 ++++---- .../reference/report-schema-v9.mdx | 4 ++-- .../index.mdx | 6 ++--- src/features/feeds/components/FeedList.tsx | 4 ++-- 6 files changed, 26 insertions(+), 26 deletions(-) rename src/content/data-streams/{nav-streams => smartdata-streams}/index.mdx (63%) diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index 972be94e0e4..df151242456 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -881,8 +881,8 @@ export const SIDEBAR: Partial<Record<Sections, SectionEntry[]>> = { ], }, { - title: "Net Asset Value (NAV)", - url: "data-streams/nav-streams", + title: "SmartData", + url: "data-streams/smartdata-streams", children: [ { title: "Report Schema v9 (SmartData)", diff --git a/src/content/data-streams/llms-full.txt b/src/content/data-streams/llms-full.txt index 863aaca66ad..b88a78422e4 100644 --- a/src/content/data-streams/llms-full.txt +++ b/src/content/data-streams/llms-full.txt @@ -852,13 +852,6 @@ For comprehensive guidance on managing risks related to market hours, market gap --- -# Net Asset Value (NAV) Data Streams -Source: https://docs.chain.link/data-streams/nav-streams - -<FeedPage dataFeedType="streamsNav" initialNetwork="arbitrum" allowNetworkTableExpansion={true} defaultNetworkTableExpanded={false} /> - ---- - # Data Streams Candlestick API Source: https://docs.chain.link/data-streams/reference/candlestick-api @@ -5183,13 +5176,13 @@ The [RWA Advanced (v11)](/data-streams/reference/report-schema-v11) report schem These advanced fields enable protocols to implement more sophisticated risk management and settlement logic. Where applicable, streams using this schema can provide coverage across extended trading sessions including pre-market, post-market, and overnight hours — though extended hours availability varies by stream. See individual [RWA stream details](/data-streams/rwa-streams?schema=v11) for specific coverage and the [RWA Advanced (v11) reference](/data-streams/reference/report-schema-v11) for complete field specifications. -## Net Asset Value (NAV) +## SmartData -[Chainlink NAV streams](/data-streams/nav-streams) use the [SmartData (v9)](/data-streams/reference/report-schema-v9) report schema to provide real-time, tamper-proof access to the Net Asset Value (`navPerShare`) of tokenized assets, funds, or portfolios. Each report includes NAV per share (`navPerShare`), NAV date (`navDate`), assets under management (`aum`), and ripcord status (`ripcord`). The ripcord is set to true (`1`) by the asset issuer when the consumer should ignore the value being sent (for cases such as maintenance, upstream data source outages, etc). The feed data will remain stale until the ripcord returns false (`0`). +[Chainlink SmartData streams](/data-streams/smartdata-streams) use the [SmartData (v9)](/data-streams/reference/report-schema-v9) report schema to provide real-time, tamper-proof access to data such as Net Asset Value (`navPerShare`) of tokenized assets, funds, or portfolios, as well as Proof of Reserve data. Each report includes NAV per share (`navPerShare`), NAV date (`navDate`), assets under management (`aum`), and ripcord status (`ripcord`). The ripcord is set to true (`1`) by the asset issuer when the consumer should ignore the value being sent (for cases such as maintenance, upstream data source outages, etc). The feed data will remain stale until the ripcord returns false (`0`). NAV is a fundamental financial metric that represents the value of an investment vehicle such as a mutual fund or ETF and is calculated as the total assets minus the total liabilities. -Data Streams ensures that any NAV update, whenever it occurs, is captured and made available immediately and at low latency, allowing for seamless integration with onchain applications alongside other real-time data streams. Although the NAV value may not change frequently, Data Streams provides the most recent NAV as soon as it is published by the source. +Data Streams ensures that any SmartData update, whenever it occurs, is captured and made available immediately and at low latency, allowing for seamless integration with onchain applications alongside other real-time data streams. Although the values may not change frequently, Data Streams provides the most recent data as soon as it is published by the source. ## Tokenized Asset @@ -5438,7 +5431,7 @@ Source: https://docs.chain.link/data-streams/reference/report-schema-v9 <DataStreams section="dsNotes" /> -Chainlink SmartData streams adhere to the report schema outlined below. This schema supports NAV (Net Asset Value) and POR (Proof of Reserve) feeds. +Chainlink SmartData streams adhere to the report schema outlined below. ### Schema Fields @@ -5457,7 +5450,7 @@ Chainlink SmartData streams adhere to the report schema outlined below. This sch **Notes:** -- Future NAV streams may use different report schemas. +- Future SmartData streams may use different report schemas. ##### `ripcord` Status @@ -5473,6 +5466,13 @@ Source: https://docs.chain.link/data-streams/rwa-streams --- +# SmartData Streams +Source: https://docs.chain.link/data-streams/smartdata-streams + +<FeedPage dataFeedType="streamsNav" initialNetwork="arbitrum" allowNetworkTableExpansion={true} defaultNetworkTableExpanded={false} /> + +--- + # Streams Trade Implementation Source: https://docs.chain.link/data-streams/streams-trade diff --git a/src/content/data-streams/reference/report-schema-overview.mdx b/src/content/data-streams/reference/report-schema-overview.mdx index d30eab13232..5fa73315609 100644 --- a/src/content/data-streams/reference/report-schema-overview.mdx +++ b/src/content/data-streams/reference/report-schema-overview.mdx @@ -83,12 +83,12 @@ Each stream category uses one or more report schemas to deliver data. Several ca </tr> <tr> <td> - <a href="/data-streams/nav-streams">NAV</a> + <a href="/data-streams/smartdata-streams">SmartData</a> </td> <td> <a href="/data-streams/reference/report-schema-v9">SmartData (v9)</a> </td> - <td>Net Asset Value (NAV)</td> + <td>Net Asset Value (NAV), Proof of Reserve (POR)</td> <td> <code>aum</code>, <code>navPerShare</code>, <code>navDate</code>, <code>ripcord</code> </td> @@ -155,13 +155,13 @@ The [RWA Advanced (v11)](/data-streams/reference/report-schema-v11) report schem These advanced fields enable protocols to implement more sophisticated risk management and settlement logic. Where applicable, streams using this schema can provide coverage across extended trading sessions including pre-market, post-market, and overnight hours — though extended hours availability varies by stream. See individual [RWA stream details](/data-streams/rwa-streams?schema=v11) for specific coverage and the [RWA Advanced (v11) reference](/data-streams/reference/report-schema-v11) for complete field specifications. -## Net Asset Value (NAV) +## SmartData -[Chainlink NAV streams](/data-streams/nav-streams) use the [SmartData (v9)](/data-streams/reference/report-schema-v9) report schema to provide real-time, tamper-proof access to the Net Asset Value (`navPerShare`) of tokenized assets, funds, or portfolios. Each report includes NAV per share (`navPerShare`), NAV date (`navDate`), assets under management (`aum`), and ripcord status (`ripcord`). The ripcord is set to true (`1`) by the asset issuer when the consumer should ignore the value being sent (for cases such as maintenance, upstream data source outages, etc). The feed data will remain stale until the ripcord returns false (`0`). +[Chainlink SmartData streams](/data-streams/smartdata-streams) use the [SmartData (v9)](/data-streams/reference/report-schema-v9) report schema to provide real-time, tamper-proof access to data such as Net Asset Value (`navPerShare`) of tokenized assets, funds, or portfolios, as well as Proof of Reserve data. Each report includes NAV per share (`navPerShare`), NAV date (`navDate`), assets under management (`aum`), and ripcord status (`ripcord`). The ripcord is set to true (`1`) by the asset issuer when the consumer should ignore the value being sent (for cases such as maintenance, upstream data source outages, etc). The feed data will remain stale until the ripcord returns false (`0`). NAV is a fundamental financial metric that represents the value of an investment vehicle such as a mutual fund or ETF and is calculated as the total assets minus the total liabilities. -Data Streams ensures that any NAV update, whenever it occurs, is captured and made available immediately and at low latency, allowing for seamless integration with onchain applications alongside other real-time data streams. Although the NAV value may not change frequently, Data Streams provides the most recent NAV as soon as it is published by the source. +Data Streams ensures that any SmartData update, whenever it occurs, is captured and made available immediately and at low latency, allowing for seamless integration with onchain applications alongside other real-time data streams. Although the values may not change frequently, Data Streams provides the most recent data as soon as it is published by the source. ## Tokenized Asset diff --git a/src/content/data-streams/reference/report-schema-v9.mdx b/src/content/data-streams/reference/report-schema-v9.mdx index 3d412ff26eb..26f6756affc 100644 --- a/src/content/data-streams/reference/report-schema-v9.mdx +++ b/src/content/data-streams/reference/report-schema-v9.mdx @@ -26,7 +26,7 @@ import ReportSchemaTabs from "@features/data-streams/common/ReportSchemaTabs.ast <ReportSchemaTabs /> -Chainlink SmartData streams adhere to the report schema outlined below. This schema supports NAV (Net Asset Value) and POR (Proof of Reserve) feeds. +Chainlink SmartData streams adhere to the report schema outlined below. ### Schema Fields @@ -45,7 +45,7 @@ Chainlink SmartData streams adhere to the report schema outlined below. This sch **Notes:** -- Future NAV streams may use different report schemas. +- Future SmartData streams may use different report schemas. ##### `ripcord` Status diff --git a/src/content/data-streams/nav-streams/index.mdx b/src/content/data-streams/smartdata-streams/index.mdx similarity index 63% rename from src/content/data-streams/nav-streams/index.mdx rename to src/content/data-streams/smartdata-streams/index.mdx index b7943ebed18..7c9b3cd61c9 100644 --- a/src/content/data-streams/nav-streams/index.mdx +++ b/src/content/data-streams/smartdata-streams/index.mdx @@ -1,10 +1,10 @@ --- section: dataStreams -title: "Net Asset Value (NAV) Data Streams" +title: "SmartData Streams" datafeedtype: streamsNav metadata: - title: "Net Asset Value (NAV) Data Streams" - description: "A list of available Data Streams Net Asset Value streams and their ID." + title: "SmartData Streams" + description: "A list of available SmartData streams including NAV and POR feeds and their IDs." date: Last Modified isIndex: true --- diff --git a/src/features/feeds/components/FeedList.tsx b/src/features/feeds/components/FeedList.tsx index c25fd36b477..8ce64923af8 100644 --- a/src/features/feeds/components/FeedList.tsx +++ b/src/features/feeds/components/FeedList.tsx @@ -727,7 +727,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" @@ -737,7 +737,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" From 38d8e3b755798231af0f1d811b5163e72581fb38 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Fri, 9 Jan 2026 18:42:57 -0500 Subject: [PATCH 105/214] Update getting started w/ latest ReceiverTemplate (#3349) * update getting started w/ latest ReceiverTemplate * nit --- public/samples/CRE/CalculatorConsumer.sol | 73 +++++++++++ .../part-4-writing-onchain-go.mdx | 116 ++++-------------- .../part-4-writing-onchain-ts.mdx | 114 ++++------------- src/content/cre/llms-full-go.txt | 73 ++++++----- src/content/cre/llms-full-ts.txt | 71 ++++++----- 5 files changed, 201 insertions(+), 246 deletions(-) create mode 100644 public/samples/CRE/CalculatorConsumer.sol 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/src/content/cre/getting-started/part-4-writing-onchain-go.mdx b/src/content/cre/getting-started/part-4-writing-onchain-go.mdx index 89c29c128db..2dc7b2d5ba5 100644 --- a/src/content/cre/getting-started/part-4-writing-onchain-go.mdx +++ b/src/content/cre/getting-started/part-4-writing-onchain-go.mdx @@ -11,7 +11,7 @@ metadata: --- import { Aside } from "@components" -import { CodeHighlightBlock } from "@components" +import { CodeHighlightBlock, CodeSample } from "@components" import part4Code from "./snippets/part-4-main.go?raw" In the previous parts, you successfully fetched offchain data and read from a smart contract. Now, you'll complete the "Onchain Calculator" by writing your computed result back to the blockchain. @@ -35,75 +35,9 @@ Here is the source code for the contract so you can see how it works: of how this works in a later guide. </Aside> -```solidity -// 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 This version uses ReceiverTemplate without configuring any security checks, making it compatible - * with the mock Forwarder used during simulation. All permission fields remain at their default zero - * values (disabled). - */ -contract CalculatorConsumer is 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); - - /** - * @dev The constructor doesn't set any security checks. - * The ReceiverTemplate parent constructor will initialize all permission fields to zero (disabled). - */ - constructor() {} - - /** - * @notice Implements the core business logic for processing reports. - * @dev This is called automatically by 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); - } -} -``` +<CodeSample src="samples/CRE/CalculatorConsumer.sol" /> -The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#code" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. You will use this address in your configuration file. +The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb#code" target="_blank" rel="noopener noreferrer">`0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb`</a>. You will use this address in your configuration file. ## Step 2: Generate the consumer contract binding @@ -119,7 +53,7 @@ You need to create a binding for the consumer contract so your workflow can inte {/* prettier-ignore */} ```json - [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"received","type":"address"},{"internalType":"address","name":"expected","type":"address"}],"name":"InvalidAuthor","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"expected","type":"address"}],"name":"InvalidSender","type":"error"},{"inputs":[{"internalType":"bytes32","name":"received","type":"bytes32"},{"internalType":"bytes32","name":"expected","type":"bytes32"}],"name":"InvalidWorkflowId","type":"error"},{"inputs":[{"internalType":"bytes10","name":"received","type":"bytes10"},{"internalType":"bytes10","name":"expected","type":"bytes10"}],"name":"InvalidWorkflowName","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"resultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finalResult","type":"uint256"}],"name":"ResultUpdated","type":"event"},{"inputs":[],"name":"expectedAuthor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expectedWorkflowId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expectedWorkflowName","outputs":[{"internalType":"bytes10","name":"","type":"bytes10"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"internalType":"struct CalculatorConsumer.CalculatorResult","name":"_prospectiveResult","type":"tuple"}],"name":"isResultAnomalous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestResult","outputs":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"bytes","name":"report","type":"bytes"}],"name":"onReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"results","outputs":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_author","type":"address"}],"name":"setExpectedAuthor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"setExpectedWorkflowId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes10","name":"_name","type":"bytes10"}],"name":"setExpectedWorkflowName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_forwarder","type":"address"}],"name":"setForwarderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}] + [{"inputs":[{"internalType":"address","name":"_forwarderAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"received","type":"address"},{"internalType":"address","name":"expected","type":"address"}],"name":"InvalidAuthor","type":"error"},{"inputs":[],"name":"InvalidForwarderAddress","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"expected","type":"address"}],"name":"InvalidSender","type":"error"},{"inputs":[{"internalType":"bytes32","name":"received","type":"bytes32"},{"internalType":"bytes32","name":"expected","type":"bytes32"}],"name":"InvalidWorkflowId","type":"error"},{"inputs":[{"internalType":"bytes10","name":"received","type":"bytes10"},{"internalType":"bytes10","name":"expected","type":"bytes10"}],"name":"InvalidWorkflowName","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"WorkflowNameRequiresAuthorValidation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAuthor","type":"address"},{"indexed":true,"internalType":"address","name":"newAuthor","type":"address"}],"name":"ExpectedAuthorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"previousId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newId","type":"bytes32"}],"name":"ExpectedWorkflowIdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes10","name":"previousName","type":"bytes10"},{"indexed":true,"internalType":"bytes10","name":"newName","type":"bytes10"}],"name":"ExpectedWorkflowNameUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousForwarder","type":"address"},{"indexed":true,"internalType":"address","name":"newForwarder","type":"address"}],"name":"ForwarderAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"resultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finalResult","type":"uint256"}],"name":"ResultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"SecurityWarning","type":"event"},{"inputs":[],"name":"getExpectedAuthor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExpectedWorkflowId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExpectedWorkflowName","outputs":[{"internalType":"bytes10","name":"","type":"bytes10"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getForwarderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"internalType":"struct CalculatorConsumer.CalculatorResult","name":"_prospectiveResult","type":"tuple"}],"name":"isResultAnomalous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestResult","outputs":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"bytes","name":"report","type":"bytes"}],"name":"onReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"results","outputs":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_author","type":"address"}],"name":"setExpectedAuthor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"setExpectedWorkflowId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setExpectedWorkflowName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_forwarder","type":"address"}],"name":"setForwarderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}] ``` 1. **Generate the bindings**: Run the binding generator to create Go bindings for all ABI files in your project. From your project root (`onchain-calculator/`), run: @@ -143,7 +77,7 @@ Add the `CalculatorConsumer` contract address to your `config.staging.json`: "evms": [ { "storageAddress": "0xa17CF997C28FF154eDBae1422e6a50BeF23927F4", - "calculatorConsumerAddress": "0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52", + "calculatorConsumerAddress": "0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb", "chainName": "ethereum-testnet-sepolia", "gasLimit": 500000 } @@ -207,34 +141,34 @@ Your workflow will now show the complete end-to-end execution, including the fin ```bash Workflow compiled -2025-12-09T13:36:10Z [SIMULATION] Simulator Initialized - -2025-12-09T13:36:10Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 -2025-12-09T13:36:10Z [USER LOG] msg="Successfully fetched offchain value" result=77 -2025-12-09T13:36:10Z [USER LOG] msg="Successfully read onchain value" result=22 -2025-12-09T13:36:10Z [USER LOG] msg="Final calculated result" result=99 -2025-12-09T13:36:10Z [USER LOG] msg="Updating calculator result" consumerAddress=0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52 -2025-12-09T13:36:10Z [USER LOG] msg="Writing report to consumer contract" offchainValue=77 onchainValue=22 finalResult=99 -2025-12-09T13:36:10Z [USER LOG] msg="Waiting for write report response" -2025-12-09T13:36:36Z [USER LOG] msg="Write report transaction succeeded" txHash=0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c -2025-12-09T13:36:36Z [USER LOG] msg="View transaction at" url=https://sepolia.etherscan.io/tx/0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c -2025-12-09T13:36:36Z [USER LOG] msg="Workflow finished successfully!" result="&{OffchainValue:+77 OnchainValue:+22 FinalResult:+99 TxHash:0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c}" +2026-01-09T17:56:29Z [SIMULATION] Simulator Initialized + +2026-01-09T17:56:29Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 +2026-01-09T17:56:29Z [USER LOG] msg="Successfully fetched offchain value" result=29 +2026-01-09T17:56:30Z [USER LOG] msg="Successfully read onchain value" result=22 +2026-01-09T17:56:30Z [USER LOG] msg="Final calculated result" result=51 +2026-01-09T17:56:30Z [USER LOG] msg="Updating calculator result" consumerAddress=0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb +2026-01-09T17:56:30Z [USER LOG] msg="Writing report to consumer contract" offchainValue=29 onchainValue=22 finalResult=51 +2026-01-09T17:56:30Z [USER LOG] msg="Waiting for write report response" +2026-01-09T17:56:36Z [USER LOG] msg="Write report transaction succeeded" txHash=0xa9f69bdf80329d16e175e19bb007fdbbd4d8f028aacb67d43a2832d6618d8a24 +2026-01-09T17:56:36Z [USER LOG] msg="View transaction at" url=https://sepolia.etherscan.io/tx/0xa9f69bdf80329d16e175e19bb007fdbbd4d8f028aacb67d43a2832d6618d8a24 +2026-01-09T17:56:36Z [USER LOG] msg="Workflow finished successfully!" result="&{OffchainValue:+29 OnchainValue:+22 FinalResult:+51 TxHash:0xa9f69bdf80329d16e175e19bb007fdbbd4d8f028aacb67d43a2832d6618d8a24}" Workflow Simulation Result: { - "FinalResult": 99, - "OffchainValue": 77, + "FinalResult": 51, + "OffchainValue": 29, "OnchainValue": 22, - "TxHash": "0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c" + "TxHash": "0xa9f69bdf80329d16e175e19bb007fdbbd4d8f028aacb67d43a2832d6618d8a24" } -2025-12-09T13:36:36Z [SIMULATION] Execution finished signal received -2025-12-09T13:36:36Z [SIMULATION] Skipping WorkflowEngineV2 +2026-01-09T17:56:36Z [SIMULATION] Execution finished signal received +2026-01-09T17:56:36Z [SIMULATION] Skipping WorkflowEngineV2 ``` -- **`[USER LOG]`**: You can see all of your `logger.Info()` calls showing the complete workflow execution, including the offchain value (`result=77`), onchain value (`result=22`), final calculation (`result=99`), and the transaction hash. +- **`[USER LOG]`**: You can see all of your `logger.Info()` calls showing the complete workflow execution, including the offchain value (`result=29`), onchain value (`result=22`), final calculation (`result=51`), and the transaction hash. - **`[SIMULATION]`**: These are system-level messages from the simulator showing its internal state. -- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` struct contains all the values (77 + 22 = 99) and the transaction hash confirming the write operation succeeded. +- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` struct contains all the values (29 + 22 = 51) and the transaction hash confirming the write operation succeeded. ## Step 7: Verify the result onchain @@ -256,7 +190,7 @@ You'll notice the transaction's `to` address is not the `CalculatorConsumer` con While your wallet interacted with the Forwarder, the `CalculatorConsumer` contract's state was still updated. You can verify this change directly on Etherscan: -- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#readContract" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. +- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb#readContract" target="_blank" rel="noopener noreferrer">`0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb`</a>. - Expand the `latestResult` function and click **Query**. The values should match the `finalResult`, `offchainValue`, and `onchainValue` from your workflow logs. This completes the end-to-end loop: triggering a workflow, fetching data, reading onchain state, and verifiably writing the result back to a public blockchain. diff --git a/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx b/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx index 2f488b3e63f..226b8719fef 100644 --- a/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx +++ b/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx @@ -11,7 +11,7 @@ metadata: --- import { Aside } from "@components" -import { CodeHighlightBlock } from "@components" +import { CodeHighlightBlock, CodeSample } from "@components" import part4Code from "./snippets/part-4-main.ts?raw" In the previous parts, you successfully fetched offchain data and read from a smart contract. Now, you'll complete the "Onchain Calculator" by writing your computed result back to the blockchain. @@ -35,75 +35,9 @@ Here is the source code for the contract so you can see how it works: of how this works in a later guide. </Aside> -```solidity -// 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 This version uses ReceiverTemplate without configuring any security checks, making it compatible - * with the mock Forwarder used during simulation. All permission fields remain at their default zero - * values (disabled). - */ -contract CalculatorConsumer is 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); - - /** - * @dev The constructor doesn't set any security checks. - * The ReceiverTemplate parent constructor will initialize all permission fields to zero (disabled). - */ - constructor() {} - - /** - * @notice Implements the core business logic for processing reports. - * @dev This is called automatically by 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); - } -} -``` +<CodeSample src="samples/CRE/CalculatorConsumer.sol" /> -The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#code" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. You will use this address in your configuration file. +The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb#code" target="_blank" rel="noopener noreferrer">`0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb`</a>. You will use this address in your configuration file. ## Step 2: Update your workflow configuration @@ -116,7 +50,7 @@ Add the `CalculatorConsumer` contract address to your `config.staging.json`: "evms": [ { "storageAddress": "0xa17CF997C28FF154eDBae1422e6a50BeF23927F4", - "calculatorConsumerAddress": "0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52", + "calculatorConsumerAddress": "0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb", "chainName": "ethereum-testnet-sepolia", "gasLimit": "500000" } @@ -208,34 +142,34 @@ Your workflow will now show the complete end-to-end execution, including the fin ```bash Workflow compiled -2025-12-09T13:31:18Z [SIMULATION] Simulator Initialized - -2025-12-09T13:31:18Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 -2025-12-09T13:31:18Z [USER LOG] Successfully fetched offchain value: 62 -2025-12-09T13:31:18Z [USER LOG] Successfully read onchain value: 22 -2025-12-09T13:31:18Z [USER LOG] Final calculated result: 84 -2025-12-09T13:31:18Z [USER LOG] Updating calculator result for consumer: 0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52 -2025-12-09T13:31:18Z [USER LOG] Writing report to consumer contract - offchainValue: 62, onchainValue: 22, finalResult: 84 -2025-12-09T13:31:48Z [USER LOG] Waiting for write report response -2025-12-09T13:31:48Z [USER LOG] Write report transaction succeeded: 0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2 -2025-12-09T13:31:48Z [USER LOG] View transaction at https://sepolia.etherscan.io/tx/0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2 -2025-12-09T13:31:48Z [USER LOG] Workflow finished successfully! offchainValue: 62, onchainValue: 22, finalResult: 84, txHash: 0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2 +2026-01-09T17:52:05Z [SIMULATION] Simulator Initialized + +2026-01-09T17:52:05Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 +2026-01-09T17:52:06Z [USER LOG] Successfully fetched offchain value: 68 +2026-01-09T17:52:06Z [USER LOG] Successfully read onchain value: 22 +2026-01-09T17:52:06Z [USER LOG] Final calculated result: 90 +2026-01-09T17:52:06Z [USER LOG] Updating calculator result for consumer: 0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb +2026-01-09T17:52:06Z [USER LOG] Writing report to consumer contract - offchainValue: 68, onchainValue: 22, finalResult: 90 +2026-01-09T17:52:12Z [USER LOG] Waiting for write report response +2026-01-09T17:52:12Z [USER LOG] Write report transaction succeeded: 0x6346d9eeca2f2875131d38aa9903a216f16e3cc7188f0ac6a1d5cd1fcbfbf9e6 +2026-01-09T17:52:12Z [USER LOG] View transaction at https://sepolia.etherscan.io/tx/0x6346d9eeca2f2875131d38aa9903a216f16e3cc7188f0ac6a1d5cd1fcbfbf9e6 +2026-01-09T17:52:12Z [USER LOG] Workflow finished successfully! offchainValue: 68, onchainValue: 22, finalResult: 90, txHash: 0x6346d9eeca2f2875131d38aa9903a216f16e3cc7188f0ac6a1d5cd1fcbfbf9e6 Workflow Simulation Result: { - "finalResult": 84, - "offchainValue": 62, + "finalResult": 90, + "offchainValue": 68, "onchainValue": 22, - "txHash": "0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2" + "txHash": "0x6346d9eeca2f2875131d38aa9903a216f16e3cc7188f0ac6a1d5cd1fcbfbf9e6" } -2025-12-09T13:31:48Z [SIMULATION] Execution finished signal received -2025-12-09T13:31:48Z [SIMULATION] Skipping WorkflowEngineV2 +2026-01-09T17:52:12Z [SIMULATION] Execution finished signal received +2026-01-09T17:52:12Z [SIMULATION] Skipping WorkflowEngineV2 ``` -- **`[USER LOG]`**: You can see all of your `logger.info()` calls showing the complete workflow execution, including the offchain value (`62`), onchain value (`22`), final calculation (`84`), and the transaction hash. +- **`[USER LOG]`**: You can see all of your `logger.info()` calls showing the complete workflow execution, including the offchain value (`68`), onchain value (`22`), final calculation (`90`), and the transaction hash. - **`[SIMULATION]`**: These are system-level messages from the simulator showing its internal state. -- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` object contains all the values (62 + 22 = 84) and the transaction hash confirming the write operation succeeded. +- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` object contains all the values (68 + 22 = 90) and the transaction hash confirming the write operation succeeded. ## Step 5: Verify the result onchain @@ -257,7 +191,7 @@ You'll notice the transaction's `to` address is not the `CalculatorConsumer` con While your wallet interacted with the Forwarder, the `CalculatorConsumer` contract's state was still updated. You can verify this change directly on Etherscan: -- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#readContract" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. +- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb#readContract" target="_blank" rel="noopener noreferrer">`0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb`</a>. - Expand the `latestResult` function and click **Query**. The values should match the `finalResult`, `offchainValue`, and `onchainValue` from your workflow logs. This completes the end-to-end loop: triggering a workflow, fetching data, reading onchain state, and verifiably writing the result back to a public blockchain. diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index bb53d50fe65..1d55a7ca102 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -9602,18 +9602,17 @@ Here is the source code for the contract so you can see how it works: of how this works in a later guide. </Aside> -```solidity +```sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import { ReceiverTemplate } from "./ReceiverTemplate.sol"; +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 This version uses ReceiverTemplate without configuring any security checks, making it compatible - * with the mock Forwarder used during simulation. All permission fields remain at their default zero - * values (disabled). + * @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 @@ -9632,16 +9631,22 @@ contract CalculatorConsumer is ReceiverTemplate { event ResultUpdated(uint256 indexed resultId, uint256 finalResult); /** - * @dev The constructor doesn't set any security checks. - * The ReceiverTemplate parent constructor will initialize all permission fields to zero (disabled). + * @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() {} + 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 { + function _processReport( + bytes calldata report + ) internal override { // Decode the report bytes into our CalculatorResult struct CalculatorResult memory calculatorResult = abi.decode(report, (CalculatorResult)); @@ -9657,7 +9662,9 @@ contract CalculatorConsumer is ReceiverTemplate { // 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) { + 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; @@ -9670,7 +9677,7 @@ contract CalculatorConsumer is ReceiverTemplate { } ``` -The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#code" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. You will use this address in your configuration file. +The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb#code" target="_blank" rel="noopener noreferrer">`0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb`</a>. You will use this address in your configuration file. ## Step 2: Generate the consumer contract binding @@ -9686,7 +9693,7 @@ You need to create a binding for the consumer contract so your workflow can inte ```json - [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"received","type":"address"},{"internalType":"address","name":"expected","type":"address"}],"name":"InvalidAuthor","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"expected","type":"address"}],"name":"InvalidSender","type":"error"},{"inputs":[{"internalType":"bytes32","name":"received","type":"bytes32"},{"internalType":"bytes32","name":"expected","type":"bytes32"}],"name":"InvalidWorkflowId","type":"error"},{"inputs":[{"internalType":"bytes10","name":"received","type":"bytes10"},{"internalType":"bytes10","name":"expected","type":"bytes10"}],"name":"InvalidWorkflowName","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"resultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finalResult","type":"uint256"}],"name":"ResultUpdated","type":"event"},{"inputs":[],"name":"expectedAuthor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expectedWorkflowId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expectedWorkflowName","outputs":[{"internalType":"bytes10","name":"","type":"bytes10"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"internalType":"struct CalculatorConsumer.CalculatorResult","name":"_prospectiveResult","type":"tuple"}],"name":"isResultAnomalous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestResult","outputs":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"bytes","name":"report","type":"bytes"}],"name":"onReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"results","outputs":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_author","type":"address"}],"name":"setExpectedAuthor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"setExpectedWorkflowId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes10","name":"_name","type":"bytes10"}],"name":"setExpectedWorkflowName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_forwarder","type":"address"}],"name":"setForwarderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}] + [{"inputs":[{"internalType":"address","name":"_forwarderAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"received","type":"address"},{"internalType":"address","name":"expected","type":"address"}],"name":"InvalidAuthor","type":"error"},{"inputs":[],"name":"InvalidForwarderAddress","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"expected","type":"address"}],"name":"InvalidSender","type":"error"},{"inputs":[{"internalType":"bytes32","name":"received","type":"bytes32"},{"internalType":"bytes32","name":"expected","type":"bytes32"}],"name":"InvalidWorkflowId","type":"error"},{"inputs":[{"internalType":"bytes10","name":"received","type":"bytes10"},{"internalType":"bytes10","name":"expected","type":"bytes10"}],"name":"InvalidWorkflowName","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"WorkflowNameRequiresAuthorValidation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAuthor","type":"address"},{"indexed":true,"internalType":"address","name":"newAuthor","type":"address"}],"name":"ExpectedAuthorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"previousId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newId","type":"bytes32"}],"name":"ExpectedWorkflowIdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes10","name":"previousName","type":"bytes10"},{"indexed":true,"internalType":"bytes10","name":"newName","type":"bytes10"}],"name":"ExpectedWorkflowNameUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousForwarder","type":"address"},{"indexed":true,"internalType":"address","name":"newForwarder","type":"address"}],"name":"ForwarderAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"resultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finalResult","type":"uint256"}],"name":"ResultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"SecurityWarning","type":"event"},{"inputs":[],"name":"getExpectedAuthor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExpectedWorkflowId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExpectedWorkflowName","outputs":[{"internalType":"bytes10","name":"","type":"bytes10"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getForwarderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"internalType":"struct CalculatorConsumer.CalculatorResult","name":"_prospectiveResult","type":"tuple"}],"name":"isResultAnomalous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestResult","outputs":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"bytes","name":"report","type":"bytes"}],"name":"onReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"results","outputs":[{"internalType":"uint256","name":"offchainValue","type":"uint256"},{"internalType":"int256","name":"onchainValue","type":"int256"},{"internalType":"uint256","name":"finalResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_author","type":"address"}],"name":"setExpectedAuthor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"setExpectedWorkflowId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setExpectedWorkflowName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_forwarder","type":"address"}],"name":"setForwarderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}] ``` 3. **Generate the bindings**: Run the binding generator to create Go bindings for all ABI files in your project. From your project root (`onchain-calculator/`), run: @@ -9710,7 +9717,7 @@ Add the `CalculatorConsumer` contract address to your `config.staging.json`: "evms": [ { "storageAddress": "0xa17CF997C28FF154eDBae1422e6a50BeF23927F4", - "calculatorConsumerAddress": "0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52", + "calculatorConsumerAddress": "0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb", "chainName": "ethereum-testnet-sepolia", "gasLimit": 500000 } @@ -9952,34 +9959,34 @@ Your workflow will now show the complete end-to-end execution, including the fin ```bash Workflow compiled -2025-12-09T13:36:10Z [SIMULATION] Simulator Initialized - -2025-12-09T13:36:10Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 -2025-12-09T13:36:10Z [USER LOG] msg="Successfully fetched offchain value" result=77 -2025-12-09T13:36:10Z [USER LOG] msg="Successfully read onchain value" result=22 -2025-12-09T13:36:10Z [USER LOG] msg="Final calculated result" result=99 -2025-12-09T13:36:10Z [USER LOG] msg="Updating calculator result" consumerAddress=0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52 -2025-12-09T13:36:10Z [USER LOG] msg="Writing report to consumer contract" offchainValue=77 onchainValue=22 finalResult=99 -2025-12-09T13:36:10Z [USER LOG] msg="Waiting for write report response" -2025-12-09T13:36:36Z [USER LOG] msg="Write report transaction succeeded" txHash=0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c -2025-12-09T13:36:36Z [USER LOG] msg="View transaction at" url=https://sepolia.etherscan.io/tx/0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c -2025-12-09T13:36:36Z [USER LOG] msg="Workflow finished successfully!" result="&{OffchainValue:+77 OnchainValue:+22 FinalResult:+99 TxHash:0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c}" +2026-01-09T17:56:29Z [SIMULATION] Simulator Initialized + +2026-01-09T17:56:29Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 +2026-01-09T17:56:29Z [USER LOG] msg="Successfully fetched offchain value" result=29 +2026-01-09T17:56:30Z [USER LOG] msg="Successfully read onchain value" result=22 +2026-01-09T17:56:30Z [USER LOG] msg="Final calculated result" result=51 +2026-01-09T17:56:30Z [USER LOG] msg="Updating calculator result" consumerAddress=0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb +2026-01-09T17:56:30Z [USER LOG] msg="Writing report to consumer contract" offchainValue=29 onchainValue=22 finalResult=51 +2026-01-09T17:56:30Z [USER LOG] msg="Waiting for write report response" +2026-01-09T17:56:36Z [USER LOG] msg="Write report transaction succeeded" txHash=0xa9f69bdf80329d16e175e19bb007fdbbd4d8f028aacb67d43a2832d6618d8a24 +2026-01-09T17:56:36Z [USER LOG] msg="View transaction at" url=https://sepolia.etherscan.io/tx/0xa9f69bdf80329d16e175e19bb007fdbbd4d8f028aacb67d43a2832d6618d8a24 +2026-01-09T17:56:36Z [USER LOG] msg="Workflow finished successfully!" result="&{OffchainValue:+29 OnchainValue:+22 FinalResult:+51 TxHash:0xa9f69bdf80329d16e175e19bb007fdbbd4d8f028aacb67d43a2832d6618d8a24}" Workflow Simulation Result: { - "FinalResult": 99, - "OffchainValue": 77, + "FinalResult": 51, + "OffchainValue": 29, "OnchainValue": 22, - "TxHash": "0xaf3a4bf742bac76361c0eb4bc4ea58290049a3d97e991fb80bf0a8f17719527c" + "TxHash": "0xa9f69bdf80329d16e175e19bb007fdbbd4d8f028aacb67d43a2832d6618d8a24" } -2025-12-09T13:36:36Z [SIMULATION] Execution finished signal received -2025-12-09T13:36:36Z [SIMULATION] Skipping WorkflowEngineV2 +2026-01-09T17:56:36Z [SIMULATION] Execution finished signal received +2026-01-09T17:56:36Z [SIMULATION] Skipping WorkflowEngineV2 ``` -- **`[USER LOG]`**: You can see all of your `logger.Info()` calls showing the complete workflow execution, including the offchain value (`result=77`), onchain value (`result=22`), final calculation (`result=99`), and the transaction hash. +- **`[USER LOG]`**: You can see all of your `logger.Info()` calls showing the complete workflow execution, including the offchain value (`result=29`), onchain value (`result=22`), final calculation (`result=51`), and the transaction hash. - **`[SIMULATION]`**: These are system-level messages from the simulator showing its internal state. -- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` struct contains all the values (77 + 22 = 99) and the transaction hash confirming the write operation succeeded. +- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` struct contains all the values (29 + 22 = 51) and the transaction hash confirming the write operation succeeded. ## Step 7: Verify the result onchain @@ -10001,7 +10008,7 @@ You'll notice the transaction's `to` address is not the `CalculatorConsumer` con While your wallet interacted with the Forwarder, the `CalculatorConsumer` contract's state was still updated. You can verify this change directly on Etherscan: -- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#readContract" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. +- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb#readContract" target="_blank" rel="noopener noreferrer">`0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb`</a>. - Expand the `latestResult` function and click **Query**. The values should match the `finalResult`, `offchainValue`, and `onchainValue` from your workflow logs. This completes the end-to-end loop: triggering a workflow, fetching data, reading onchain state, and verifiably writing the result back to a public blockchain. diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index 9fd38ce33b3..f18d5447453 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -8374,18 +8374,17 @@ Here is the source code for the contract so you can see how it works: of how this works in a later guide. </Aside> -```solidity +```sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; -import { ReceiverTemplate } from "./ReceiverTemplate.sol"; +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 This version uses ReceiverTemplate without configuring any security checks, making it compatible - * with the mock Forwarder used during simulation. All permission fields remain at their default zero - * values (disabled). + * @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 @@ -8404,16 +8403,22 @@ contract CalculatorConsumer is ReceiverTemplate { event ResultUpdated(uint256 indexed resultId, uint256 finalResult); /** - * @dev The constructor doesn't set any security checks. - * The ReceiverTemplate parent constructor will initialize all permission fields to zero (disabled). + * @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() {} + 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 { + function _processReport( + bytes calldata report + ) internal override { // Decode the report bytes into our CalculatorResult struct CalculatorResult memory calculatorResult = abi.decode(report, (CalculatorResult)); @@ -8429,7 +8434,9 @@ contract CalculatorConsumer is ReceiverTemplate { // 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) { + 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; @@ -8442,7 +8449,7 @@ contract CalculatorConsumer is ReceiverTemplate { } ``` -The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#code" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. You will use this address in your configuration file. +The contract is already deployed for you on Sepolia at the following address: <a href="https://sepolia.etherscan.io/address/0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb#code" target="_blank" rel="noopener noreferrer">`0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb`</a>. You will use this address in your configuration file. ## Step 2: Update your workflow configuration @@ -8455,7 +8462,7 @@ Add the `CalculatorConsumer` contract address to your `config.staging.json`: "evms": [ { "storageAddress": "0xa17CF997C28FF154eDBae1422e6a50BeF23927F4", - "calculatorConsumerAddress": "0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52", + "calculatorConsumerAddress": "0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb", "chainName": "ethereum-testnet-sepolia", "gasLimit": "500000" } @@ -8744,34 +8751,34 @@ Your workflow will now show the complete end-to-end execution, including the fin ```bash Workflow compiled -2025-12-09T13:31:18Z [SIMULATION] Simulator Initialized - -2025-12-09T13:31:18Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 -2025-12-09T13:31:18Z [USER LOG] Successfully fetched offchain value: 62 -2025-12-09T13:31:18Z [USER LOG] Successfully read onchain value: 22 -2025-12-09T13:31:18Z [USER LOG] Final calculated result: 84 -2025-12-09T13:31:18Z [USER LOG] Updating calculator result for consumer: 0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52 -2025-12-09T13:31:18Z [USER LOG] Writing report to consumer contract - offchainValue: 62, onchainValue: 22, finalResult: 84 -2025-12-09T13:31:48Z [USER LOG] Waiting for write report response -2025-12-09T13:31:48Z [USER LOG] Write report transaction succeeded: 0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2 -2025-12-09T13:31:48Z [USER LOG] View transaction at https://sepolia.etherscan.io/tx/0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2 -2025-12-09T13:31:48Z [USER LOG] Workflow finished successfully! offchainValue: 62, onchainValue: 22, finalResult: 84, txHash: 0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2 +2026-01-09T17:52:05Z [SIMULATION] Simulator Initialized + +2026-01-09T17:52:05Z [SIMULATION] Running trigger trigger=cron-trigger@1.0.0 +2026-01-09T17:52:06Z [USER LOG] Successfully fetched offchain value: 68 +2026-01-09T17:52:06Z [USER LOG] Successfully read onchain value: 22 +2026-01-09T17:52:06Z [USER LOG] Final calculated result: 90 +2026-01-09T17:52:06Z [USER LOG] Updating calculator result for consumer: 0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb +2026-01-09T17:52:06Z [USER LOG] Writing report to consumer contract - offchainValue: 68, onchainValue: 22, finalResult: 90 +2026-01-09T17:52:12Z [USER LOG] Waiting for write report response +2026-01-09T17:52:12Z [USER LOG] Write report transaction succeeded: 0x6346d9eeca2f2875131d38aa9903a216f16e3cc7188f0ac6a1d5cd1fcbfbf9e6 +2026-01-09T17:52:12Z [USER LOG] View transaction at https://sepolia.etherscan.io/tx/0x6346d9eeca2f2875131d38aa9903a216f16e3cc7188f0ac6a1d5cd1fcbfbf9e6 +2026-01-09T17:52:12Z [USER LOG] Workflow finished successfully! offchainValue: 68, onchainValue: 22, finalResult: 90, txHash: 0x6346d9eeca2f2875131d38aa9903a216f16e3cc7188f0ac6a1d5cd1fcbfbf9e6 Workflow Simulation Result: { - "finalResult": 84, - "offchainValue": 62, + "finalResult": 90, + "offchainValue": 68, "onchainValue": 22, - "txHash": "0x7e2e58613f4d8414826d2e6164e42b110fefb97137a1065ac69d1c3decd259f2" + "txHash": "0x6346d9eeca2f2875131d38aa9903a216f16e3cc7188f0ac6a1d5cd1fcbfbf9e6" } -2025-12-09T13:31:48Z [SIMULATION] Execution finished signal received -2025-12-09T13:31:48Z [SIMULATION] Skipping WorkflowEngineV2 +2026-01-09T17:52:12Z [SIMULATION] Execution finished signal received +2026-01-09T17:52:12Z [SIMULATION] Skipping WorkflowEngineV2 ``` -- **`[USER LOG]`**: You can see all of your `logger.info()` calls showing the complete workflow execution, including the offchain value (`62`), onchain value (`22`), final calculation (`84`), and the transaction hash. +- **`[USER LOG]`**: You can see all of your `logger.info()` calls showing the complete workflow execution, including the offchain value (`68`), onchain value (`22`), final calculation (`90`), and the transaction hash. - **`[SIMULATION]`**: These are system-level messages from the simulator showing its internal state. -- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` object contains all the values (62 + 22 = 84) and the transaction hash confirming the write operation succeeded. +- **`Workflow Simulation Result`**: This is the final return value of your workflow. The `MyResult` object contains all the values (68 + 22 = 90) and the transaction hash confirming the write operation succeeded. ## Step 5: Verify the result onchain @@ -8793,7 +8800,7 @@ You'll notice the transaction's `to` address is not the `CalculatorConsumer` con While your wallet interacted with the Forwarder, the `CalculatorConsumer` contract's state was still updated. You can verify this change directly on Etherscan: -- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52#readContract" target="_blank" rel="noopener noreferrer">`0x10785f51B1Fccd94b7e386FDc83b9d50C71C0e52`</a>. +- Navigate to the `CalculatorConsumer` contract address: <a href="https://sepolia.etherscan.io/address/0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb#readContract" target="_blank" rel="noopener noreferrer">`0x95e10BaC2B89aB4D8508ccEC3f08494FcB3D23cb`</a>. - Expand the `latestResult` function and click **Query**. The values should match the `finalResult`, `offchainValue`, and `onchainValue` from your workflow logs. This completes the end-to-end loop: triggering a workflow, fetching data, reading onchain state, and verifiably writing the result back to a public blockchain. From c3a0580a41261442720a9b365f3d0e4c8f08cfd0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 14:59:06 +0100 Subject: [PATCH 106/214] Changelog Update: New data found (#3351) * Data: Update changelog for new data items * nit formatting --------- Co-authored-by: khadni <98668332+khadni@users.noreply.github.com> --- .github/scripts/data/baseline.json | 5 ++++- public/changelog.json | 34 ++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/.github/scripts/data/baseline.json b/.github/scripts/data/baseline.json index c002c4a4089..d4f08bd498b 100644 --- a/.github/scripts/data/baseline.json +++ b/.github/scripts/data/baseline.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-01-04T21:03:29Z", + "timestamp": "2026-01-11T21:03:19Z", "knownIds": [ "aptos-apt-usd", "aptos-btc-usd", @@ -1127,6 +1127,7 @@ "bnb-chain-zar-usd", "bnb-chain-zbu-usd", "bob-baby-usd", + "bob-bob-usd", "bob-btc-usd", "bob-eth-usd", "bob-lbtc-btc", @@ -1396,6 +1397,7 @@ "ethereum-usdt-usd", "ethereum-usdt-usd-shared-svr", "ethereum-usdt-usd-svr", + "ethereum-usdtb-usd", "ethereum-usr-usd", "ethereum-ustb-aum", "ethereum-ustb-nav", @@ -1590,6 +1592,7 @@ "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", diff --git a/public/changelog.json b/public/changelog.json index 2eeb231bd65..242c8db4876 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -358,6 +358,40 @@ } }, "data": [ + { + "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-07", From 5f01d53a29709753c49292f17d968845d031e795 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:05:30 +0100 Subject: [PATCH 107/214] Bump the astro-framework group with 2 updates (#3353) Bumps the astro-framework group with 2 updates: [@astrojs/sitemap](https://github.com/withastro/astro/tree/HEAD/packages/integrations/sitemap) and [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro). Updates `@astrojs/sitemap` from 3.6.0 to 3.6.1 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/sitemap/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/@astrojs/sitemap@3.6.1/packages/integrations/sitemap) Updates `astro` from 5.16.6 to 5.16.8 - [Release notes](https://github.com/withastro/astro/releases) - [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md) - [Commits](https://github.com/withastro/astro/commits/astro@5.16.8/packages/astro) --- updated-dependencies: - dependency-name: "@astrojs/sitemap" dependency-version: 3.6.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: astro-framework - dependency-name: astro dependency-version: 5.16.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: astro-framework ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> --- package-lock.json | 185 +++++++++++++++------------------------------- package.json | 4 +- 2 files changed, 61 insertions(+), 128 deletions(-) diff --git a/package-lock.json b/package-lock.json index a4eee44542c..0e856a3b7d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@astrojs/preact": "^4.1.3", "@astrojs/prism": "^3.3.0", "@astrojs/react": "^4.4.2", - "@astrojs/sitemap": "^3.6.0", + "@astrojs/sitemap": "^3.6.1", "@astrojs/vercel": "^8.2.11", "@chainlink/cl-search-frontend": "^0.12.1", "@chainlink/components": "^0.4.18", @@ -44,7 +44,7 @@ "@solana/wallet-adapter-solflare": "^0.6.32", "@solana/wallet-adapter-trust": "^0.1.17", "@supabase/supabase-js": "^2.89.0", - "astro": "^5.16.6", + "astro": "^5.16.8", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", "clipboard": "^2.0.11", @@ -637,12 +637,12 @@ } }, "node_modules/@astrojs/sitemap": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.6.0.tgz", - "integrity": "sha512-4aHkvcOZBWJigRmMIAJwRQXBS+ayoP5z40OklTXYXhUDhwusz+DyDl+nSshY6y9DvkVEavwNcFO8FD81iGhXjg==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.6.1.tgz", + "integrity": "sha512-+o+TbxXqQJAOd+HxCjz/5RdAMrRFGjeuO+U6zddUuTO59WqMqXnsc8uveRiEr2Ff+3McZiEne7iG4J5cnuI6kA==", "license": "MIT", "dependencies": { - "sitemap": "^8.0.0", + "sitemap": "^8.0.2", "stream-replace-string": "^2.0.0", "zod": "^3.25.76" } @@ -1286,12 +1286,12 @@ "peer": true }, "node_modules/@capsizecss/unpack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-3.0.1.tgz", - "integrity": "sha512-8XqW8xGn++Eqqbz3e9wKuK7mxryeRjs4LOHLxbh2lwKeSbuNR4NFifDZT4KzvjU6HMOPbiNTsWpniK5EJfTWkg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", + "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", "license": "MIT", "dependencies": { - "fontkit": "^2.0.2" + "fontkitten": "^1.0.0" }, "engines": { "node": ">=18" @@ -15145,15 +15145,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", @@ -16914,16 +16905,16 @@ } }, "node_modules/astro": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.6.tgz", - "integrity": "sha512-6mF/YrvwwRxLTu+aMEa5pwzKUNl5ZetWbTyZCs9Um0F12HUmxUiF5UHiZPy4rifzU3gtpM3xP2DfdmkNX9eZRg==", + "version": "5.16.8", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.8.tgz", + "integrity": "sha512-gzZE+epuCrNuxOa8/F1dzkllDOFvxWhGeobQKeBRIAef5sUpUKMHZo/8clse+02rYnKJCgwXBgjW4uTu9mqUUw==", "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", "@astrojs/markdown-remark": "6.3.10", "@astrojs/telemetry": "3.3.0", - "@capsizecss/unpack": "^3.0.1", + "@capsizecss/unpack": "^4.0.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "acorn": "^8.15.0", @@ -16933,11 +16924,11 @@ "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", + "devalue": "^5.6.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", @@ -16945,7 +16936,7 @@ "esbuild": "^0.25.0", "estree-walker": "^3.0.3", "flattie": "^1.1.1", - "fontace": "~0.3.1", + "fontace": "~0.4.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", @@ -16957,20 +16948,20 @@ "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.2", + "shiki": "^3.20.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.1", "unist-util-visit": "^5.0.0", "unstorage": "^1.17.3", "vfile": "^6.0.3", @@ -16980,7 +16971,7 @@ "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.3", "zod": "^3.25.76", - "zod-to-json-schema": "^3.25.0", + "zod-to-json-schema": "^3.25.1", "zod-to-ts": "^1.2.0" }, "bin": { @@ -17113,9 +17104,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": { @@ -17713,15 +17704,6 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "license": "MIT" }, - "node_modules/brotli": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", - "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.1.2" - } - }, "node_modules/browserslist": { "version": "4.28.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", @@ -18465,15 +18447,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", @@ -18641,12 +18614,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": { @@ -19227,9 +19204,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.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", + "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", "license": "MIT" }, "node_modules/devlop": { @@ -19245,12 +19222,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", @@ -21348,30 +21319,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": { @@ -33129,12 +33094,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", @@ -34050,9 +34009,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" @@ -36271,32 +36230,6 @@ "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==", - "license": "MIT" - }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -36317,14 +36250,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.1", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.1.tgz", + "integrity": "sha512-0lg9M1cMYvXof8//wZBq6EDEfbwv4++t7+dYpXeS2ypaLuZJmUFYEwTm412/1ED/Wfo/wyzSu6kNZEr9hgRNfg==", "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": { @@ -37463,9 +37396,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 ef981b9461d..8ac0e2534c5 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "@astrojs/preact": "^4.1.3", "@astrojs/prism": "^3.3.0", "@astrojs/react": "^4.4.2", - "@astrojs/sitemap": "^3.6.0", + "@astrojs/sitemap": "^3.6.1", "@astrojs/vercel": "^8.2.11", "@chainlink/cl-search-frontend": "^0.12.1", "@chainlink/components": "^0.4.18", @@ -89,7 +89,7 @@ "@solana/wallet-adapter-solflare": "^0.6.32", "@solana/wallet-adapter-trust": "^0.1.17", "@supabase/supabase-js": "^2.89.0", - "astro": "^5.16.6", + "astro": "^5.16.8", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", "clipboard": "^2.0.11", From 71a8fd86aa7873d961e115d85cf335fc5bf13034 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:11:31 +0100 Subject: [PATCH 108/214] Bump the ui-frameworks group with 2 updates (#3354) Bumps the ui-frameworks group with 2 updates: [focus-trap-react](https://github.com/focus-trap/focus-trap-react) and [preact](https://github.com/preactjs/preact). Updates `focus-trap-react` from 11.0.4 to 11.0.6 - [Release notes](https://github.com/focus-trap/focus-trap-react/releases) - [Changelog](https://github.com/focus-trap/focus-trap-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/focus-trap/focus-trap-react/compare/v11.0.4...v11.0.6) Updates `preact` from 10.28.1 to 10.28.2 - [Release notes](https://github.com/preactjs/preact/releases) - [Commits](https://github.com/preactjs/preact/compare/10.28.1...10.28.2) --- updated-dependencies: - dependency-name: focus-trap-react dependency-version: 11.0.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: ui-frameworks - dependency-name: preact dependency-version: 10.28.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: ui-frameworks ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> --- package-lock.json | 34 +++++++++++++++++----------------- package.json | 4 ++-- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0e856a3b7d1..4bad2dec10c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,14 +50,14 @@ "clipboard": "^2.0.11", "dotenv": "^16.6.1", "ethers": "^6.16.0", - "focus-trap-react": "^11.0.4", + "focus-trap-react": "^11.0.6", "github-slugger": "^2.0.0", "lodash": "^4.17.21", "marked": "^15.0.12", "nanostores": "^0.11.4", "next": "14.2.35", "pino": "^9.14.0", - "preact": "^10.28.1", + "preact": "^10.28.2", "react-instantsearch": "^7.22.1", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", @@ -21274,22 +21274,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", @@ -31349,9 +31349,9 @@ "license": "MIT" }, "node_modules/preact": { - "version": "10.28.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.1.tgz", - "integrity": "sha512-u1/ixq/lVQI0CakKNvLDEcW5zfCjUQfZdK9qqWuIJtsezuyG6pk9TWj75GMuI/EzRSZB/VAE43sNWWZfiy8psw==", + "version": "10.28.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.2.tgz", + "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==", "license": "MIT", "funding": { "type": "opencollective", @@ -34876,9 +34876,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": { diff --git a/package.json b/package.json index 8ac0e2534c5..d72534ffdfa 100644 --- a/package.json +++ b/package.json @@ -95,14 +95,14 @@ "clipboard": "^2.0.11", "dotenv": "^16.6.1", "ethers": "^6.16.0", - "focus-trap-react": "^11.0.4", + "focus-trap-react": "^11.0.6", "github-slugger": "^2.0.0", "lodash": "^4.17.21", "marked": "^15.0.12", "nanostores": "^0.11.4", "next": "14.2.35", "pino": "^9.14.0", - "preact": "^10.28.1", + "preact": "^10.28.2", "react-instantsearch": "^7.22.1", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", From 3c7dbf4eac651aa3caef62d61f1684b76142f879 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:19:32 +0100 Subject: [PATCH 109/214] Bump the typescript group with 3 updates (#3356) Bumps the typescript group with 3 updates: [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react). Updates `@types/lodash` from 4.17.21 to 4.17.23 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lodash) Updates `@types/node` from 20.19.27 to 20.19.28 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@types/react` from 19.2.7 to 19.2.8 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/lodash" dependency-version: 4.17.23 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: typescript - dependency-name: "@types/node" dependency-version: 20.19.28 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: typescript - dependency-name: "@types/react" dependency-version: 19.2.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: typescript ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> --- package-lock.json | 24 ++++++++++++------------ package.json | 6 +++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4bad2dec10c..46e3b788006 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,11 +74,11 @@ "@project-serum/anchor": "^0.26.0", "@rollup/plugin-yaml": "^4.1.2", "@types/jest": "^29.5.14", - "@types/lodash": "^4.17.21", - "@types/node": "^20.19.27", + "@types/lodash": "^4.17.23", + "@types/node": "^20.19.28", "@types/node-fetch": "^2.6.13", "@types/prismjs": "^1.26.5", - "@types/react": "^19.2.7", + "@types/react": "^19.2.8", "@types/react-dom": "^19.2.3", "@types/swagger-ui-dist": "^3.30.6", "@types/swagger-ui-react": "^5.18.0", @@ -15232,9 +15232,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", "license": "MIT" }, "node_modules/@types/mdast": { @@ -15268,9 +15268,9 @@ } }, "node_modules/@types/node": { - "version": "20.19.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", - "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", + "version": "20.19.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.28.tgz", + "integrity": "sha512-VyKBr25BuFDzBFCK5sUM6ZXiWfqgCTwTAOK8qzGV/m9FCirXYDlmczJ+d5dXBAQALGCdRRdbteKYfJ84NGEusw==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -15321,9 +15321,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.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz", + "integrity": "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==", "license": "MIT", "dependencies": { "csstype": "^3.2.2" diff --git a/package.json b/package.json index d72534ffdfa..98731e3d335 100644 --- a/package.json +++ b/package.json @@ -119,11 +119,11 @@ "@project-serum/anchor": "^0.26.0", "@rollup/plugin-yaml": "^4.1.2", "@types/jest": "^29.5.14", - "@types/lodash": "^4.17.21", - "@types/node": "^20.19.27", + "@types/lodash": "^4.17.23", + "@types/node": "^20.19.28", "@types/node-fetch": "^2.6.13", "@types/prismjs": "^1.26.5", - "@types/react": "^19.2.7", + "@types/react": "^19.2.8", "@types/react-dom": "^19.2.3", "@types/swagger-ui-dist": "^3.30.6", "@types/swagger-ui-react": "^5.18.0", From 3f6d22b201f8f44332ae83795832186a2a2d5117 Mon Sep 17 00:00:00 2001 From: root <rootdis@outlook.com> Date: Mon, 12 Jan 2026 22:31:22 +0800 Subject: [PATCH 110/214] Update copyright year to 2026 (#3343) * Update copyright years to 2026 * Update copyright year in LICENSE file --------- Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> --- LICENSE | 2 +- src/components/Footer/Footer.astro | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/src/components/Footer/Footer.astro b/src/components/Footer/Footer.astro index e78527acbe0..56a94cd0537 100644 --- a/src/components/Footer/Footer.astro +++ b/src/components/Footer/Footer.astro @@ -195,7 +195,7 @@ </a> <div class="paragraph small footer-chainlinkreg hidden-sm">Chainlink®</div> <div class="paragraph small footer-chainlinkreg hidden-sm"> - {" "}© 2025 Chainlink Foundation + {" "}© 2026 Chainlink Foundation </div> </div> <div class="col footer-privacyandterms"> From 14c0f89794b105eaf20ccfe0c89ab2801279907a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:37:22 +0100 Subject: [PATCH 111/214] Bump @supabase/supabase-js from 2.89.0 to 2.90.1 (#3358) Bumps [@supabase/supabase-js](https://github.com/supabase/supabase-js/tree/HEAD/packages/core/supabase-js) from 2.89.0 to 2.90.1. - [Release notes](https://github.com/supabase/supabase-js/releases) - [Changelog](https://github.com/supabase/supabase-js/blob/master/packages/core/supabase-js/CHANGELOG.md) - [Commits](https://github.com/supabase/supabase-js/commits/v2.90.1/packages/core/supabase-js) --- updated-dependencies: - dependency-name: "@supabase/supabase-js" dependency-version: 2.90.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> --- package-lock.json | 48 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 46e3b788006..5224b1e7567 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "@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.89.0", + "@supabase/supabase-js": "^2.90.1", "astro": "^5.16.8", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", @@ -14343,9 +14343,9 @@ "license": "MIT" }, "node_modules/@supabase/auth-js": { - "version": "2.89.0", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.89.0.tgz", - "integrity": "sha512-wiWZdz8WMad8LQdJMWYDZ2SJtZP5MwMqzQq3ehtW2ngiI3UTgbKiFrvMUUS3KADiVlk4LiGfODB2mrYx7w2f8w==", + "version": "2.90.1", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.90.1.tgz", + "integrity": "sha512-vxb66dgo6h3yyPbR06735Ps+dK3hj0JwS8w9fdQPVZQmocSTlKUW5MfxSy99mN0XqCCuLMQ3jCEiIIUU23e9ng==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14355,9 +14355,9 @@ } }, "node_modules/@supabase/functions-js": { - "version": "2.89.0", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.89.0.tgz", - "integrity": "sha512-XEueaC5gMe5NufNYfBh9kPwJlP5M2f+Ogr8rvhmRDAZNHgY6mI35RCkYDijd92pMcNM7g8pUUJov93UGUnqfyw==", + "version": "2.90.1", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.90.1.tgz", + "integrity": "sha512-x9mV9dF1Lam9qL3zlpP6mSM5C9iqMPtF5B/tU1Jj/F0ufX5mjDf9ghVBaErVxmrQJRL4+iMKWKY2GnODkpS8tw==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14367,9 +14367,9 @@ } }, "node_modules/@supabase/postgrest-js": { - "version": "2.89.0", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.89.0.tgz", - "integrity": "sha512-/b0fKrxV9i7RNOEXMno/I1862RsYhuUo+Q6m6z3ar1f4ulTMXnDfv0y4YYxK2POcgrOXQOgKYQx1eArybyNvtg==", + "version": "2.90.1", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.90.1.tgz", + "integrity": "sha512-jh6vqzaYzoFn3raaC0hcFt9h+Bt+uxNRBSdc7PfToQeRGk7PDPoweHsbdiPWREtDVTGKfu+PyPW9e2jbK+BCgQ==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -14379,9 +14379,9 @@ } }, "node_modules/@supabase/realtime-js": { - "version": "2.89.0", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.89.0.tgz", - "integrity": "sha512-aMOvfDb2a52u6PX6jrrjvACHXGV3zsOlWRzZsTIOAJa0hOVvRp01AwC1+nLTGUzxzezejrYeCX+KnnM1xHdl+w==", + "version": "2.90.1", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.90.1.tgz", + "integrity": "sha512-PWbnEMkcQRuor8jhObp4+Snufkq8C6fBp+MchVp2qBPY1NXk/c3Iv3YyiFYVzo0Dzuw4nAlT4+ahuPggy4r32w==", "license": "MIT", "dependencies": { "@types/phoenix": "^1.6.6", @@ -14394,9 +14394,9 @@ } }, "node_modules/@supabase/storage-js": { - "version": "2.89.0", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.89.0.tgz", - "integrity": "sha512-6zKcXofk/M/4Eato7iqpRh+B+vnxeiTumCIP+Tz26xEqIiywzD9JxHq+udRrDuv6hXE+pmetvJd8n5wcf4MFRQ==", + "version": "2.90.1", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.90.1.tgz", + "integrity": "sha512-GHY+Ps/K/RBfRj7kwx+iVf2HIdqOS43rM2iDOIDpapyUnGA9CCBFzFV/XvfzznGykd//z2dkGZhlZZprsVFqGg==", "license": "MIT", "dependencies": { "iceberg-js": "^0.8.1", @@ -14407,16 +14407,16 @@ } }, "node_modules/@supabase/supabase-js": { - "version": "2.89.0", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.89.0.tgz", - "integrity": "sha512-KlaRwSfFA0fD73PYVMHj5/iXFtQGCcX7PSx0FdQwYEEw9b2wqM7GxadY+5YwcmuEhalmjFB/YvqaoNVF+sWUlg==", + "version": "2.90.1", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.90.1.tgz", + "integrity": "sha512-U8KaKGLUgTIFHtwEW1dgw1gK7XrdpvvYo7nzzqPx721GqPe8WZbAiLh/hmyKLGBYQ/mmQNr20vU9tWSDZpii3w==", "license": "MIT", "dependencies": { - "@supabase/auth-js": "2.89.0", - "@supabase/functions-js": "2.89.0", - "@supabase/postgrest-js": "2.89.0", - "@supabase/realtime-js": "2.89.0", - "@supabase/storage-js": "2.89.0" + "@supabase/auth-js": "2.90.1", + "@supabase/functions-js": "2.90.1", + "@supabase/postgrest-js": "2.90.1", + "@supabase/realtime-js": "2.90.1", + "@supabase/storage-js": "2.90.1" }, "engines": { "node": ">=20.0.0" diff --git a/package.json b/package.json index 98731e3d335..bb0d2c77ba9 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@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.89.0", + "@supabase/supabase-js": "^2.90.1", "astro": "^5.16.8", "bignumber.js": "^9.3.1", "bs58": "^6.0.0", From 40db65061510990fbe2ed36d0c4e60578e687928 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:43:50 +0100 Subject: [PATCH 112/214] Bump knip from 5.79.0 to 5.80.2 in the linting-tools group (#3355) Bumps the linting-tools group with 1 update: [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip). Updates `knip` from 5.79.0 to 5.80.2 - [Release notes](https://github.com/webpro-nl/knip/releases) - [Commits](https://github.com/webpro-nl/knip/commits/knip@5.80.2/packages/knip) --- updated-dependencies: - dependency-name: knip dependency-version: 5.80.2 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: linting-tools ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5224b1e7567..291aa7d520f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,7 +93,7 @@ "eslint-plugin-promise": "^6.1.1", "husky": "^9.1.7", "jest-yaml-transform": "^0.2.0", - "knip": "^5.79.0", + "knip": "^5.80.2", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", "pino-pretty": "^13.1.3", @@ -27187,9 +27187,9 @@ } }, "node_modules/knip": { - "version": "5.79.0", - "resolved": "https://registry.npmjs.org/knip/-/knip-5.79.0.tgz", - "integrity": "sha512-rcg+mNdqm6UiTuRVyy6UuuHw1n4ABMpNXDtrfGaCeUtJoRBAvAENIebr8YMtOz6XE7iVHZ8+rY7skgEtosczhQ==", + "version": "5.80.2", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.80.2.tgz", + "integrity": "sha512-Yt7iF8Uzl7pp3mGA6yvum6PZBcbGhjasZYuqIwcIAX1jsIhGRUAK0icP0qrB6FSPBI3BpIeMHl7n9meCLO6ovg==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index bb0d2c77ba9..dc36dddeb91 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,7 @@ "eslint-plugin-promise": "^6.1.1", "husky": "^9.1.7", "jest-yaml-transform": "^0.2.0", - "knip": "^5.79.0", + "knip": "^5.80.2", "lint-staged": "^15.5.2", "openapi-types": "^12.1.3", "pino-pretty": "^13.1.3", From 0bc85ba65f15fbeaa1de75213161dde914f4962b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:56:14 +0100 Subject: [PATCH 113/214] Bump the solana-ecosystem group with 2 updates (#3357) Bumps the solana-ecosystem group with 2 updates: [@solana/kit](https://github.com/anza-xyz/kit) and [@solana/react](https://github.com/anza-xyz/kit). Updates `@solana/kit` from 5.1.0 to 5.3.0 - [Release notes](https://github.com/anza-xyz/kit/releases) - [Commits](https://github.com/anza-xyz/kit/compare/v5.1.0...v5.3.0) Updates `@solana/react` from 5.1.0 to 5.3.0 - [Release notes](https://github.com/anza-xyz/kit/releases) - [Commits](https://github.com/anza-xyz/kit/compare/v5.1.0...v5.3.0) --- updated-dependencies: - dependency-name: "@solana/kit" dependency-version: 5.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: solana-ecosystem - dependency-name: "@solana/react" dependency-version: 5.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: solana-ecosystem ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> --- package-lock.json | 719 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 366 insertions(+), 357 deletions(-) diff --git a/package-lock.json b/package-lock.json index 291aa7d520f..b5e783b923e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,8 +35,8 @@ "@solana-program/system": "^0.10.0", "@solana-program/token": "^0.9.0", "@solana-program/token-2022": "^0.6.1", - "@solana/kit": "^5.1.0", - "@solana/react": "^5.1.0", + "@solana/kit": "^5.3.0", + "@solana/react": "^5.3.0", "@solana/wallet-adapter-base": "^0.9.27", "@solana/wallet-adapter-coinbase": "^0.1.23", "@solana/wallet-adapter-react": "^0.15.39", @@ -13091,57 +13091,57 @@ } }, "node_modules/@solana/accounts": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-5.1.0.tgz", - "integrity": "sha512-Q1KzykCrl/YjLUH2RXF8vPq65U/ehAV2SHZicPbZ0jvgQUU6X1+Eca+0ilxA9xH8srYn3YTVDyEs/LYdfbY/2A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-5.3.0.tgz", + "integrity": "sha512-KyK6kBIQgoj4r93HFUnqjrCu+3l6NN3SRkwDHLb5S1iSzHDEtNtSM6l4XgRAPS4jyeY0n4RlHThRuvG5CbbhJw==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.1.0", - "@solana/codecs-core": "5.1.0", - "@solana/codecs-strings": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/rpc-spec": "5.1.0", - "@solana/rpc-types": "5.1.0" + "@solana/addresses": "5.3.0", + "@solana/codecs-core": "5.3.0", + "@solana/codecs-strings": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/rpc-spec": "5.3.0", + "@solana/rpc-types": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/addresses": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-5.1.0.tgz", - "integrity": "sha512-X84qSZLgve9YeYsyxGI49WnfEre53tdFu4x9/4oULBgoj8d0A+P9VGLYzmRJ0YFYKRcZG7U4u3MQpI5uLZ1AsQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-5.3.0.tgz", + "integrity": "sha512-HFrtIpdgkf+2yUT63E6DrYjVu/l4TGy8HDjkCjTHwl7YVoqDasgFADmd9cQ3YVXKrNnvwMLS4pYQsQdgcwXiZw==", "license": "MIT", "dependencies": { - "@solana/assertions": "5.1.0", - "@solana/codecs-core": "5.1.0", - "@solana/codecs-strings": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/nominal-types": "5.1.0" + "@solana/assertions": "5.3.0", + "@solana/codecs-core": "5.3.0", + "@solana/codecs-strings": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/nominal-types": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/assertions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-5.1.0.tgz", - "integrity": "sha512-5But2wyxuvGXMIOnD0jBMQ9yq1QQF2LSK3IbIRSkAkXbD3DS6O2tRvKUHNhogd+BpkPyCGOQHBycezgnxmStlg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-5.3.0.tgz", + "integrity": "sha512-SiZ0pOvNmOa9i7hn7EG4QUnxoq6+YBKmjsIK/9p5VQD0s45WlKp0Xelks4BPDEb+/lmkl8zmoAsOv7sV75mc+g==", "license": "MIT", "dependencies": { - "@solana/errors": "5.1.0" + "@solana/errors": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/buffer-layout": { @@ -13157,88 +13157,88 @@ } }, "node_modules/@solana/codecs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-5.1.0.tgz", - "integrity": "sha512-krSuf/E2Sa/4oASZ/jb/5KGUG58m1/bQdLrKvBnoAFhYj7zZf+8V4UqHGTV5n2NCQfmMyORsg9n2saKjkUzo8w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-5.3.0.tgz", + "integrity": "sha512-zuBpLSMBoZzWNCNNNMTKJSk9OAqkV4SYO+g4zuz/RTiMHu3B1j0KfSJ0S4k/Aa0YBgK/Ukc0GxsT8QE+GB3Snw==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.1.0", - "@solana/codecs-data-structures": "5.1.0", - "@solana/codecs-numbers": "5.1.0", - "@solana/codecs-strings": "5.1.0", - "@solana/options": "5.1.0" + "@solana/codecs-core": "5.3.0", + "@solana/codecs-data-structures": "5.3.0", + "@solana/codecs-numbers": "5.3.0", + "@solana/codecs-strings": "5.3.0", + "@solana/options": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/codecs-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-5.1.0.tgz", - "integrity": "sha512-vDwi03mxWeWCS5Il6BCdNdifYdOoHVz97YOmbWGIt45b77Ivu5NUYeSD2+ccl6fSw8eYQ6QaqqKXMjbSfsXv4g==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-5.3.0.tgz", + "integrity": "sha512-wqpiKtej8GePdraHk3YnoJY1N/Hutn4w0CD/45hNKiXPG5F3mlasaBWq8m86K7WUdjQVAsGTgiSgoZo64Aw17w==", "license": "MIT", "dependencies": { - "@solana/errors": "5.1.0" + "@solana/errors": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/codecs-data-structures": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-5.1.0.tgz", - "integrity": "sha512-ftAwL/jsurFrk9kFVhkTLdQ8fGZ8I0PcbVH+V1a0dIP2aKDofGePvK0XbwZE/ohizC9gEIZxyBX5IgRKk5PXyg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-5.3.0.tgz", + "integrity": "sha512-MdJTYdBF0OwyMuZOTrccHtfl1Sfcp1/l/7AQjxqOWk+Enbg2Kkx8OP8eKqVipdqvYdk9LcC132fXfyemWdB88g==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.1.0", - "@solana/codecs-numbers": "5.1.0", - "@solana/errors": "5.1.0" + "@solana/codecs-core": "5.3.0", + "@solana/codecs-numbers": "5.3.0", + "@solana/errors": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/codecs-numbers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-5.1.0.tgz", - "integrity": "sha512-Ea5/9yjDNOrDZcI40UGzzi6Aq1JNsmzM4m5pOk6Xb3JRZ0YdKOv/MwuCqb6jRgzZ7SQjHhkfGL43kHLJA++bOw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-5.3.0.tgz", + "integrity": "sha512-NLsRSKpRzGT5h5UL4jEShE5C49S2E/oM3YAltdbsFyxuTKo0u4JA+GzBLD1UxEG5177WMY/wtVVTe5qWCDdyzA==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.1.0", - "@solana/errors": "5.1.0" + "@solana/codecs-core": "5.3.0", + "@solana/errors": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/codecs-strings": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-5.1.0.tgz", - "integrity": "sha512-014xwl5T/3VnGW0gceizF47DUs5EURRtgGmbWIR5+Z32yxgQ6hT9Zl0atZbL268RHbUQ03/J8Ush1StQgy7sfQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-5.3.0.tgz", + "integrity": "sha512-hnTYlxGCcQcqZr0lHqSW/dbEWAnH+4Ery+FSv9Rd2fEI/qcDxA5by0IxDIm+imFGLsnXZwLSnYBuF57YOoMzhQ==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.1.0", - "@solana/codecs-numbers": "5.1.0", - "@solana/errors": "5.1.0" + "@solana/codecs-core": "5.3.0", + "@solana/codecs-numbers": "5.3.0", + "@solana/errors": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" }, "peerDependenciesMeta": { "fastestsmallesttextencoderdecoder": { @@ -13247,9 +13247,9 @@ } }, "node_modules/@solana/errors": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-5.1.0.tgz", - "integrity": "sha512-JlTyekErWa6Fdcwu1Hrh+jZxjM4YxyorGCFDRVZlmHZFkp5N00DWKcYnSGZrTF8E6ZZEP9pfS2XwM8y7p7HPww==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-5.3.0.tgz", + "integrity": "sha512-oeTwCQG4JBNI6dd1XxA04sX18HPiiWts10FokXrdjaMH2sCJRxecpUTzCvCsPlb8FAVswRu1bi4HuN9uVHTBNQ==", "license": "MIT", "dependencies": { "chalk": "5.6.2", @@ -13262,7 +13262,7 @@ "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/errors/node_modules/chalk": { @@ -13287,164 +13287,178 @@ } }, "node_modules/@solana/fast-stable-stringify": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-5.1.0.tgz", - "integrity": "sha512-ACZo7cH/5EXsBmruw/0gU2/PXL2l4aET0YpL93H6QEaZwEAICFD8cLkj20nBcfLTf4srEiuKtwuSDeONTWIulw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-5.3.0.tgz", + "integrity": "sha512-wyTp8j9wFfFj+1QxUBBC0aZTm84FDdnJZ/Lr4Nhk/2qiQRP1RwMaDCo3ubdkRox+RoNtVdeHrvMBer7U1fyhJA==", "license": "MIT", "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/functional": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-5.1.0.tgz", - "integrity": "sha512-R6jacWU0Gr+j49lTDp+FSECBolqw2Gq7JlC22rI0JkcxJiiAlp3G80v6zAYq0FkHzxZbjyR6//JYUXSwliem5g==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-5.3.0.tgz", + "integrity": "sha512-f/oONHHBxaKjCvCXp1waZEUsdnAiQYtX1iDejKp9iNW6YG5v5PxTHzf+EMxBXeyV2UhSjO8V3wjBMPFqgqzRZQ==", "license": "MIT", "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/instruction-plans": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/instruction-plans/-/instruction-plans-5.1.0.tgz", - "integrity": "sha512-friMgHt0z5jQlCyyTDXfwAMYjCAagI7QYR+hLWB/BmvSuRpai0ddToWbWJoqrNRM312xZ+Oy/qjC3+Ftzi0DLA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/instruction-plans/-/instruction-plans-5.3.0.tgz", + "integrity": "sha512-wC+SFPc5izs0ZoPmJ4lyAZzV2Ieyj5OWQGZgRjETHkz3vBYI5K/3pwA/3T40OwMX4D8YfXAIy9qq0ExROuUmqg==", "license": "MIT", "dependencies": { - "@solana/errors": "5.1.0", - "@solana/instructions": "5.1.0", - "@solana/keys": "5.1.0", - "@solana/promises": "5.1.0", - "@solana/transaction-messages": "5.1.0", - "@solana/transactions": "5.1.0" + "@solana/errors": "5.3.0", + "@solana/instructions": "5.3.0", + "@solana/keys": "5.3.0", + "@solana/promises": "5.3.0", + "@solana/transaction-messages": "5.3.0", + "@solana/transactions": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/instructions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-5.1.0.tgz", - "integrity": "sha512-fkwpUwwqk5K14T/kZDnCrfeR0kww49HBx+BK8xdSeJx+bt4QTwAHa9YeOkGhGrHEFVEJEUf8FKoxxTzZzJZtKQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-5.3.0.tgz", + "integrity": "sha512-jYA+fdi9h3wF/CQLoa6LooXAsvBriyc51ySXzXDDC/0aIzT9hUo9gMvqIxmTRQSTmy9O7ay2tfPYeAopaFfubg==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.1.0", - "@solana/errors": "5.1.0" + "@solana/codecs-core": "5.3.0", + "@solana/errors": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/keys": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-5.1.0.tgz", - "integrity": "sha512-ma4zTTuSOmtTCvATHMfUGNTw0Vqah/6XPe1VmLc66ohwXMI3yqatX1FQPXgDZozr15SvLAesfs7/bgl2TRoe9w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-5.3.0.tgz", + "integrity": "sha512-0F1eMibq2OIXIozFrrDxJtXJoo9ef1JUCFjQ4FkhRAoXYWLPczAFHNLq/YUORvKDOBwoS0q1DfvY5FjqPhlDSQ==", "license": "MIT", "dependencies": { - "@solana/assertions": "5.1.0", - "@solana/codecs-core": "5.1.0", - "@solana/codecs-strings": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/nominal-types": "5.1.0" + "@solana/assertions": "5.3.0", + "@solana/codecs-core": "5.3.0", + "@solana/codecs-strings": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/nominal-types": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/kit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-5.1.0.tgz", - "integrity": "sha512-oNQRzI0+mGWmXy05psO0J7r9Boy8PF7LH5H0Y9Jxvs10AbG4oSOBtyj20EccsRrr+jkqLw42fqb/4rNuASfvsA==", - "license": "MIT", - "dependencies": { - "@solana/accounts": "5.1.0", - "@solana/addresses": "5.1.0", - "@solana/codecs": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/functional": "5.1.0", - "@solana/instruction-plans": "5.1.0", - "@solana/instructions": "5.1.0", - "@solana/keys": "5.1.0", - "@solana/offchain-messages": "5.1.0", - "@solana/programs": "5.1.0", - "@solana/rpc": "5.1.0", - "@solana/rpc-parsed-types": "5.1.0", - "@solana/rpc-spec-types": "5.1.0", - "@solana/rpc-subscriptions": "5.1.0", - "@solana/rpc-types": "5.1.0", - "@solana/signers": "5.1.0", - "@solana/sysvars": "5.1.0", - "@solana/transaction-confirmation": "5.1.0", - "@solana/transaction-messages": "5.1.0", - "@solana/transactions": "5.1.0" + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-5.3.0.tgz", + "integrity": "sha512-5QoEZCnEz4VCzgbXhEOaU2Hg9Rug3w43iNkLg0wUaGkqKTVasAJ1Sd5l5SpPjGEGc70vNVnrFNb7e9GTmRFeXg==", + "license": "MIT", + "dependencies": { + "@solana/accounts": "5.3.0", + "@solana/addresses": "5.3.0", + "@solana/codecs": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/functional": "5.3.0", + "@solana/instruction-plans": "5.3.0", + "@solana/instructions": "5.3.0", + "@solana/keys": "5.3.0", + "@solana/offchain-messages": "5.3.0", + "@solana/plugin-core": "5.3.0", + "@solana/programs": "5.3.0", + "@solana/rpc": "5.3.0", + "@solana/rpc-api": "5.3.0", + "@solana/rpc-parsed-types": "5.3.0", + "@solana/rpc-spec-types": "5.3.0", + "@solana/rpc-subscriptions": "5.3.0", + "@solana/rpc-types": "5.3.0", + "@solana/signers": "5.3.0", + "@solana/sysvars": "5.3.0", + "@solana/transaction-confirmation": "5.3.0", + "@solana/transaction-messages": "5.3.0", + "@solana/transactions": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/nominal-types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-5.1.0.tgz", - "integrity": "sha512-+4Cm+SpK+D811i9giqv4Up93ZlmUcZfLDHkSH24F4in61+Y2TKA+XKuRtKhNytQMmqCfbvJZ9MHFaIeZw5g+Bg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-5.3.0.tgz", + "integrity": "sha512-fuPBOM/zZNTNqMPu2LYtdA47OQ2A/IwziEUOXyW3+tO3Qluzh0fKQ/xqOtbl1HsZd7Inip1N062xbltr3DwD+A==", "license": "MIT", "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/offchain-messages": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/offchain-messages/-/offchain-messages-5.1.0.tgz", - "integrity": "sha512-6FUXjiIJprjWa7y/T4E3rUb3HKi3P5zpBweBEwDflEEJ/QlieWUw7xlGAOvZ1eF3Wi+6LfcrdtZOwIkuv6o9Sg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/offchain-messages/-/offchain-messages-5.3.0.tgz", + "integrity": "sha512-jdb5XvIBRsdBLu4aemXVWmZc8jkI6nXYayHE/S5Yq5W4hBcqxJvdENxh0MZYCPVo5x+8NwtS3Yug3vGoERGIzA==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.1.0", - "@solana/codecs-core": "5.1.0", - "@solana/codecs-data-structures": "5.1.0", - "@solana/codecs-numbers": "5.1.0", - "@solana/codecs-strings": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/keys": "5.1.0", - "@solana/nominal-types": "5.1.0" + "@solana/addresses": "5.3.0", + "@solana/codecs-core": "5.3.0", + "@solana/codecs-data-structures": "5.3.0", + "@solana/codecs-numbers": "5.3.0", + "@solana/codecs-strings": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/keys": "5.3.0", + "@solana/nominal-types": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/options": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-5.1.0.tgz", - "integrity": "sha512-PqgfALd0yhK+QFaYIbRFTV6hBpiy5xwdu07zSw1RLoNvt1sg+MRsRFDk9R8ZdEdiM69PY/cKiClVSjpNzLLcJg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-5.3.0.tgz", + "integrity": "sha512-vByKXs7jgEvyHGkj30sskxHhfXAzVZC/vDoW8EyJW+95VeydGJXoxgfzLgnDlEeFt66d8i/+wxiD/8napMdgZg==", "license": "MIT", "dependencies": { - "@solana/codecs-core": "5.1.0", - "@solana/codecs-data-structures": "5.1.0", - "@solana/codecs-numbers": "5.1.0", - "@solana/codecs-strings": "5.1.0", - "@solana/errors": "5.1.0" + "@solana/codecs-core": "5.3.0", + "@solana/codecs-data-structures": "5.3.0", + "@solana/codecs-numbers": "5.3.0", + "@solana/codecs-strings": "5.3.0", + "@solana/errors": "5.3.0" + }, + "engines": { + "node": ">=20.18.0" }, + "peerDependencies": { + "typescript": ">=5.9.3" + } + }, + "node_modules/@solana/plugin-core": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/plugin-core/-/plugin-core-5.3.0.tgz", + "integrity": "sha512-UKIeW2gxLY9z9bzSJYAzRS/JG4I7D6y8cBBo1QUHNOUEDI1Fd4+pK3neLgw+VQKttzJgA184KFwyCO16m8wd/w==", + "license": "MIT", "engines": { "node": ">=20.18.0" }, @@ -13453,46 +13467,46 @@ } }, "node_modules/@solana/programs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-5.1.0.tgz", - "integrity": "sha512-zAghXyRGixWNcarShlrnpjMD2115BZTF9JMLIcgkCYDOwjDPFIB/Y0hwDCH87N5uSjzlgkDpxKEL4ILewoZTRQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-5.3.0.tgz", + "integrity": "sha512-GtA3xeUkYMBLDRLRtaodPyJu+Eey0jnpwJnd9/05fofZyinQ09k+a0kaGZ1R829HGBnJTnhq/qGnPN5zqSi0qA==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.1.0", - "@solana/errors": "5.1.0" + "@solana/addresses": "5.3.0", + "@solana/errors": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/promises": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-5.1.0.tgz", - "integrity": "sha512-LU9wwS1PvGc/It610dclfq+JCuUEZSIWjvaF0+sqMP7QCk12Uz7MK2m9TtvLcjTvvKTIrucglRZP6qKroWRqGg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-5.3.0.tgz", + "integrity": "sha512-DzFBtUeNOheBvDLHXDPQ5nUGTdwaFYEhA+3vAOs66vC41/kdcWVllDQVj32HOePDoXlxGGczd8VpOt+dzw94MA==", "license": "MIT", "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/react": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/react/-/react-5.1.0.tgz", - "integrity": "sha512-sehWHTmm4gJEeftCsVLdXk64CxoOlvuEK7Z+oq9xwxGowuJvCoY8a9uv17QZW1ELXmrSV3NZ54O3wDFDNw2VDw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/react/-/react-5.3.0.tgz", + "integrity": "sha512-L6ppty3RULKKUCk/eGc1Z/tEHY4QIgx21Jp8mwZExo64zzBauLgAl7vgwS9jGNNoW8GgksAEb6DBwPzhCfPwkw==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/keys": "5.1.0", - "@solana/promises": "5.1.0", - "@solana/signers": "5.1.0", - "@solana/transaction-messages": "5.1.0", - "@solana/transactions": "5.1.0", + "@solana/addresses": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/keys": "5.3.0", + "@solana/promises": "5.3.0", + "@solana/signers": "5.3.0", + "@solana/transaction-messages": "5.3.0", + "@solana/transactions": "5.3.0", "@solana/wallet-standard-features": "^1.3.0", "@wallet-standard/base": "^1.1.0", "@wallet-standard/errors": "^0.1.1", @@ -13512,365 +13526,360 @@ } }, "node_modules/@solana/rpc": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-5.1.0.tgz", - "integrity": "sha512-j+ByLxFCoHWw9TnsGzkAVMFUfBDIUE53nIosJAYEsERpImD2mjwc33uDE6YXLKoaKRoYO4tc7IUzkKY1fQp/CA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-5.3.0.tgz", + "integrity": "sha512-7jrOAej8Jk5F4EU3i5/91Z5Kg4e20KtWzOUZkU7zDSCImLeAi+1fUDa+vMNBMrDfKqWksFj/wJwGeRPk43P+Bg==", "license": "MIT", "dependencies": { - "@solana/errors": "5.1.0", - "@solana/fast-stable-stringify": "5.1.0", - "@solana/functional": "5.1.0", - "@solana/rpc-api": "5.1.0", - "@solana/rpc-spec": "5.1.0", - "@solana/rpc-spec-types": "5.1.0", - "@solana/rpc-transformers": "5.1.0", - "@solana/rpc-transport-http": "5.1.0", - "@solana/rpc-types": "5.1.0" + "@solana/errors": "5.3.0", + "@solana/fast-stable-stringify": "5.3.0", + "@solana/functional": "5.3.0", + "@solana/rpc-api": "5.3.0", + "@solana/rpc-spec": "5.3.0", + "@solana/rpc-spec-types": "5.3.0", + "@solana/rpc-transformers": "5.3.0", + "@solana/rpc-transport-http": "5.3.0", + "@solana/rpc-types": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/rpc-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-5.1.0.tgz", - "integrity": "sha512-eI1tY0i3gmih1C65gFECYbfPRpHEYqFp+9IKjpknZtYpQIe9BqBKSpfYpGiCAbKdN/TMadBNPOzdK15ewhkkvQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-5.3.0.tgz", + "integrity": "sha512-dBkjKa4scDjcNDq+YQ1xePwinkTMqMm3HcZM9pupfBV8owoqLG9ZcZ6ZXp9/sIEIX+xWxVmW2vj4L/EwtbrC5A==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.1.0", - "@solana/codecs-core": "5.1.0", - "@solana/codecs-strings": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/keys": "5.1.0", - "@solana/rpc-parsed-types": "5.1.0", - "@solana/rpc-spec": "5.1.0", - "@solana/rpc-transformers": "5.1.0", - "@solana/rpc-types": "5.1.0", - "@solana/transaction-messages": "5.1.0", - "@solana/transactions": "5.1.0" + "@solana/addresses": "5.3.0", + "@solana/codecs-core": "5.3.0", + "@solana/codecs-strings": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/keys": "5.3.0", + "@solana/rpc-parsed-types": "5.3.0", + "@solana/rpc-spec": "5.3.0", + "@solana/rpc-transformers": "5.3.0", + "@solana/rpc-types": "5.3.0", + "@solana/transaction-messages": "5.3.0", + "@solana/transactions": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/rpc-parsed-types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-5.1.0.tgz", - "integrity": "sha512-ZJoXHNItALMNa1zmGrNnIh96RBlc9GpIqoaZkdE14mAQ7gWe7Oc0ejYavUeSCmcL0wZcvIFh50AsfVxrHr4+2Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-5.3.0.tgz", + "integrity": "sha512-D5lLmgWb3O1WapSypnFWS9eJSklDJs8LDsJbzvwNwXpDAi/6e804NphiYnuWqpd5en8LyRb7E2XoP14F292bbw==", "license": "MIT", "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/rpc-spec": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-5.1.0.tgz", - "integrity": "sha512-y8B6fUWA1EBKXUsNo6b9EiFcQPsaJREPLlcIDbo4b6TucQNwvl7FHfpf1VHJL64SkI/WE69i2WEkiOJYjmLO0A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-5.3.0.tgz", + "integrity": "sha512-w316DNQXi738wvhQtY38hb9/TRU0KoIJkPh4QrmBPGwb3Gi3fI0GyeLNb7RQ+LciNX8/WSmRfXygxSTFYcD+3A==", "license": "MIT", "dependencies": { - "@solana/errors": "5.1.0", - "@solana/rpc-spec-types": "5.1.0" + "@solana/errors": "5.3.0", + "@solana/rpc-spec-types": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/rpc-spec-types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-5.1.0.tgz", - "integrity": "sha512-B8/WyjmHpC34vXtAmTpZyPwRCm7WwoSkmjBcBouaaY1uilJ9+Wp2nptbq2cJyWairOoMSoI7v5kvvnrJuquq4Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-5.3.0.tgz", + "integrity": "sha512-6U7WYnuZ6HTYxyapwvPeam/wNP22uKxVH4afB5hHaYJ5PgNGF4GsZhVOgIO7CwgP2ChNq3F4X1tF/7Ly4xEOQw==", "license": "MIT", "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/rpc-subscriptions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-5.1.0.tgz", - "integrity": "sha512-u/mafVzBbdqvYDD7x/98T5/5xk4Bl2C/90TaHiKx7FmutVC/H4QsritPTY0v9JG1dOVWbgIfUgfZ0C0DPkiYnA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-5.3.0.tgz", + "integrity": "sha512-T0py1fn3asCUeeRh1L9w+FhaHQEq+TBCZ9o7LBONEbQTgdwH8AIcUhyR8HDyDce2wo7bWpADXJCdyk3eUlFUZA==", "license": "MIT", "dependencies": { - "@solana/errors": "5.1.0", - "@solana/fast-stable-stringify": "5.1.0", - "@solana/functional": "5.1.0", - "@solana/promises": "5.1.0", - "@solana/rpc-spec-types": "5.1.0", - "@solana/rpc-subscriptions-api": "5.1.0", - "@solana/rpc-subscriptions-channel-websocket": "5.1.0", - "@solana/rpc-subscriptions-spec": "5.1.0", - "@solana/rpc-transformers": "5.1.0", - "@solana/rpc-types": "5.1.0", - "@solana/subscribable": "5.1.0" + "@solana/errors": "5.3.0", + "@solana/fast-stable-stringify": "5.3.0", + "@solana/functional": "5.3.0", + "@solana/promises": "5.3.0", + "@solana/rpc-spec-types": "5.3.0", + "@solana/rpc-subscriptions-api": "5.3.0", + "@solana/rpc-subscriptions-channel-websocket": "5.3.0", + "@solana/rpc-subscriptions-spec": "5.3.0", + "@solana/rpc-transformers": "5.3.0", + "@solana/rpc-types": "5.3.0", + "@solana/subscribable": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/rpc-subscriptions-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-5.1.0.tgz", - "integrity": "sha512-84e2AsgqAGiVloW3G4RzpHPkInknu3rEuFPut2/69eq3Ab97TiTz2s5kc9gJpprtGM+xbgnIfeuGqr5F+2bXQA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-5.3.0.tgz", + "integrity": "sha512-aNd1LGgsIYtxiStwxvGtcZQUj79UeHX1fPYV9cj/VxyAsmFDiMhsY78/p5F4xLT2JxQUSzLRLLbNFOeYvt6LiQ==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.1.0", - "@solana/keys": "5.1.0", - "@solana/rpc-subscriptions-spec": "5.1.0", - "@solana/rpc-transformers": "5.1.0", - "@solana/rpc-types": "5.1.0", - "@solana/transaction-messages": "5.1.0", - "@solana/transactions": "5.1.0" + "@solana/addresses": "5.3.0", + "@solana/keys": "5.3.0", + "@solana/rpc-subscriptions-spec": "5.3.0", + "@solana/rpc-transformers": "5.3.0", + "@solana/rpc-types": "5.3.0", + "@solana/transaction-messages": "5.3.0", + "@solana/transactions": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/rpc-subscriptions-channel-websocket": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-5.1.0.tgz", - "integrity": "sha512-FzAEmHzXtlckNn7T/1dzDS7r5HmekYPstrtZKjDcVxuGMVBUkZTnb69t7EJvKNuKw1wYZEUd0EEegtC2K/9dZA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-5.3.0.tgz", + "integrity": "sha512-l+e7gBFujFyOVztJfQ6uS8mnzDCji+uk/Ff0FbhTPYBuaKNm7LYR0H0WqAugmRbKd7Lc2RoIqR9XnAnN4qbPcQ==", "license": "MIT", "dependencies": { - "@solana/errors": "5.1.0", - "@solana/functional": "5.1.0", - "@solana/rpc-subscriptions-spec": "5.1.0", - "@solana/subscribable": "5.1.0" + "@solana/errors": "5.3.0", + "@solana/functional": "5.3.0", + "@solana/rpc-subscriptions-spec": "5.3.0", + "@solana/subscribable": "5.3.0", + "ws": "^8.18.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3", - "ws": "^8.18.0" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true - } + "typescript": ">=5.9.3" } }, "node_modules/@solana/rpc-subscriptions-spec": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-5.1.0.tgz", - "integrity": "sha512-ORfjKtainnYisql6z4YsXByVwY8/rWsedVWn5oe/V7Og9LyetTM7hwJ8FbUdRDZwyLlUrI0cEE1aG+3ma/8tPw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-5.3.0.tgz", + "integrity": "sha512-tkpFBtwjCQhrtvr1oTVn1q1Fgsr258uz6fOiOfkSfpG7i/zCRhU2V+XFdZlli6vh7iFaejHxIKOAykn3a0yjyg==", "license": "MIT", "dependencies": { - "@solana/errors": "5.1.0", - "@solana/promises": "5.1.0", - "@solana/rpc-spec-types": "5.1.0", - "@solana/subscribable": "5.1.0" + "@solana/errors": "5.3.0", + "@solana/promises": "5.3.0", + "@solana/rpc-spec-types": "5.3.0", + "@solana/subscribable": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/rpc-transformers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-5.1.0.tgz", - "integrity": "sha512-6v93xi/ewGS/xEiSktNQ0bh0Uiv1/q9nR5oiFMn3BiAJRC+FdMRMxCjp6H+/Tua7wdhpClaPKrZYBQHoIp59tw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-5.3.0.tgz", + "integrity": "sha512-N9Au1uu2sI9U+tAxWpWn8oJZwtTDzZ1CDhXr0DWahQoaWjiMKxzoMNA2UCF0Nn1ose8x87yzMXUK91xXAvpYfw==", "license": "MIT", "dependencies": { - "@solana/errors": "5.1.0", - "@solana/functional": "5.1.0", - "@solana/nominal-types": "5.1.0", - "@solana/rpc-spec-types": "5.1.0", - "@solana/rpc-types": "5.1.0" + "@solana/errors": "5.3.0", + "@solana/functional": "5.3.0", + "@solana/nominal-types": "5.3.0", + "@solana/rpc-spec-types": "5.3.0", + "@solana/rpc-types": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/rpc-transport-http": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-5.1.0.tgz", - "integrity": "sha512-XoGX+2n/iXzoGb3Xrltbx8avnzp15vCfCGXuZpQWFL+xUg3P4CGl217XyDGjS5VxuUml+f/30xzWl18RaAIEcw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-5.3.0.tgz", + "integrity": "sha512-Z+0l90HkL/Sj8onQKcWQXYYORppCf81b76oN0gdjpOGJdFpT64aVwB47CV+NUxnSb/MTp62i3wmNOtPsCTz0Yg==", "license": "MIT", "dependencies": { - "@solana/errors": "5.1.0", - "@solana/rpc-spec": "5.1.0", - "@solana/rpc-spec-types": "5.1.0", + "@solana/errors": "5.3.0", + "@solana/rpc-spec": "5.3.0", + "@solana/rpc-spec-types": "5.3.0", "undici-types": "^7.16.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/rpc-types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-5.1.0.tgz", - "integrity": "sha512-Rnpt5BuHQvnULPNXUC/yRqB+7iPbon95CSCeyRvPj5tJ4fx2JibvX3s/UEoud5vC+kRjPi/R0BGJ8XFvd3eDWg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-5.3.0.tgz", + "integrity": "sha512-L9qMvr5wDk+rZ1qiWHtYl8Ec7M7AkhB9uYQef21pZb7fkeksLoO7DZHrLMTiOYbMWHjGBO2rXYef+SXBxd206g==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.1.0", - "@solana/codecs-core": "5.1.0", - "@solana/codecs-numbers": "5.1.0", - "@solana/codecs-strings": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/nominal-types": "5.1.0" + "@solana/addresses": "5.3.0", + "@solana/codecs-core": "5.3.0", + "@solana/codecs-numbers": "5.3.0", + "@solana/codecs-strings": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/nominal-types": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/signers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-5.1.0.tgz", - "integrity": "sha512-B8xO0SGN1ZWYfJROL+da3id279qNbXbXoqud+AuT5gur51RrS4YhNkTQ6khVbGtAOpPMAhkoZN0jnfCC1r33jQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-5.3.0.tgz", + "integrity": "sha512-npihqbS1/rL8RSUv0RFlo1xakJdZGNyBrzGBMSxDBIYuYMwjuk4FNq70ka547yFdjTCd9mBzvZpAR2vh4fjmwg==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.1.0", - "@solana/codecs-core": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/instructions": "5.1.0", - "@solana/keys": "5.1.0", - "@solana/nominal-types": "5.1.0", - "@solana/offchain-messages": "5.1.0", - "@solana/transaction-messages": "5.1.0", - "@solana/transactions": "5.1.0" + "@solana/addresses": "5.3.0", + "@solana/codecs-core": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/instructions": "5.3.0", + "@solana/keys": "5.3.0", + "@solana/nominal-types": "5.3.0", + "@solana/offchain-messages": "5.3.0", + "@solana/transaction-messages": "5.3.0", + "@solana/transactions": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/subscribable": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-5.1.0.tgz", - "integrity": "sha512-OeW5AJwKzHh18+PIPtghuuPJTmEep2Mhb3Lsrq4alas4fibmMGkr39z1HXxVF6l6e2lu/YGhHIDtuhouWmY7ow==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-5.3.0.tgz", + "integrity": "sha512-tn6DnIR5xRspiO2untzznr0KpUZRm71cMNgJlNh3H6t3zph7P800EbFYMkPvPcCDWZf3S+ALiLAeNyrNPgSPsg==", "license": "MIT", "dependencies": { - "@solana/errors": "5.1.0" + "@solana/errors": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/sysvars": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-5.1.0.tgz", - "integrity": "sha512-FJ9YIsLTAaajnOrYEYn54znstXJsvKndRhyCrlyiAEN1IXHw5HtZHploLF3ZZ78b7YU3uv3tFJMziXFBwPOn4Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-5.3.0.tgz", + "integrity": "sha512-hkXnOaGPRWC0/79Br+sjENrPtYunlXZ5o0sC/ZEBlguKv+/yP/cZeoHYKoFzF8X3YHFp9dawNhtroEj1/B+hWQ==", "license": "MIT", "dependencies": { - "@solana/accounts": "5.1.0", - "@solana/codecs": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/rpc-types": "5.1.0" + "@solana/accounts": "5.3.0", + "@solana/codecs": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/rpc-types": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/transaction-confirmation": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-5.1.0.tgz", - "integrity": "sha512-6HnL0uH8tWZXJVuaoeTbCQp/FS11Bsc4GSlq+k0N21GdhTbFuqBhsxlAYWbzPWs9+/kYRGHqqXvBPCReWxT7BA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-5.3.0.tgz", + "integrity": "sha512-tVJw87q691FibuRmqkU+sOjcV3hl1yI4ATVLbS6cewPlZZ2XI/uAzKHwZt08N/llbFHKeLHY3pKUMve3fSYJPw==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.1.0", - "@solana/codecs-strings": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/keys": "5.1.0", - "@solana/promises": "5.1.0", - "@solana/rpc": "5.1.0", - "@solana/rpc-subscriptions": "5.1.0", - "@solana/rpc-types": "5.1.0", - "@solana/transaction-messages": "5.1.0", - "@solana/transactions": "5.1.0" + "@solana/addresses": "5.3.0", + "@solana/codecs-strings": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/keys": "5.3.0", + "@solana/promises": "5.3.0", + "@solana/rpc": "5.3.0", + "@solana/rpc-subscriptions": "5.3.0", + "@solana/rpc-types": "5.3.0", + "@solana/transaction-messages": "5.3.0", + "@solana/transactions": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/transaction-messages": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-5.1.0.tgz", - "integrity": "sha512-9rNV2YJhd85WIMvnwa/vUY4xUw3ZTU17jP1KDo/fFZWk55a0ov0ATJJPyC5HAR1i6hT1cmJzGH/UHhnD9m/Q3w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-5.3.0.tgz", + "integrity": "sha512-36O2ccWYdDIq1HwzSExTwQFryY1M21Zw1AUpxJozHv79b6FAE5/hrsM/NOEEVipVvsNCUPC7xDs6nv3DEC8oWg==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.1.0", - "@solana/codecs-core": "5.1.0", - "@solana/codecs-data-structures": "5.1.0", - "@solana/codecs-numbers": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/functional": "5.1.0", - "@solana/instructions": "5.1.0", - "@solana/nominal-types": "5.1.0", - "@solana/rpc-types": "5.1.0" + "@solana/addresses": "5.3.0", + "@solana/codecs-core": "5.3.0", + "@solana/codecs-data-structures": "5.3.0", + "@solana/codecs-numbers": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/functional": "5.3.0", + "@solana/instructions": "5.3.0", + "@solana/nominal-types": "5.3.0", + "@solana/rpc-types": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/transactions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-5.1.0.tgz", - "integrity": "sha512-06JwSPtz+38ozNgpysAXS2eTMPQCufIisXB6K88X8J4GF8ziqs4nkq0BpXAXn+MpZTkuMt+JeW2RxP3HKhXe5g==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-5.3.0.tgz", + "integrity": "sha512-dxbKRxMTV7BM0hFHCmsBi5/bfRNjH8TPqicR4K6YhL9u0T5eAnDsTZXCX3pGFbOxx7sHs9CFoy12M58+9xVrJw==", "license": "MIT", "dependencies": { - "@solana/addresses": "5.1.0", - "@solana/codecs-core": "5.1.0", - "@solana/codecs-data-structures": "5.1.0", - "@solana/codecs-numbers": "5.1.0", - "@solana/codecs-strings": "5.1.0", - "@solana/errors": "5.1.0", - "@solana/functional": "5.1.0", - "@solana/instructions": "5.1.0", - "@solana/keys": "5.1.0", - "@solana/nominal-types": "5.1.0", - "@solana/rpc-types": "5.1.0", - "@solana/transaction-messages": "5.1.0" + "@solana/addresses": "5.3.0", + "@solana/codecs-core": "5.3.0", + "@solana/codecs-data-structures": "5.3.0", + "@solana/codecs-numbers": "5.3.0", + "@solana/codecs-strings": "5.3.0", + "@solana/errors": "5.3.0", + "@solana/functional": "5.3.0", + "@solana/instructions": "5.3.0", + "@solana/keys": "5.3.0", + "@solana/nominal-types": "5.3.0", + "@solana/rpc-types": "5.3.0", + "@solana/transaction-messages": "5.3.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5.9.3" } }, "node_modules/@solana/wallet-adapter-base": { @@ -36225,9 +36234,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==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, "node_modules/unified": { diff --git a/package.json b/package.json index dc36dddeb91..7bf7d0d7751 100644 --- a/package.json +++ b/package.json @@ -80,8 +80,8 @@ "@solana-program/system": "^0.10.0", "@solana-program/token": "^0.9.0", "@solana-program/token-2022": "^0.6.1", - "@solana/kit": "^5.1.0", - "@solana/react": "^5.1.0", + "@solana/kit": "^5.3.0", + "@solana/react": "^5.3.0", "@solana/wallet-adapter-base": "^0.9.27", "@solana/wallet-adapter-coinbase": "^0.1.23", "@solana/wallet-adapter-react": "^0.15.39", From a0334e755dba615d7661d7ae484de72f1bfc2308 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Mon, 12 Jan 2026 11:24:52 -0500 Subject: [PATCH 114/214] TS EVM log trigger: Add base64 encoding (#3342) * TS EVM log triggers to use base64 encoding * TS EVM log triggers to use base64 encoding * padding & base64 encoding caution note * padding & base64 encoding caution note --- .../using-triggers/evm-log-trigger-ts.mdx | 175 +++++++++++++----- src/content/cre/llms-full-ts.txt | 175 +++++++++++++----- 2 files changed, 258 insertions(+), 92 deletions(-) diff --git a/src/content/cre/guides/workflow/using-triggers/evm-log-trigger-ts.mdx b/src/content/cre/guides/workflow/using-triggers/evm-log-trigger-ts.mdx index dba998b53d7..c10f1f3a79f 100644 --- a/src/content/cre/guides/workflow/using-triggers/evm-log-trigger-ts.mdx +++ b/src/content/cre/guides/workflow/using-triggers/evm-log-trigger-ts.mdx @@ -23,12 +23,19 @@ This guide explains the two key parts of working with log triggers: You create an EVM Log trigger by calling the `EVMClient.logTrigger()` method with a `FilterLogTriggerRequest` configuration. This configuration specifies which contract addresses and event topics to listen for. +<Aside type="note" title="Base64 Encoding Required"> + **All addresses and topic values must be base64 encoded** using the `hexToBase64()` helper function from the CRE SDK. + While the workflow simulator accepts raw hex strings for convenience during development, **deployed workflows require + base64 encoding**. Always use `hexToBase64()` on addresses and topic values to ensure your workflow works in both + simulation and production. +</Aside> + ### Basic configuration The simplest configuration listens for **all events** from specific contract addresses: ```typescript -import { cre, getNetwork, type Runtime, type EVMLog, Runner, bytesToHex } from "@chainlink/cre-sdk" +import { cre, getNetwork, type Runtime, type EVMLog, Runner, bytesToHex, hexToBase64 } from "@chainlink/cre-sdk" type Config = { chainSelectorName: string @@ -58,7 +65,7 @@ const initWorkflow = (config: Config) => { return [ cre.handler( evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], }), onLogTrigger ), @@ -75,10 +82,11 @@ main() ### Filtering by event type -To listen for **specific event types**, you need to provide the event's signature hash as the first topic (`Topics[0]`). You can compute this using viem's `keccak256` and `toHex` functions: +To listen for **specific event types**, you need to provide the event's signature hash as the first topic (`Topics[0]`). You can compute this using viem's `keccak256` and `toBytes` functions: ```typescript -import { keccak256, toHex } from "viem" +import { keccak256, toBytes } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" const initWorkflow = (config: Config) => { const network = getNetwork({ @@ -94,14 +102,14 @@ const initWorkflow = (config: Config) => { const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) // Compute the event signature hash for Transfer(address,address,uint256) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) return [ cre.handler( evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], topics: [ - { values: [transferEventHash] }, // Listen only for Transfer events + { values: [hexToBase64(transferEventHash)] }, // Listen only for Transfer events ], }), onLogTrigger @@ -118,13 +126,27 @@ EVM events can have up to 3 `indexed` parameters (in addition to the event signa - **`addresses`**: The trigger fires if the event is emitted from **any** contract in this list (**OR** logic). - **`topics`**: An event must match the conditions for **all** defined topic slots (**AND** logic between topics). Within a single topic, you can provide multiple values, and it will match if the event's topic is **any** of those values (**OR** logic within a topic). +- **Wildcarding topics**: To skip filtering on a specific topic position, omit it from the topics array or provide an empty values array `{ values: [] }`. For example, to filter on topic 1 and topic 3 but not topic 2, you would provide `[topic0, topic1, { values: [] }, topic3]`. + +<Aside type="caution" title="Topic values must be padded to 32 bytes and base64 encoded"> +EVM logs always store indexed parameters as **32-byte values**. When filtering on topics 1, 2, or 3: + +1. **Pad your values to 32 bytes** using `padHex(value, { size: 32 })` (e.g., addresses are 20 bytes and must be padded) +1. **Convert to base64** using `hexToBase64()` + +If you don't pad correctly, your filter won't match the actual log topics and the trigger will not fire. + +Topic 0 (the event signature from `keccak256`) is already 32 bytes and doesn't need padding. + +</Aside> #### Example 1: Filtering on a single indexed parameter To trigger only on `Transfer` events where the `from` address is a specific value: ```typescript -import { keccak256, toHex, pad } from "viem" +import { keccak256, toBytes, padHex } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" const initWorkflow = (config: Config) => { const network = getNetwork({ @@ -139,16 +161,16 @@ const initWorkflow = (config: Config) => { const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) - const aliceAddress = "0xAlice..." + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) + const aliceAddress = "0xAlice..." as `0x${string}` return [ cre.handler( evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], topics: [ - { values: [transferEventHash] }, // Topic 0: Event signature (Transfer) - { values: [pad(aliceAddress)] }, // Topic 1: from = Alice + { values: [hexToBase64(transferEventHash)] }, // Topic 0: Event signature (Transfer) + { values: [hexToBase64(padHex(aliceAddress, { size: 32 }))] }, // Topic 1: from = Alice ], }), onLogTrigger @@ -157,10 +179,12 @@ const initWorkflow = (config: Config) => { } ``` +{/* prettier-ignore */} <Aside type="note" title="Indexed Parameters and Topics"> - Only parameters marked as `indexed` in the Solidity event definition can be filtered using topics. The event signature - is always `Topics[0]`. Subsequent indexed parameters are `Topics[1]`, `Topics[2]`, and `Topics[3]`. Address values - must be padded to 32 bytes using viem's `pad()` function. +Only parameters marked as `indexed` in the Solidity event definition can be filtered using topics. The event signature is always `Topics[0]`. Subsequent indexed parameters are `Topics[1]`, `Topics[2]`, and `Topics[3]`. Encoding different types: +- **Addresses**: Cast as `` `0x${string}` ``, use `padHex(address, { size: 32 })` then `hexToBase64()` +- **uint256**: Use `padHex(numberToHex(value), { size: 32 })` then `hexToBase64()` +- **bytes32**: Ensure it's 32 bytes, then use `hexToBase64()` directly </Aside> #### Example 2: "AND" filtering @@ -168,7 +192,8 @@ const initWorkflow = (config: Config) => { To trigger on `Transfer` events where `from` is Alice **AND** `to` is Bob: ```typescript -import { keccak256, toHex, pad } from "viem" +import { keccak256, toBytes, padHex } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" const initWorkflow = (config: Config) => { const network = getNetwork({ @@ -183,18 +208,18 @@ const initWorkflow = (config: Config) => { const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) - const aliceAddress = "0xAlice..." - const bobAddress = "0xBob..." + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) + const aliceAddress = "0xAlice..." as `0x${string}` + const bobAddress = "0xBob..." as `0x${string}` return [ cre.handler( evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], topics: [ - { values: [transferEventHash] }, // Topic 0: Event signature (Transfer) - { values: [pad(aliceAddress)] }, // Topic 1: from = Alice - { values: [pad(bobAddress)] }, // Topic 2: to = Bob + { values: [hexToBase64(transferEventHash)] }, // Topic 0: Event signature (Transfer) + { values: [hexToBase64(padHex(aliceAddress, { size: 32 }))] }, // Topic 1: from = Alice + { values: [hexToBase64(padHex(bobAddress, { size: 32 }))] }, // Topic 2: to = Bob ], }), onLogTrigger @@ -208,7 +233,8 @@ const initWorkflow = (config: Config) => { To trigger on `Transfer` events where `from` is **either** Alice **OR** Charlie: ```typescript -import { keccak256, toHex, pad } from "viem" +import { keccak256, toBytes, padHex } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" const initWorkflow = (config: Config) => { const network = getNetwork({ @@ -223,17 +249,22 @@ const initWorkflow = (config: Config) => { const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) - const aliceAddress = "0xAlice..." - const charlieAddress = "0xCharlie..." + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) + const aliceAddress = "0xAlice..." as `0x${string}` + const charlieAddress = "0xCharlie..." as `0x${string}` return [ cre.handler( evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], topics: [ - { values: [transferEventHash] }, // Topic 0: Event signature (Transfer) - { values: [pad(aliceAddress), pad(charlieAddress)] }, // Topic 1: from = Alice OR Charlie + { values: [hexToBase64(transferEventHash)] }, // Topic 0: Event signature (Transfer) + { + values: [ + hexToBase64(padHex(aliceAddress, { size: 32 })), + hexToBase64(padHex(charlieAddress, { size: 32 })), + ], + }, // Topic 1: from = Alice OR Charlie ], }), onLogTrigger @@ -247,7 +278,8 @@ const initWorkflow = (config: Config) => { To listen for **multiple event types** from a single contract, provide multiple event signature hashes in `Topics[0]`: ```typescript -import { keccak256, toHex } from "viem" +import { keccak256, toBytes } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" const initWorkflow = (config: Config) => { const network = getNetwork({ @@ -262,15 +294,15 @@ const initWorkflow = (config: Config) => { const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) - const approvalEventHash = keccak256(toHex("Approval(address,address,uint256)")) + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) + const approvalEventHash = keccak256(toBytes("Approval(address,address,uint256)")) return [ cre.handler( evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], topics: [ - { values: [transferEventHash, approvalEventHash] }, // Listen for Transfer OR Approval + { values: [hexToBase64(transferEventHash), hexToBase64(approvalEventHash)] }, // Listen for Transfer OR Approval ], }), onLogTrigger @@ -284,6 +316,46 @@ const initWorkflow = (config: Config) => { To listen for the **same event from multiple contracts**, provide multiple addresses: ```typescript +import { keccak256, toBytes } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" + +const initWorkflow = (config: Config) => { + const network = getNetwork({ + chainFamily: "evm", + chainSelectorName: config.chainSelectorName, + isTestnet: true, + }) + + if (!network) { + throw new Error(`Network not found: ${config.chainSelectorName}`) + } + + const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) + + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) + + return [ + cre.handler( + evmClient.logTrigger({ + addresses: [hexToBase64("0xTokenA..."), hexToBase64("0xTokenB..."), hexToBase64("0xTokenC...")], + topics: [ + { values: [hexToBase64(transferEventHash)] }, // Listen for Transfer events from any of these contracts + ], + }), + onLogTrigger + ), + ] +} +``` + +#### Example 6: Filtering on uint256 indexed parameter + +To filter on indexed `uint256` or other numeric types, convert them to a 32-byte hex value: + +```typescript +import { keccak256, toBytes, numberToHex, padHex } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" + const initWorkflow = (config: Config) => { const network = getNetwork({ chainFamily: "evm", @@ -297,14 +369,19 @@ const initWorkflow = (config: Config) => { const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) + // Example: event ValueChanged(address indexed user, uint256 indexed newValue) + const eventHash = keccak256(toBytes("ValueChanged(address,uint256)")) + const userAddress = padHex("0xUser..." as `0x${string}`, { size: 32 }) + const targetValue = padHex(numberToHex(12345), { size: 32 }) return [ cre.handler( evmClient.logTrigger({ - addresses: ["0xTokenA...", "0xTokenB...", "0xTokenC..."], + addresses: [hexToBase64(config.contractAddress)], topics: [ - { values: [transferEventHash] }, // Listen for Transfer events from any of these contracts + { values: [hexToBase64(eventHash)] }, // Topic 0: Event signature + { values: [hexToBase64(userAddress)] }, // Topic 1: user address + { values: [hexToBase64(targetValue)] }, // Topic 2: newValue = 12345 ], }), onLogTrigger @@ -313,13 +390,19 @@ const initWorkflow = (config: Config) => { } ``` +<Aside type="note" title="Converting Numbers to Topics"> + For indexed `uint256` parameters, use `numberToHex()` to convert the number to hex, then `padHex()` to ensure it's 32 + bytes, and finally `hexToBase64()` to encode it for the trigger configuration. For `bytes32` parameters, ensure + they're already 32 bytes and apply `hexToBase64()` directly. +</Aside> + ### Confidence level You can set the block confirmation level by adding the `confidence` field to the trigger configuration: ```typescript evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], confidence: "CONFIDENCE_LEVEL_FINALIZED", // Wait for finalized blocks }) ``` @@ -432,7 +515,7 @@ const onLogTrigger = (runtime: Runtime<Config>, log: EVMLog): string => { <Aside type="note" title="Type Assertion for Topics"> The type assertion ``` - as [\`0x${string}\`, ...\`0x${string}\`[]] + as [`0x${string}`, ...`0x${string}`[]] ``` tells TypeScript that `topics` is a non-empty array of @@ -472,8 +555,8 @@ const onLogTrigger = (runtime: Runtime<Config>, log: EVMLog): string => { Here's a complete example that listens for ERC20 `Transfer` events and decodes them: ```typescript -import { cre, getNetwork, type Runtime, type EVMLog, Runner, bytesToHex } from "@chainlink/cre-sdk" -import { keccak256, toHex, decodeEventLog, parseAbi } from "viem" +import { cre, getNetwork, type Runtime, type EVMLog, Runner, bytesToHex, hexToBase64 } from "@chainlink/cre-sdk" +import { keccak256, toBytes, decodeEventLog, parseAbi } from "viem" type Config = { chainSelectorName: string @@ -510,13 +593,13 @@ const initWorkflow = (config: Config) => { } const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) return [ cre.handler( evmClient.logTrigger({ - addresses: [config.tokenAddress], - topics: [{ values: [transferEventHash] }], + addresses: [hexToBase64(config.tokenAddress)], + topics: [{ values: [hexToBase64(transferEventHash)] }], confidence: "CONFIDENCE_LEVEL_FINALIZED", }), onLogTrigger diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index f18d5447453..251bd682a4b 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -11215,12 +11215,19 @@ This guide explains the two key parts of working with log triggers: You create an EVM Log trigger by calling the `EVMClient.logTrigger()` method with a `FilterLogTriggerRequest` configuration. This configuration specifies which contract addresses and event topics to listen for. +<Aside type="note" title="Base64 Encoding Required"> + **All addresses and topic values must be base64 encoded** using the `hexToBase64()` helper function from the CRE SDK. + While the workflow simulator accepts raw hex strings for convenience during development, **deployed workflows require + base64 encoding**. Always use `hexToBase64()` on addresses and topic values to ensure your workflow works in both + simulation and production. +</Aside> + ### Basic configuration The simplest configuration listens for **all events** from specific contract addresses: ```typescript -import { cre, getNetwork, type Runtime, type EVMLog, Runner, bytesToHex } from "@chainlink/cre-sdk" +import { cre, getNetwork, type Runtime, type EVMLog, Runner, bytesToHex, hexToBase64 } from "@chainlink/cre-sdk" type Config = { chainSelectorName: string @@ -11250,7 +11257,7 @@ const initWorkflow = (config: Config) => { return [ cre.handler( evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], }), onLogTrigger ), @@ -11267,10 +11274,11 @@ main() ### Filtering by event type -To listen for **specific event types**, you need to provide the event's signature hash as the first topic (`Topics[0]`). You can compute this using viem's `keccak256` and `toHex` functions: +To listen for **specific event types**, you need to provide the event's signature hash as the first topic (`Topics[0]`). You can compute this using viem's `keccak256` and `toBytes` functions: ```typescript -import { keccak256, toHex } from "viem" +import { keccak256, toBytes } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" const initWorkflow = (config: Config) => { const network = getNetwork({ @@ -11286,14 +11294,14 @@ const initWorkflow = (config: Config) => { const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) // Compute the event signature hash for Transfer(address,address,uint256) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) return [ cre.handler( evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], topics: [ - { values: [transferEventHash] }, // Listen only for Transfer events + { values: [hexToBase64(transferEventHash)] }, // Listen only for Transfer events ], }), onLogTrigger @@ -11310,13 +11318,26 @@ EVM events can have up to 3 `indexed` parameters (in addition to the event signa - **`addresses`**: The trigger fires if the event is emitted from **any** contract in this list (**OR** logic). - **`topics`**: An event must match the conditions for **all** defined topic slots (**AND** logic between topics). Within a single topic, you can provide multiple values, and it will match if the event's topic is **any** of those values (**OR** logic within a topic). +- **Wildcarding topics**: To skip filtering on a specific topic position, omit it from the topics array or provide an empty values array `{ values: [] }`. For example, to filter on topic 1 and topic 3 but not topic 2, you would provide `[topic0, topic1, { values: [] }, topic3]`. + +<Aside type="caution" title="Topic values must be padded to 32 bytes and base64 encoded"> + EVM logs always store indexed parameters as **32-byte values**. When filtering on topics 1, 2, or 3: + + 1. **Pad your values to 32 bytes** using `padHex(value, { size: 32 })` (e.g., addresses are 20 bytes and must be padded) + 2. **Convert to base64** using `hexToBase64()` + + If you don't pad correctly, your filter won't match the actual log topics and the trigger will not fire. + + Topic 0 (the event signature from `keccak256`) is already 32 bytes and doesn't need padding. +</Aside> #### Example 1: Filtering on a single indexed parameter To trigger only on `Transfer` events where the `from` address is a specific value: ```typescript -import { keccak256, toHex, pad } from "viem" +import { keccak256, toBytes, padHex } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" const initWorkflow = (config: Config) => { const network = getNetwork({ @@ -11331,16 +11352,16 @@ const initWorkflow = (config: Config) => { const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) - const aliceAddress = "0xAlice..." + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) + const aliceAddress = "0xAlice..." as `0x${string}` return [ cre.handler( evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], topics: [ - { values: [transferEventHash] }, // Topic 0: Event signature (Transfer) - { values: [pad(aliceAddress)] }, // Topic 1: from = Alice + { values: [hexToBase64(transferEventHash)] }, // Topic 0: Event signature (Transfer) + { values: [hexToBase64(padHex(aliceAddress, { size: 32 }))] }, // Topic 1: from = Alice ], }), onLogTrigger @@ -11349,10 +11370,13 @@ const initWorkflow = (config: Config) => { } ``` + <Aside type="note" title="Indexed Parameters and Topics"> - Only parameters marked as `indexed` in the Solidity event definition can be filtered using topics. The event signature - is always `Topics[0]`. Subsequent indexed parameters are `Topics[1]`, `Topics[2]`, and `Topics[3]`. Address values - must be padded to 32 bytes using viem's `pad()` function. + Only parameters marked as `indexed` in the Solidity event definition can be filtered using topics. The event signature is always `Topics[0]`. Subsequent indexed parameters are `Topics[1]`, `Topics[2]`, and `Topics[3]`. Encoding different types: + + - **Addresses**: Cast as `` `0x${string}` ``, use `padHex(address, { size: 32 })` then `hexToBase64()` + - **uint256**: Use `padHex(numberToHex(value), { size: 32 })` then `hexToBase64()` + - **bytes32**: Ensure it's 32 bytes, then use `hexToBase64()` directly </Aside> #### Example 2: "AND" filtering @@ -11360,7 +11384,8 @@ const initWorkflow = (config: Config) => { To trigger on `Transfer` events where `from` is Alice **AND** `to` is Bob: ```typescript -import { keccak256, toHex, pad } from "viem" +import { keccak256, toBytes, padHex } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" const initWorkflow = (config: Config) => { const network = getNetwork({ @@ -11375,18 +11400,18 @@ const initWorkflow = (config: Config) => { const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) - const aliceAddress = "0xAlice..." - const bobAddress = "0xBob..." + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) + const aliceAddress = "0xAlice..." as `0x${string}` + const bobAddress = "0xBob..." as `0x${string}` return [ cre.handler( evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], topics: [ - { values: [transferEventHash] }, // Topic 0: Event signature (Transfer) - { values: [pad(aliceAddress)] }, // Topic 1: from = Alice - { values: [pad(bobAddress)] }, // Topic 2: to = Bob + { values: [hexToBase64(transferEventHash)] }, // Topic 0: Event signature (Transfer) + { values: [hexToBase64(padHex(aliceAddress, { size: 32 }))] }, // Topic 1: from = Alice + { values: [hexToBase64(padHex(bobAddress, { size: 32 }))] }, // Topic 2: to = Bob ], }), onLogTrigger @@ -11400,7 +11425,8 @@ const initWorkflow = (config: Config) => { To trigger on `Transfer` events where `from` is **either** Alice **OR** Charlie: ```typescript -import { keccak256, toHex, pad } from "viem" +import { keccak256, toBytes, padHex } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" const initWorkflow = (config: Config) => { const network = getNetwork({ @@ -11415,17 +11441,22 @@ const initWorkflow = (config: Config) => { const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) - const aliceAddress = "0xAlice..." - const charlieAddress = "0xCharlie..." + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) + const aliceAddress = "0xAlice..." as `0x${string}` + const charlieAddress = "0xCharlie..." as `0x${string}` return [ cre.handler( evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], topics: [ - { values: [transferEventHash] }, // Topic 0: Event signature (Transfer) - { values: [pad(aliceAddress), pad(charlieAddress)] }, // Topic 1: from = Alice OR Charlie + { values: [hexToBase64(transferEventHash)] }, // Topic 0: Event signature (Transfer) + { + values: [ + hexToBase64(padHex(aliceAddress, { size: 32 })), + hexToBase64(padHex(charlieAddress, { size: 32 })), + ], + }, // Topic 1: from = Alice OR Charlie ], }), onLogTrigger @@ -11439,7 +11470,8 @@ const initWorkflow = (config: Config) => { To listen for **multiple event types** from a single contract, provide multiple event signature hashes in `Topics[0]`: ```typescript -import { keccak256, toHex } from "viem" +import { keccak256, toBytes } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" const initWorkflow = (config: Config) => { const network = getNetwork({ @@ -11454,15 +11486,15 @@ const initWorkflow = (config: Config) => { const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) - const approvalEventHash = keccak256(toHex("Approval(address,address,uint256)")) + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) + const approvalEventHash = keccak256(toBytes("Approval(address,address,uint256)")) return [ cre.handler( evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], topics: [ - { values: [transferEventHash, approvalEventHash] }, // Listen for Transfer OR Approval + { values: [hexToBase64(transferEventHash), hexToBase64(approvalEventHash)] }, // Listen for Transfer OR Approval ], }), onLogTrigger @@ -11476,6 +11508,9 @@ const initWorkflow = (config: Config) => { To listen for the **same event from multiple contracts**, provide multiple addresses: ```typescript +import { keccak256, toBytes } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" + const initWorkflow = (config: Config) => { const network = getNetwork({ chainFamily: "evm", @@ -11489,14 +11524,14 @@ const initWorkflow = (config: Config) => { const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) return [ cre.handler( evmClient.logTrigger({ - addresses: ["0xTokenA...", "0xTokenB...", "0xTokenC..."], + addresses: [hexToBase64("0xTokenA..."), hexToBase64("0xTokenB..."), hexToBase64("0xTokenC...")], topics: [ - { values: [transferEventHash] }, // Listen for Transfer events from any of these contracts + { values: [hexToBase64(transferEventHash)] }, // Listen for Transfer events from any of these contracts ], }), onLogTrigger @@ -11505,13 +11540,61 @@ const initWorkflow = (config: Config) => { } ``` +#### Example 6: Filtering on uint256 indexed parameter + +To filter on indexed `uint256` or other numeric types, convert them to a 32-byte hex value: + +```typescript +import { keccak256, toBytes, numberToHex, padHex } from "viem" +import { hexToBase64 } from "@chainlink/cre-sdk" + +const initWorkflow = (config: Config) => { + const network = getNetwork({ + chainFamily: "evm", + chainSelectorName: config.chainSelectorName, + isTestnet: true, + }) + + if (!network) { + throw new Error(`Network not found: ${config.chainSelectorName}`) + } + + const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) + + // Example: event ValueChanged(address indexed user, uint256 indexed newValue) + const eventHash = keccak256(toBytes("ValueChanged(address,uint256)")) + const userAddress = padHex("0xUser..." as `0x${string}`, { size: 32 }) + const targetValue = padHex(numberToHex(12345), { size: 32 }) + + return [ + cre.handler( + evmClient.logTrigger({ + addresses: [hexToBase64(config.contractAddress)], + topics: [ + { values: [hexToBase64(eventHash)] }, // Topic 0: Event signature + { values: [hexToBase64(userAddress)] }, // Topic 1: user address + { values: [hexToBase64(targetValue)] }, // Topic 2: newValue = 12345 + ], + }), + onLogTrigger + ), + ] +} +``` + +<Aside type="note" title="Converting Numbers to Topics"> + For indexed `uint256` parameters, use `numberToHex()` to convert the number to hex, then `padHex()` to ensure it's 32 + bytes, and finally `hexToBase64()` to encode it for the trigger configuration. For `bytes32` parameters, ensure + they're already 32 bytes and apply `hexToBase64()` directly. +</Aside> + ### Confidence level You can set the block confirmation level by adding the `confidence` field to the trigger configuration: ```typescript evmClient.logTrigger({ - addresses: [config.contractAddress], + addresses: [hexToBase64(config.contractAddress)], confidence: "CONFIDENCE_LEVEL_FINALIZED", // Wait for finalized blocks }) ``` @@ -11625,7 +11708,7 @@ const onLogTrigger = (runtime: Runtime<Config>, log: EVMLog): string => { The type assertion ``` - as [\`0x${string}\`, ...\`0x${string}\`[]] + as [`0x${string}`, ...`0x${string}`[]] ``` tells TypeScript that `topics` is a non-empty array of @@ -11664,8 +11747,8 @@ const onLogTrigger = (runtime: Runtime<Config>, log: EVMLog): string => { Here's a complete example that listens for ERC20 `Transfer` events and decodes them: ```typescript -import { cre, getNetwork, type Runtime, type EVMLog, Runner, bytesToHex } from "@chainlink/cre-sdk" -import { keccak256, toHex, decodeEventLog, parseAbi } from "viem" +import { cre, getNetwork, type Runtime, type EVMLog, Runner, bytesToHex, hexToBase64 } from "@chainlink/cre-sdk" +import { keccak256, toBytes, decodeEventLog, parseAbi } from "viem" type Config = { chainSelectorName: string @@ -11702,13 +11785,13 @@ const initWorkflow = (config: Config) => { } const evmClient = new cre.capabilities.EVMClient(network.chainSelector.selector) - const transferEventHash = keccak256(toHex("Transfer(address,address,uint256)")) + const transferEventHash = keccak256(toBytes("Transfer(address,address,uint256)")) return [ cre.handler( evmClient.logTrigger({ - addresses: [config.tokenAddress], - topics: [{ values: [transferEventHash] }], + addresses: [hexToBase64(config.tokenAddress)], + topics: [{ values: [hexToBase64(transferEventHash)] }], confidence: "CONFIDENCE_LEVEL_FINALIZED", }), onLogTrigger From 3268cb2e4a40e7202f69930abf68e59fc253fb03 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Mon, 12 Jan 2026 12:14:17 -0500 Subject: [PATCH 115/214] cre cli 1.0.4 (#3361) --- public/changelog.json | 14 +++++ src/components/DownloadButton.tsx | 2 +- .../cli-installation/macos-linux.mdx | 16 +++--- .../cli-installation/windows.mdx | 10 ++-- src/content/cre/llms-full-go.txt | 57 ++++++++++++------- src/content/cre/llms-full-ts.txt | 57 ++++++++++++------- src/content/cre/reference/cli/index.mdx | 4 +- src/content/cre/reference/cli/utilities.mdx | 4 +- src/content/cre/release-notes.mdx | 20 ++++++- 9 files changed, 127 insertions(+), 57 deletions(-) diff --git a/public/changelog.json b/public/changelog.json index 242c8db4876..809477246a3 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -392,6 +392,13 @@ "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", @@ -846,6 +853,13 @@ "title": "CCIP Expands to Tempo Testnet", "topic": "CCIP" }, + { + "category": "release", + "date": "2025-12-12", + "description": "CRE CLI version 1.0.3 is now available with various small improvements and bug fixes.\n\nUpdate your CLI by running `cre update` when prompted, or follow the [CLI Installation guide](https://docs.chain.link/cre/getting-started/cli-installation) for fresh installations.", + "title": "CRE CLI v1.0.3", + "topic": "CRE" + }, { "category": "release", "date": "2025-12-11", diff --git a/src/components/DownloadButton.tsx b/src/components/DownloadButton.tsx index 8b3101444fb..64e943e0365 100644 --- a/src/components/DownloadButton.tsx +++ b/src/components/DownloadButton.tsx @@ -15,7 +15,7 @@ export const DownloadButton = () => { } const handleClick = () => { - window.open("https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.2", "_blank", "noopener,noreferrer") + window.open("https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.4", "_blank", "noopener,noreferrer") } const handleMouseOver = (e) => { diff --git a/src/content/cre/getting-started/cli-installation/macos-linux.mdx b/src/content/cre/getting-started/cli-installation/macos-linux.mdx index 182181bbc94..e1cf802e6b3 100644 --- a/src/content/cre/getting-started/cli-installation/macos-linux.mdx +++ b/src/content/cre/getting-started/cli-installation/macos-linux.mdx @@ -11,7 +11,7 @@ metadata: import { Aside, CopyText, PageTabs } from "@components" import { DownloadButton } from "~/components/DownloadButton.tsx" -This page explains how to install the CRE CLI on macOS or Linux. The recommended version at the time of writing is **v1.0.2**. +This page explains how to install the CRE CLI on macOS or Linux. The recommended version at the time of writing is **v1.0.4**. <PageTabs pages={[ @@ -66,7 +66,7 @@ After the script completes, verify the installation: cre version ``` -**Expected output:** `cre version v1.0.2` +**Expected output:** `cre version v1.0.4` <Aside type="note" title="macOS Gatekeeper"> If you see warnings about "unrecognized developer/source" on macOS, run:{" "} @@ -115,10 +115,10 @@ Compare the output with the official checksum below: | <div style="width: 200px;">File</div> | SHA-256 Checksum | | ------------------------------------- | ----------------------------------------------------------------------------------------- | -| `cre_darwin_amd64.zip` | <CopyText text="482e53d3a5f8471034d30c935196d2dca2ab09a5fe1ab2083ad336172565291b" code /> | -| `cre_darwin_arm64.zip` | <CopyText text="92b0409801dd4e44f90a85331615f3e4b8cf1fe9f90a8eab3ad8bb3458b4b6cf" code /> | -| `cre_linux_amd64.tar.gz` | <CopyText text="d3a8b9b999b4b8bf73b2235d27386acf4efbc8f05d86d9e6066abda23ee9ce9b" code /> | -| `cre_linux_arm64.tar.gz` | <CopyText text="f52d618727ccc8fb6ab4b1f9418b09424c8505428131a49c01bb33ca2bc86fe3" code /> | +| `cre_darwin_amd64.zip` | <CopyText text="87f62d25ce0517473a97ff7e66220a2f0bbcc40ebe94309964c0bb29a267dcd1" code /> | +| `cre_darwin_arm64.zip` | <CopyText text="e21677d3f307aa63b4513b1bce597fb0d97e1f94e2094fdc85cc400084036a7c" code /> | +| `cre_linux_amd64.tar.gz` | <CopyText text="58d682739e390c8046795ca2871fada94aa39dbea8e0062179000bed3b895913" code /> | +| `cre_linux_arm64.tar.gz` | <CopyText text="9826e1a3c46485b7f524e70da96aeac18a13570d0a2f5a660ff52e8b532fee51" code /> | If the checksum doesn't match, do not proceed with installation. Contact your Chainlink point of contact for assistance. @@ -143,7 +143,7 @@ If the checksum doesn't match, do not proceed with installation. Contact your Ch 1. **Rename the extracted binary to `cre`** ```bash - mv cre_v1.0.2_darwin_arm64 cre + mv cre_v1.0.4_darwin_arm64 cre ``` 1. **Make it executable**: @@ -216,7 +216,7 @@ cre version **Expected output:** -You should see version information: `cre version v1.0.2`. +You should see version information: `cre version v1.0.4`. **If it doesn't work:** diff --git a/src/content/cre/getting-started/cli-installation/windows.mdx b/src/content/cre/getting-started/cli-installation/windows.mdx index 6d62a29af7e..75eb37ab659 100644 --- a/src/content/cre/getting-started/cli-installation/windows.mdx +++ b/src/content/cre/getting-started/cli-installation/windows.mdx @@ -11,7 +11,7 @@ metadata: import { Aside, CopyText, PageTabs } from "@components" import { DownloadButton } from "~/components/DownloadButton.tsx" -This page explains how to install the Chainlink Developer Platform CLI (also referred to as the CRE CLI) on Windows. The recommended version at the time of writing is **v1.0.2**. +This page explains how to install the Chainlink Developer Platform CLI (also referred to as the CRE CLI) on Windows. The recommended version at the time of writing is **v1.0.4**. <PageTabs pages={[ @@ -65,7 +65,7 @@ After the script completes, **open a new PowerShell window** and verify the inst cre version ``` -**Expected output:** `cre version v1.0.2` +**Expected output:** `cre version v1.0.4` ### Manual installation @@ -97,7 +97,7 @@ Compare the `Hash` value in the output with the official checksum below: | <div style="width: 200px;">File</div> | SHA-256 Checksum | | ------------------------------------- | ----------------------------------------------------------------------------------------- | -| `cre_windows_amd64.zip` | <CopyText text="60fe65b74619c4164c0a9d6442611bf8537a04a6daf1ed3ecefc608cbbffdb01" code /> | +| `cre_windows_amd64.zip` | <CopyText text="372d16566479ff6bbfe9eb1d5cebe0e1e2a3c67062c6f0439fc96c735ddeaa18" code /> | If the checksum doesn't match, do not proceed with installation. Contact your Chainlink point of contact for assistance. @@ -106,7 +106,7 @@ If the checksum doesn't match, do not proceed with installation. Contact your Ch 1. Navigate to the directory where you downloaded the archive. 1. Right-click the `.zip` file and select **Extract All...**. 1. Choose a permanent location for the extracted folder (e.g., `C:\Program Files\cre-cli`). -1. Inside the extracted folder, rename the file `cre_v1.0.2_windows_amd64.exe` to `cre.exe`. +1. Inside the extracted folder, rename the file `cre_v1.0.4_windows_amd64.exe` to `cre.exe`. #### 3. Add the CLI to your PATH @@ -131,7 +131,7 @@ Open a new **PowerShell** or **Command Prompt** window and run: cre version ``` -You should see version information: `cre version v1.0.2`. +You should see version information: `cre version v1.0.4`. ## Next steps diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 1d55a7ca102..65b9b0475f9 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -446,11 +446,29 @@ Last Updated: 2025-11-20 This page provides detailed release notes for CRE. It includes information on new features, significant changes, and known limitations. +## CLI v1.0.4 - January 9, 2026 + +**<a href="https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.4" target="_blank">CRE CLI version 1.0.4</a> is now available.** This release includes various small improvements and bug fixes. + +**How to update:** + +- **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. +- **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). + +## CLI v1.0.3 - December 12, 2025 + +**<a href="https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.3" target="_blank">CRE CLI version 1.0.3</a> is now available.** This release includes various small improvements and bug fixes. + +**How to update:** + +- **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. +- **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). + ## CLI v1.0.2 - November 20, 2025 **<a href="https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.2" target="_blank">CRE CLI version 1.0.2</a> is now available.** This release includes various improvements based on user feedback. -### How to update +**How to update:** - **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. - **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). @@ -532,7 +550,7 @@ These guides explain how to install the Chainlink Developer Platform CLI (also r Source: https://docs.chain.link/cre/getting-started/cli-installation/macos-linux Last Updated: 2025-11-20 -This page explains how to install the CRE CLI on macOS or Linux. The recommended version at the time of writing is **v1.0.2**. +This page explains how to install the CRE CLI on macOS or Linux. The recommended version at the time of writing is **v1.0.4**. ## Installation @@ -563,7 +581,7 @@ After the script completes, verify the installation: cre version ``` -**Expected output:** `cre version v1.0.2` +**Expected output:** `cre version v1.0.4` <Aside type="note" title="macOS Gatekeeper"> If you see warnings about "unrecognized developer/source" on macOS, run:{" "} @@ -606,10 +624,10 @@ Compare the output with the official checksum below: | File | SHA-256 Checksum | | ------------------------ | ---------------------------------------------------------------- | -| `cre_darwin_amd64.zip` | 482e53d3a5f8471034d30c935196d2dca2ab09a5fe1ab2083ad336172565291b | -| `cre_darwin_arm64.zip` | 92b0409801dd4e44f90a85331615f3e4b8cf1fe9f90a8eab3ad8bb3458b4b6cf | -| `cre_linux_amd64.tar.gz` | d3a8b9b999b4b8bf73b2235d27386acf4efbc8f05d86d9e6066abda23ee9ce9b | -| `cre_linux_arm64.tar.gz` | f52d618727ccc8fb6ab4b1f9418b09424c8505428131a49c01bb33ca2bc86fe3 | +| `cre_darwin_amd64.zip` | 87f62d25ce0517473a97ff7e66220a2f0bbcc40ebe94309964c0bb29a267dcd1 | +| `cre_darwin_arm64.zip` | e21677d3f307aa63b4513b1bce597fb0d97e1f94e2094fdc85cc400084036a7c | +| `cre_linux_amd64.tar.gz` | 58d682739e390c8046795ca2871fada94aa39dbea8e0062179000bed3b895913 | +| `cre_linux_arm64.tar.gz` | 9826e1a3c46485b7f524e70da96aeac18a13570d0a2f5a660ff52e8b532fee51 | If the checksum doesn't match, do not proceed with installation. Contact your Chainlink point of contact for assistance. @@ -634,7 +652,7 @@ If the checksum doesn't match, do not proceed with installation. Contact your Ch 3. **Rename the extracted binary to `cre`** ```bash - mv cre_v1.0.2_darwin_arm64 cre + mv cre_v1.0.4_darwin_arm64 cre ``` 4. **Make it executable**: @@ -707,7 +725,7 @@ cre version **Expected output:** -You should see version information: `cre version v1.0.2`. +You should see version information: `cre version v1.0.4`. **If it doesn't work:** @@ -746,7 +764,7 @@ Once you're authenticated, you're ready to build your first workflow: Source: https://docs.chain.link/cre/getting-started/cli-installation/windows Last Updated: 2025-11-20 -This page explains how to install the Chainlink Developer Platform CLI (also referred to as the CRE CLI) on Windows. The recommended version at the time of writing is **v1.0.2**. +This page explains how to install the Chainlink Developer Platform CLI (also referred to as the CRE CLI) on Windows. The recommended version at the time of writing is **v1.0.4**. ## Installation @@ -776,7 +794,7 @@ After the script completes, **open a new PowerShell window** and verify the inst cre version ``` -**Expected output:** `cre version v1.0.2` +**Expected output:** `cre version v1.0.4` ### Manual installation @@ -804,7 +822,7 @@ Compare the `Hash` value in the output with the official checksum below: | File | SHA-256 Checksum | | ----------------------- | ---------------------------------------------------------------- | -| `cre_windows_amd64.zip` | 60fe65b74619c4164c0a9d6442611bf8537a04a6daf1ed3ecefc608cbbffdb01 | +| `cre_windows_amd64.zip` | 372d16566479ff6bbfe9eb1d5cebe0e1e2a3c67062c6f0439fc96c735ddeaa18 | If the checksum doesn't match, do not proceed with installation. Contact your Chainlink point of contact for assistance. @@ -813,7 +831,7 @@ If the checksum doesn't match, do not proceed with installation. Contact your Ch 1. Navigate to the directory where you downloaded the archive. 2. Right-click the `.zip` file and select **Extract All...**. 3. Choose a permanent location for the extracted folder (e.g., `C:\Program Files\cre-cli`). -4. Inside the extracted folder, rename the file `cre_v1.0.2_windows_amd64.exe` to `cre.exe`. +4. Inside the extracted folder, rename the file `cre_v1.0.4_windows_amd64.exe` to `cre.exe`. #### 3. Add the CLI to your PATH @@ -838,7 +856,7 @@ Open a new **PowerShell** or **Command Prompt** window and run: cre version ``` -You should see version information: `cre version v1.0.2`. +You should see version information: `cre version v1.0.4`. ## Next steps @@ -7587,8 +7605,8 @@ See the [repository README](https://github.com/smartcontractkit/cre-gcp-predicti Source: https://docs.chain.link/cre/reference/cli Last Updated: 2025-11-20 -<Aside type="note" title="Required CLI Version: v1.0.2"> - To ensure compatibility with the guides and examples in this documentation, please use version `v1.0.2` of the CRE +<Aside type="note" title="Required CLI Version: v1.0.4"> + To ensure compatibility with the guides and examples in this documentation, please use version `v1.0.4` of the CRE CLI. You can check your installed version by running `cre version`. Refer to the [CLI Installation](/cre/getting-started/cli-installation/macos-linux) guide for more information. </Aside> @@ -8480,12 +8498,12 @@ cre version **Example output:** ```bash -cre version v1.0.2 +cre version v1.0.4 ``` <Aside type="note" title="Version compatibility"> - Always check that your CLI version matches the version recommended in the documentation. The current recommended version is **v1.0.2**. See the [CLI Installation guide](/cre/getting-started/cli-installation) for more information. + Always check that your CLI version matches the version recommended in the documentation. The current recommended version is **v1.0.4**. See the [CLI Installation guide](/cre/getting-started/cli-installation) for more information. </Aside> ## Learn more @@ -9612,7 +9630,8 @@ 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. + * 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 diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index 251bd682a4b..b836fa800f9 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -446,11 +446,29 @@ Last Updated: 2025-11-20 This page provides detailed release notes for CRE. It includes information on new features, significant changes, and known limitations. +## CLI v1.0.4 - January 9, 2026 + +**<a href="https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.4" target="_blank">CRE CLI version 1.0.4</a> is now available.** This release includes various small improvements and bug fixes. + +**How to update:** + +- **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. +- **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). + +## CLI v1.0.3 - December 12, 2025 + +**<a href="https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.3" target="_blank">CRE CLI version 1.0.3</a> is now available.** This release includes various small improvements and bug fixes. + +**How to update:** + +- **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. +- **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). + ## CLI v1.0.2 - November 20, 2025 **<a href="https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.2" target="_blank">CRE CLI version 1.0.2</a> is now available.** This release includes various improvements based on user feedback. -### How to update +**How to update:** - **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. - **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). @@ -532,7 +550,7 @@ These guides explain how to install the Chainlink Developer Platform CLI (also r Source: https://docs.chain.link/cre/getting-started/cli-installation/macos-linux Last Updated: 2025-11-20 -This page explains how to install the CRE CLI on macOS or Linux. The recommended version at the time of writing is **v1.0.2**. +This page explains how to install the CRE CLI on macOS or Linux. The recommended version at the time of writing is **v1.0.4**. ## Installation @@ -563,7 +581,7 @@ After the script completes, verify the installation: cre version ``` -**Expected output:** `cre version v1.0.2` +**Expected output:** `cre version v1.0.4` <Aside type="note" title="macOS Gatekeeper"> If you see warnings about "unrecognized developer/source" on macOS, run:{" "} @@ -606,10 +624,10 @@ Compare the output with the official checksum below: | File | SHA-256 Checksum | | ------------------------ | ---------------------------------------------------------------- | -| `cre_darwin_amd64.zip` | 482e53d3a5f8471034d30c935196d2dca2ab09a5fe1ab2083ad336172565291b | -| `cre_darwin_arm64.zip` | 92b0409801dd4e44f90a85331615f3e4b8cf1fe9f90a8eab3ad8bb3458b4b6cf | -| `cre_linux_amd64.tar.gz` | d3a8b9b999b4b8bf73b2235d27386acf4efbc8f05d86d9e6066abda23ee9ce9b | -| `cre_linux_arm64.tar.gz` | f52d618727ccc8fb6ab4b1f9418b09424c8505428131a49c01bb33ca2bc86fe3 | +| `cre_darwin_amd64.zip` | 87f62d25ce0517473a97ff7e66220a2f0bbcc40ebe94309964c0bb29a267dcd1 | +| `cre_darwin_arm64.zip` | e21677d3f307aa63b4513b1bce597fb0d97e1f94e2094fdc85cc400084036a7c | +| `cre_linux_amd64.tar.gz` | 58d682739e390c8046795ca2871fada94aa39dbea8e0062179000bed3b895913 | +| `cre_linux_arm64.tar.gz` | 9826e1a3c46485b7f524e70da96aeac18a13570d0a2f5a660ff52e8b532fee51 | If the checksum doesn't match, do not proceed with installation. Contact your Chainlink point of contact for assistance. @@ -634,7 +652,7 @@ If the checksum doesn't match, do not proceed with installation. Contact your Ch 3. **Rename the extracted binary to `cre`** ```bash - mv cre_v1.0.2_darwin_arm64 cre + mv cre_v1.0.4_darwin_arm64 cre ``` 4. **Make it executable**: @@ -707,7 +725,7 @@ cre version **Expected output:** -You should see version information: `cre version v1.0.2`. +You should see version information: `cre version v1.0.4`. **If it doesn't work:** @@ -746,7 +764,7 @@ Once you're authenticated, you're ready to build your first workflow: Source: https://docs.chain.link/cre/getting-started/cli-installation/windows Last Updated: 2025-11-20 -This page explains how to install the Chainlink Developer Platform CLI (also referred to as the CRE CLI) on Windows. The recommended version at the time of writing is **v1.0.2**. +This page explains how to install the Chainlink Developer Platform CLI (also referred to as the CRE CLI) on Windows. The recommended version at the time of writing is **v1.0.4**. ## Installation @@ -776,7 +794,7 @@ After the script completes, **open a new PowerShell window** and verify the inst cre version ``` -**Expected output:** `cre version v1.0.2` +**Expected output:** `cre version v1.0.4` ### Manual installation @@ -804,7 +822,7 @@ Compare the `Hash` value in the output with the official checksum below: | File | SHA-256 Checksum | | ----------------------- | ---------------------------------------------------------------- | -| `cre_windows_amd64.zip` | 60fe65b74619c4164c0a9d6442611bf8537a04a6daf1ed3ecefc608cbbffdb01 | +| `cre_windows_amd64.zip` | 372d16566479ff6bbfe9eb1d5cebe0e1e2a3c67062c6f0439fc96c735ddeaa18 | If the checksum doesn't match, do not proceed with installation. Contact your Chainlink point of contact for assistance. @@ -813,7 +831,7 @@ If the checksum doesn't match, do not proceed with installation. Contact your Ch 1. Navigate to the directory where you downloaded the archive. 2. Right-click the `.zip` file and select **Extract All...**. 3. Choose a permanent location for the extracted folder (e.g., `C:\Program Files\cre-cli`). -4. Inside the extracted folder, rename the file `cre_v1.0.2_windows_amd64.exe` to `cre.exe`. +4. Inside the extracted folder, rename the file `cre_v1.0.4_windows_amd64.exe` to `cre.exe`. #### 3. Add the CLI to your PATH @@ -838,7 +856,7 @@ Open a new **PowerShell** or **Command Prompt** window and run: cre version ``` -You should see version information: `cre version v1.0.2`. +You should see version information: `cre version v1.0.4`. ## Next steps @@ -6229,8 +6247,8 @@ See the [repository README](https://github.com/smartcontractkit/cre-gcp-predicti Source: https://docs.chain.link/cre/reference/cli Last Updated: 2025-11-20 -<Aside type="note" title="Required CLI Version: v1.0.2"> - To ensure compatibility with the guides and examples in this documentation, please use version `v1.0.2` of the CRE +<Aside type="note" title="Required CLI Version: v1.0.4"> + To ensure compatibility with the guides and examples in this documentation, please use version `v1.0.4` of the CRE CLI. You can check your installed version by running `cre version`. Refer to the [CLI Installation](/cre/getting-started/cli-installation/macos-linux) guide for more information. </Aside> @@ -7122,12 +7140,12 @@ cre version **Example output:** ```bash -cre version v1.0.2 +cre version v1.0.4 ``` <Aside type="note" title="Version compatibility"> - Always check that your CLI version matches the version recommended in the documentation. The current recommended version is **v1.0.2**. See the [CLI Installation guide](/cre/getting-started/cli-installation) for more information. + Always check that your CLI version matches the version recommended in the documentation. The current recommended version is **v1.0.4**. See the [CLI Installation guide](/cre/getting-started/cli-installation) for more information. </Aside> ## Learn more @@ -8384,7 +8402,8 @@ 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. + * 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 diff --git a/src/content/cre/reference/cli/index.mdx b/src/content/cre/reference/cli/index.mdx index 844c71d2e24..1c45bc4fef3 100644 --- a/src/content/cre/reference/cli/index.mdx +++ b/src/content/cre/reference/cli/index.mdx @@ -11,8 +11,8 @@ metadata: import { Aside } from "@components" -<Aside type="note" title="Required CLI Version: v1.0.2"> - To ensure compatibility with the guides and examples in this documentation, please use version `v1.0.2` of the CRE +<Aside type="note" title="Required CLI Version: v1.0.4"> + To ensure compatibility with the guides and examples in this documentation, please use version `v1.0.4` of the CRE CLI. You can check your installed version by running `cre version`. Refer to the [CLI Installation](/cre/getting-started/cli-installation/macos-linux) guide for more information. </Aside> diff --git a/src/content/cre/reference/cli/utilities.mdx b/src/content/cre/reference/cli/utilities.mdx index 7b6ed3b64db..eaa27abe09e 100644 --- a/src/content/cre/reference/cli/utilities.mdx +++ b/src/content/cre/reference/cli/utilities.mdx @@ -53,12 +53,12 @@ cre version **Example output:** ```bash -cre version v1.0.2 +cre version v1.0.4 ``` {/* prettier-ignore */} <Aside type="note" title="Version compatibility"> - Always check that your CLI version matches the version recommended in the documentation. The current recommended version is **v1.0.2**. See the [CLI Installation guide](/cre/getting-started/cli-installation) for more information. + Always check that your CLI version matches the version recommended in the documentation. The current recommended version is **v1.0.4**. See the [CLI Installation guide](/cre/getting-started/cli-installation) for more information. </Aside> ## Learn more diff --git a/src/content/cre/release-notes.mdx b/src/content/cre/release-notes.mdx index 60e6f9893c4..20aa57f8d27 100644 --- a/src/content/cre/release-notes.mdx +++ b/src/content/cre/release-notes.mdx @@ -12,11 +12,29 @@ import { Aside } from "@components" This page provides detailed release notes for CRE. It includes information on new features, significant changes, and known limitations. +## CLI v1.0.4 - January 9, 2026 + +**<a href="https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.4" target="_blank">CRE CLI version 1.0.4</a> is now available.** This release includes various small improvements and bug fixes. + +**How to update:** + +- **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. +- **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). + +## CLI v1.0.3 - December 12, 2025 + +**<a href="https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.3" target="_blank">CRE CLI version 1.0.3</a> is now available.** This release includes various small improvements and bug fixes. + +**How to update:** + +- **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. +- **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). + ## CLI v1.0.2 - November 20, 2025 **<a href="https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.2" target="_blank">CRE CLI version 1.0.2</a> is now available.** This release includes various improvements based on user feedback. -### How to update +**How to update:** - **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. - **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). From a7fffb3e51d0a906bb165a0a9b74e8cc0d9acce3 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Mon, 12 Jan 2026 18:10:42 -0500 Subject: [PATCH 116/214] add Ubuntu version-specific binary (#3362) --- .../cli-installation/macos-linux.mdx | 14 +++++++--- src/content/cre/llms-full-go.txt | 26 ++++++++++++------- src/content/cre/llms-full-ts.txt | 26 ++++++++++++------- 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/content/cre/getting-started/cli-installation/macos-linux.mdx b/src/content/cre/getting-started/cli-installation/macos-linux.mdx index e1cf802e6b3..08780e96c78 100644 --- a/src/content/cre/getting-started/cli-installation/macos-linux.mdx +++ b/src/content/cre/getting-started/cli-installation/macos-linux.mdx @@ -89,9 +89,15 @@ The file you need depends on your operating system and CPU architecture: - On **macOS** (darwin), run <CopyText text="uname -m" code />: - `arm64` (Apple Silicon) → Download `cre_darwin_arm64.zip` - `x86_64` (Intel) → Download `cre_darwin_amd64.zip` -- On **Linux**, run <CopyText text="uname -m" code />: - - `aarch64` (ARM) → Download `cre_linux_arm64.tar.gz` - - `x86_64` (AMD/Intel) → Download `cre_linux_amd64.tar.gz` +- On **Linux**, the binary depends on both your architecture and OS version. First, run <CopyText text="uname -m" code /> to check your architecture, then <CopyText text="lsb_release -rs" code /> to check your Ubuntu version: + - **Ubuntu 22.04 or older**: + - `x86_64` (AMD/Intel) → Download `cre_linux_amd64_ldd2-35.tar.gz` + - `aarch64` (ARM) → Download `cre_linux_arm64_ldd2-35.tar.gz` + - **Ubuntu 24.04 or newer**: + - `x86_64` (AMD/Intel) → Download `cre_linux_amd64.tar.gz` + - `aarch64` (ARM) → Download `cre_linux_arm64.tar.gz` + +**Note:** The `ldd2-35` binaries are compiled for older glibc versions (2.35 and below). If you're using a non-Ubuntu Linux distribution, check your glibc version with <CopyText text="ldd --version" code /> and use the `ldd2-35` binary if your version is 2.35 or lower. </Aside> @@ -118,7 +124,9 @@ Compare the output with the official checksum below: | `cre_darwin_amd64.zip` | <CopyText text="87f62d25ce0517473a97ff7e66220a2f0bbcc40ebe94309964c0bb29a267dcd1" code /> | | `cre_darwin_arm64.zip` | <CopyText text="e21677d3f307aa63b4513b1bce597fb0d97e1f94e2094fdc85cc400084036a7c" code /> | | `cre_linux_amd64.tar.gz` | <CopyText text="58d682739e390c8046795ca2871fada94aa39dbea8e0062179000bed3b895913" code /> | +| `cre_linux_amd64_ldd2-35.tar.gz` | <CopyText text="7218b517e9837687bfff6ff9de16108b57808f23e85263452b819e0a230717ef" code /> | | `cre_linux_arm64.tar.gz` | <CopyText text="9826e1a3c46485b7f524e70da96aeac18a13570d0a2f5a660ff52e8b532fee51" code /> | +| `cre_linux_arm64_ldd2-35.tar.gz` | <CopyText text="7afd0ab30dc4ecdfb45c2a5bdc75c1267c38984409d55f0d6646c55179975d4f" code /> | If the checksum doesn't match, do not proceed with installation. Contact your Chainlink point of contact for assistance. diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 65b9b0475f9..e1ac798d02f 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -599,9 +599,15 @@ The CRE CLI is publicly available on GitHub. Visit the releases page and downloa - On **macOS** (darwin), run <CopyText text="uname -m" code />: - `arm64` (Apple Silicon) → Download `cre_darwin_arm64.zip` - `x86_64` (Intel) → Download `cre_darwin_amd64.zip` - - On **Linux**, run <CopyText text="uname -m" code />: - - `aarch64` (ARM) → Download `cre_linux_arm64.tar.gz` - - `x86_64` (AMD/Intel) → Download `cre_linux_amd64.tar.gz` + - On **Linux**, the binary depends on both your architecture and OS version. First, run <CopyText text="uname -m" code /> to check your architecture, then <CopyText text="lsb_release -rs" code /> to check your Ubuntu version: + - **Ubuntu 22.04 or older**: + - `x86_64` (AMD/Intel) → Download `cre_linux_amd64_ldd2-35.tar.gz` + - `aarch64` (ARM) → Download `cre_linux_arm64_ldd2-35.tar.gz` + - **Ubuntu 24.04 or newer**: + - `x86_64` (AMD/Intel) → Download `cre_linux_amd64.tar.gz` + - `aarch64` (ARM) → Download `cre_linux_arm64.tar.gz` + + **Note:** The `ldd2-35` binaries are compiled for older glibc versions (2.35 and below). If you're using a non-Ubuntu Linux distribution, check your glibc version with <CopyText text="ldd --version" code /> and use the `ldd2-35` binary if your version is 2.35 or lower. </Aside> After downloading the correct file from the releases page, move on to the next step to verify its integrity. @@ -622,12 +628,14 @@ shasum -a 256 cre_darwin_arm64.zip Compare the output with the official checksum below: -| File | SHA-256 Checksum | -| ------------------------ | ---------------------------------------------------------------- | -| `cre_darwin_amd64.zip` | 87f62d25ce0517473a97ff7e66220a2f0bbcc40ebe94309964c0bb29a267dcd1 | -| `cre_darwin_arm64.zip` | e21677d3f307aa63b4513b1bce597fb0d97e1f94e2094fdc85cc400084036a7c | -| `cre_linux_amd64.tar.gz` | 58d682739e390c8046795ca2871fada94aa39dbea8e0062179000bed3b895913 | -| `cre_linux_arm64.tar.gz` | 9826e1a3c46485b7f524e70da96aeac18a13570d0a2f5a660ff52e8b532fee51 | +| File | SHA-256 Checksum | +| -------------------------------- | ---------------------------------------------------------------- | +| `cre_darwin_amd64.zip` | 87f62d25ce0517473a97ff7e66220a2f0bbcc40ebe94309964c0bb29a267dcd1 | +| `cre_darwin_arm64.zip` | e21677d3f307aa63b4513b1bce597fb0d97e1f94e2094fdc85cc400084036a7c | +| `cre_linux_amd64.tar.gz` | 58d682739e390c8046795ca2871fada94aa39dbea8e0062179000bed3b895913 | +| `cre_linux_amd64_ldd2-35.tar.gz` | 7218b517e9837687bfff6ff9de16108b57808f23e85263452b819e0a230717ef | +| `cre_linux_arm64.tar.gz` | 9826e1a3c46485b7f524e70da96aeac18a13570d0a2f5a660ff52e8b532fee51 | +| `cre_linux_arm64_ldd2-35.tar.gz` | 7afd0ab30dc4ecdfb45c2a5bdc75c1267c38984409d55f0d6646c55179975d4f | If the checksum doesn't match, do not proceed with installation. Contact your Chainlink point of contact for assistance. diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index b836fa800f9..f12e070d47b 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -599,9 +599,15 @@ The CRE CLI is publicly available on GitHub. Visit the releases page and downloa - On **macOS** (darwin), run <CopyText text="uname -m" code />: - `arm64` (Apple Silicon) → Download `cre_darwin_arm64.zip` - `x86_64` (Intel) → Download `cre_darwin_amd64.zip` - - On **Linux**, run <CopyText text="uname -m" code />: - - `aarch64` (ARM) → Download `cre_linux_arm64.tar.gz` - - `x86_64` (AMD/Intel) → Download `cre_linux_amd64.tar.gz` + - On **Linux**, the binary depends on both your architecture and OS version. First, run <CopyText text="uname -m" code /> to check your architecture, then <CopyText text="lsb_release -rs" code /> to check your Ubuntu version: + - **Ubuntu 22.04 or older**: + - `x86_64` (AMD/Intel) → Download `cre_linux_amd64_ldd2-35.tar.gz` + - `aarch64` (ARM) → Download `cre_linux_arm64_ldd2-35.tar.gz` + - **Ubuntu 24.04 or newer**: + - `x86_64` (AMD/Intel) → Download `cre_linux_amd64.tar.gz` + - `aarch64` (ARM) → Download `cre_linux_arm64.tar.gz` + + **Note:** The `ldd2-35` binaries are compiled for older glibc versions (2.35 and below). If you're using a non-Ubuntu Linux distribution, check your glibc version with <CopyText text="ldd --version" code /> and use the `ldd2-35` binary if your version is 2.35 or lower. </Aside> After downloading the correct file from the releases page, move on to the next step to verify its integrity. @@ -622,12 +628,14 @@ shasum -a 256 cre_darwin_arm64.zip Compare the output with the official checksum below: -| File | SHA-256 Checksum | -| ------------------------ | ---------------------------------------------------------------- | -| `cre_darwin_amd64.zip` | 87f62d25ce0517473a97ff7e66220a2f0bbcc40ebe94309964c0bb29a267dcd1 | -| `cre_darwin_arm64.zip` | e21677d3f307aa63b4513b1bce597fb0d97e1f94e2094fdc85cc400084036a7c | -| `cre_linux_amd64.tar.gz` | 58d682739e390c8046795ca2871fada94aa39dbea8e0062179000bed3b895913 | -| `cre_linux_arm64.tar.gz` | 9826e1a3c46485b7f524e70da96aeac18a13570d0a2f5a660ff52e8b532fee51 | +| File | SHA-256 Checksum | +| -------------------------------- | ---------------------------------------------------------------- | +| `cre_darwin_amd64.zip` | 87f62d25ce0517473a97ff7e66220a2f0bbcc40ebe94309964c0bb29a267dcd1 | +| `cre_darwin_arm64.zip` | e21677d3f307aa63b4513b1bce597fb0d97e1f94e2094fdc85cc400084036a7c | +| `cre_linux_amd64.tar.gz` | 58d682739e390c8046795ca2871fada94aa39dbea8e0062179000bed3b895913 | +| `cre_linux_amd64_ldd2-35.tar.gz` | 7218b517e9837687bfff6ff9de16108b57808f23e85263452b819e0a230717ef | +| `cre_linux_arm64.tar.gz` | 9826e1a3c46485b7f524e70da96aeac18a13570d0a2f5a660ff52e8b532fee51 | +| `cre_linux_arm64_ldd2-35.tar.gz` | 7afd0ab30dc4ecdfb45c2a5bdc75c1267c38984409d55f0d6646c55179975d4f | If the checksum doesn't match, do not proceed with installation. Contact your Chainlink point of contact for assistance. From 185d4588717ea0f54c3ec05f7ce2c0cd770ded69 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Tue, 13 Jan 2026 11:33:08 -0500 Subject: [PATCH 117/214] clarify handler selection with --trigger-index (#3363) --- .../operations/simulating-workflows.mdx | 23 ++++++- .../http-trigger/testing-in-simulation.mdx | 5 +- src/content/cre/llms-full-go.txt | 62 +++++++++++++++---- src/content/cre/llms-full-ts.txt | 62 +++++++++++++++---- src/content/cre/reference/cli/workflow.mdx | 33 +++++++--- 5 files changed, 149 insertions(+), 36 deletions(-) diff --git a/src/content/cre/guides/operations/simulating-workflows.mdx b/src/content/cre/guides/operations/simulating-workflows.mdx index cee0d5e5901..f3d5101c4e5 100644 --- a/src/content/cre/guides/operations/simulating-workflows.mdx +++ b/src/content/cre/guides/operations/simulating-workflows.mdx @@ -95,7 +95,7 @@ Non-interactive mode allows you to run simulations without prompts, making it id **Requirements:** - Use the `--non-interactive` flag -- Specify `--trigger-index` (0-based index of the trigger to run) +- Specify `--trigger-index` to select which handler to run (0-based position: `0` = first handler, `1` = second, etc.) - Provide trigger-specific flags as needed (see [Trigger-specific configuration](#trigger-specific-configuration)) **Example:** @@ -104,6 +104,14 @@ Non-interactive mode allows you to run simulations without prompts, making it id cre workflow simulate my-workflow --non-interactive --trigger-index 0 --target staging-settings ``` +<Aside type="tip" title="Understanding trigger-index"> + The `--trigger-index` flag selects **which handler** in your workflow to execute. Handlers are created in your + `InitWorkflow` function using `cre.Handler()`, where [each handler connects a trigger to a callback + function](/cre/key-terms#handler). If your workflow has only one handler, use `--trigger-index 0`. If you have + multiple handlers (e.g., one for an HTTP trigger and one for an EVM log trigger), use `0` for the first, `1` for the + second, etc., based on their order in your code. +</Aside> + ## The `--broadcast` flag By default, the simulator performs a **dry run** for onchain write operations. It prepares the transaction but does not broadcast it to the blockchain. @@ -211,6 +219,19 @@ cre workflow simulate my-workflow \ --target staging-settings ``` +{/* prettier-ignore */} +<Aside type="tip" title="Understanding the two different indexes"> + **Two separate concepts:** + - **`--trigger-index`** selects **which handler** in your workflow to run (e.g., if the + handler with an EVM log trigger is the third handler defined, use `--trigger-index 2`) + - **`--evm-event-index`** + specifies **which log/event within the transaction** to use for testing (e.g., if the transaction emitted 3 events and + you want the first one, use `--evm-event-index 0`) + <br /> + These are completely independent: one selects your workflow's + handler to execute, the other selects which event data from the blockchain to test with. +</Aside> + ## Additional flags ### `--engine-logs` (`-g`) diff --git a/src/content/cre/guides/workflow/using-triggers/http-trigger/testing-in-simulation.mdx b/src/content/cre/guides/workflow/using-triggers/http-trigger/testing-in-simulation.mdx index 40b33c8dcf6..c550e082f2a 100644 --- a/src/content/cre/guides/workflow/using-triggers/http-trigger/testing-in-simulation.mdx +++ b/src/content/cre/guides/workflow/using-triggers/http-trigger/testing-in-simulation.mdx @@ -75,8 +75,9 @@ cre workflow simulate my-http-workflow --non-interactive --trigger-index 0 --htt ``` <Aside type="note" title="Non-interactive requirements"> - The `--http-payload` flag requires `--non-interactive` mode. You must also specify `--trigger-index` (0-based index of - your HTTP trigger). If your HTTP trigger is the only trigger or the first one defined, use `--trigger-index 0`. + The `--http-payload` flag requires `--non-interactive` mode. You must also specify `--trigger-index` to select which + handler to run. The index is 0-based: if the handler with your HTTP trigger is the first handler defined in your + `InitWorkflow` function, use `--trigger-index 0`; if it's the second, use `--trigger-index 1`, and so on. </Aside> <Aside type="note" title="Escaping quotes"> diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index e1ac798d02f..8f8276d846b 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -1072,8 +1072,9 @@ cre workflow simulate my-http-workflow --non-interactive --trigger-index 0 --htt ``` <Aside type="note" title="Non-interactive requirements"> - The `--http-payload` flag requires `--non-interactive` mode. You must also specify `--trigger-index` (0-based index of - your HTTP trigger). If your HTTP trigger is the only trigger or the first one defined, use `--trigger-index 0`. + The `--http-payload` flag requires `--non-interactive` mode. You must also specify `--trigger-index` to select which + handler to run. The index is 0-based: if the handler with your HTTP trigger is the first handler defined in your + `InitWorkflow` function, use `--trigger-index 0`; if it's the second, use `--trigger-index 1`, and so on. </Aside> <Aside type="note" title="Escaping quotes"> @@ -4962,7 +4963,7 @@ Non-interactive mode allows you to run simulations without prompts, making it id **Requirements:** - Use the `--non-interactive` flag -- Specify `--trigger-index` (0-based index of the trigger to run) +- Specify `--trigger-index` to select which handler to run (0-based position: `0` = first handler, `1` = second, etc.) - Provide trigger-specific flags as needed (see [Trigger-specific configuration](#trigger-specific-configuration)) **Example:** @@ -4971,6 +4972,14 @@ Non-interactive mode allows you to run simulations without prompts, making it id cre workflow simulate my-workflow --non-interactive --trigger-index 0 --target staging-settings ``` +<Aside type="tip" title="Understanding trigger-index"> + The `--trigger-index` flag selects **which handler** in your workflow to execute. Handlers are created in your + `InitWorkflow` function using `cre.Handler()`, where [each handler connects a trigger to a callback + function](/cre/key-terms#handler). If your workflow has only one handler, use `--trigger-index 0`. If you have + multiple handlers (e.g., one for an HTTP trigger and one for an EVM log trigger), use `0` for the first, `1` for the + second, etc., based on their order in your code. +</Aside> + ## The `--broadcast` flag By default, the simulator performs a **dry run** for onchain write operations. It prepares the transaction but does not broadcast it to the blockchain. @@ -5078,6 +5087,20 @@ cre workflow simulate my-workflow \ --target staging-settings ``` + +<Aside type="tip" title="Understanding the two different indexes"> + **Two separate concepts:** + + - **`--trigger-index`** selects **which handler** in your workflow to run (e.g., if the + handler with an EVM log trigger is the third handler defined, use `--trigger-index 2`) + - **`--evm-event-index`** + specifies **which log/event within the transaction** to use for testing (e.g., if the transaction emitted 3 events and + you want the first one, use `--evm-event-index 0`) + + These are completely independent: one selects your workflow's + handler to execute, the other selects which event data from the blockchain to test with. +</Aside> + ## Additional flags ### `--engine-logs` (`-g`) @@ -7988,15 +8011,15 @@ cre workflow simulate <workflow-name-or-path> [flags] **Flags:** -| Flag | Description | -| ------------------------- | -------------------------------------------------------------------------------------------------- | -| `--broadcast` | Broadcast onchain write transactions (default: `false`). Without this flag, a dry run is performed | -| `-g, --engine-logs` | Enable non-fatal engine logging | -| `--non-interactive` | Run without prompts; requires `--trigger-index` and inputs for the selected trigger type | -| `--trigger-index <int>` | Index of the trigger to run (0-based). Required when using `--non-interactive` | -| `--http-payload <string>` | HTTP trigger payload as JSON string or path to JSON file (with or without `@` prefix) | -| `--evm-tx-hash <string>` | EVM trigger transaction hash (`0x...`). For EVM log triggers | -| `--evm-event-index <int>` | EVM trigger log index (0-based). For EVM log triggers | +| Flag | Description | +| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--broadcast` | Broadcast onchain write transactions (default: `false`). Without this flag, a dry run is performed | +| `-g, --engine-logs` | Enable non-fatal engine logging | +| `--non-interactive` | Run without prompts; requires `--trigger-index` (see the line below) and inputs for the selected trigger type | +| `--trigger-index <int>` | Selects which handler to run (0-based position). If your workflow has multiple handlers, `0` is the first, `1` is the second, etc. Required with `--non-interactive` | +| `--http-payload <string>` | HTTP trigger payload as JSON string or path to JSON file (with or without `@` prefix). For HTTP triggers only | +| `--evm-tx-hash <string>` | Transaction hash (`0x...`) containing the event that triggered your workflow. For EVM log triggers only | +| `--evm-event-index <int>` | Which log/event within the transaction to use (0-based position). If the transaction emitted multiple events, `0` is the first, `1` is the second, etc. For EVM log triggers only | **Examples:** @@ -8012,6 +8035,21 @@ cre workflow simulate <workflow-name-or-path> [flags] cre workflow simulate ./my-workflow --broadcast --target local-simulation ``` +- Non-interactive mode with HTTP trigger + + ```bash + # If your HTTP trigger handler is the first handler in your workflow, use --trigger-index 0 + cre workflow simulate my-workflow --non-interactive --trigger-index 0 --http-payload '{"key":"value"}' --target staging-settings + ``` + +- Non-interactive mode with EVM log trigger + + ```bash + # If your EVM log trigger handler is the second handler in your workflow, use --trigger-index 1 + # --evm-event-index 0 means you want the first event from that transaction + cre workflow simulate my-workflow --non-interactive --trigger-index 1 --evm-tx-hash 0x420721d7d00130a03c5b525b2dbfd42550906ddb3075e8377f9bb5d1a5992f8e --evm-event-index 0 --target staging-settings + ``` + <Aside type="note" title="Dry run by default"> By default, `cre workflow simulate` performs a **dry run** for onchain write operations. It simulates the transaction to confirm it would succeed, but does not broadcast it to the network. This results in a successful log with an empty transaction hash (`0x`). To send a real transaction, use the `--broadcast` flag. diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index f12e070d47b..806acc794e7 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -1072,8 +1072,9 @@ cre workflow simulate my-http-workflow --non-interactive --trigger-index 0 --htt ``` <Aside type="note" title="Non-interactive requirements"> - The `--http-payload` flag requires `--non-interactive` mode. You must also specify `--trigger-index` (0-based index of - your HTTP trigger). If your HTTP trigger is the only trigger or the first one defined, use `--trigger-index 0`. + The `--http-payload` flag requires `--non-interactive` mode. You must also specify `--trigger-index` to select which + handler to run. The index is 0-based: if the handler with your HTTP trigger is the first handler defined in your + `InitWorkflow` function, use `--trigger-index 0`; if it's the second, use `--trigger-index 1`, and so on. </Aside> <Aside type="note" title="Escaping quotes"> @@ -3879,7 +3880,7 @@ Non-interactive mode allows you to run simulations without prompts, making it id **Requirements:** - Use the `--non-interactive` flag -- Specify `--trigger-index` (0-based index of the trigger to run) +- Specify `--trigger-index` to select which handler to run (0-based position: `0` = first handler, `1` = second, etc.) - Provide trigger-specific flags as needed (see [Trigger-specific configuration](#trigger-specific-configuration)) **Example:** @@ -3888,6 +3889,14 @@ Non-interactive mode allows you to run simulations without prompts, making it id cre workflow simulate my-workflow --non-interactive --trigger-index 0 --target staging-settings ``` +<Aside type="tip" title="Understanding trigger-index"> + The `--trigger-index` flag selects **which handler** in your workflow to execute. Handlers are created in your + `InitWorkflow` function using `cre.Handler()`, where [each handler connects a trigger to a callback + function](/cre/key-terms#handler). If your workflow has only one handler, use `--trigger-index 0`. If you have + multiple handlers (e.g., one for an HTTP trigger and one for an EVM log trigger), use `0` for the first, `1` for the + second, etc., based on their order in your code. +</Aside> + ## The `--broadcast` flag By default, the simulator performs a **dry run** for onchain write operations. It prepares the transaction but does not broadcast it to the blockchain. @@ -3995,6 +4004,20 @@ cre workflow simulate my-workflow \ --target staging-settings ``` + +<Aside type="tip" title="Understanding the two different indexes"> + **Two separate concepts:** + + - **`--trigger-index`** selects **which handler** in your workflow to run (e.g., if the + handler with an EVM log trigger is the third handler defined, use `--trigger-index 2`) + - **`--evm-event-index`** + specifies **which log/event within the transaction** to use for testing (e.g., if the transaction emitted 3 events and + you want the first one, use `--evm-event-index 0`) + + These are completely independent: one selects your workflow's + handler to execute, the other selects which event data from the blockchain to test with. +</Aside> + ## Additional flags ### `--engine-logs` (`-g`) @@ -6630,15 +6653,15 @@ cre workflow simulate <workflow-name-or-path> [flags] **Flags:** -| Flag | Description | -| ------------------------- | -------------------------------------------------------------------------------------------------- | -| `--broadcast` | Broadcast onchain write transactions (default: `false`). Without this flag, a dry run is performed | -| `-g, --engine-logs` | Enable non-fatal engine logging | -| `--non-interactive` | Run without prompts; requires `--trigger-index` and inputs for the selected trigger type | -| `--trigger-index <int>` | Index of the trigger to run (0-based). Required when using `--non-interactive` | -| `--http-payload <string>` | HTTP trigger payload as JSON string or path to JSON file (with or without `@` prefix) | -| `--evm-tx-hash <string>` | EVM trigger transaction hash (`0x...`). For EVM log triggers | -| `--evm-event-index <int>` | EVM trigger log index (0-based). For EVM log triggers | +| Flag | Description | +| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--broadcast` | Broadcast onchain write transactions (default: `false`). Without this flag, a dry run is performed | +| `-g, --engine-logs` | Enable non-fatal engine logging | +| `--non-interactive` | Run without prompts; requires `--trigger-index` (see the line below) and inputs for the selected trigger type | +| `--trigger-index <int>` | Selects which handler to run (0-based position). If your workflow has multiple handlers, `0` is the first, `1` is the second, etc. Required with `--non-interactive` | +| `--http-payload <string>` | HTTP trigger payload as JSON string or path to JSON file (with or without `@` prefix). For HTTP triggers only | +| `--evm-tx-hash <string>` | Transaction hash (`0x...`) containing the event that triggered your workflow. For EVM log triggers only | +| `--evm-event-index <int>` | Which log/event within the transaction to use (0-based position). If the transaction emitted multiple events, `0` is the first, `1` is the second, etc. For EVM log triggers only | **Examples:** @@ -6654,6 +6677,21 @@ cre workflow simulate <workflow-name-or-path> [flags] cre workflow simulate ./my-workflow --broadcast --target local-simulation ``` +- Non-interactive mode with HTTP trigger + + ```bash + # If your HTTP trigger handler is the first handler in your workflow, use --trigger-index 0 + cre workflow simulate my-workflow --non-interactive --trigger-index 0 --http-payload '{"key":"value"}' --target staging-settings + ``` + +- Non-interactive mode with EVM log trigger + + ```bash + # If your EVM log trigger handler is the second handler in your workflow, use --trigger-index 1 + # --evm-event-index 0 means you want the first event from that transaction + cre workflow simulate my-workflow --non-interactive --trigger-index 1 --evm-tx-hash 0x420721d7d00130a03c5b525b2dbfd42550906ddb3075e8377f9bb5d1a5992f8e --evm-event-index 0 --target staging-settings + ``` + <Aside type="note" title="Dry run by default"> By default, `cre workflow simulate` performs a **dry run** for onchain write operations. It simulates the transaction to confirm it would succeed, but does not broadcast it to the network. This results in a successful log with an empty transaction hash (`0x`). To send a real transaction, use the `--broadcast` flag. diff --git a/src/content/cre/reference/cli/workflow.mdx b/src/content/cre/reference/cli/workflow.mdx index 8129ef0f319..94fa9ce86ab 100644 --- a/src/content/cre/reference/cli/workflow.mdx +++ b/src/content/cre/reference/cli/workflow.mdx @@ -34,15 +34,15 @@ cre workflow simulate <workflow-name-or-path> [flags] **Flags:** -| <div style={{ width: "200px" }}>Flag</div> | Description | -| ------------------------------------------ | -------------------------------------------------------------------------------------------------- | -| `--broadcast` | Broadcast onchain write transactions (default: `false`). Without this flag, a dry run is performed | -| `-g, --engine-logs` | Enable non-fatal engine logging | -| `--non-interactive` | Run without prompts; requires `--trigger-index` and inputs for the selected trigger type | -| `--trigger-index <int>` | Index of the trigger to run (0-based). Required when using `--non-interactive` | -| `--http-payload <string>` | HTTP trigger payload as JSON string or path to JSON file (with or without `@` prefix) | -| `--evm-tx-hash <string>` | EVM trigger transaction hash (`0x...`). For EVM log triggers | -| `--evm-event-index <int>` | EVM trigger log index (0-based). For EVM log triggers | +| <div style={{ width: "200px" }}>Flag</div> | Description | +| ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--broadcast` | Broadcast onchain write transactions (default: `false`). Without this flag, a dry run is performed | +| `-g, --engine-logs` | Enable non-fatal engine logging | +| `--non-interactive` | Run without prompts; requires `--trigger-index` (see the line below) and inputs for the selected trigger type | +| `--trigger-index <int>` | Selects which handler to run (0-based position). If your workflow has multiple handlers, `0` is the first, `1` is the second, etc. Required with `--non-interactive` | +| `--http-payload <string>` | HTTP trigger payload as JSON string or path to JSON file (with or without `@` prefix). For HTTP triggers only | +| `--evm-tx-hash <string>` | Transaction hash (`0x...`) containing the event that triggered your workflow. For EVM log triggers only | +| `--evm-event-index <int>` | Which log/event within the transaction to use (0-based position). If the transaction emitted multiple events, `0` is the first, `1` is the second, etc. For EVM log triggers only | **Examples:** @@ -58,6 +58,21 @@ cre workflow simulate <workflow-name-or-path> [flags] cre workflow simulate ./my-workflow --broadcast --target local-simulation ``` +- Non-interactive mode with HTTP trigger + + ```bash + # If your HTTP trigger handler is the first handler in your workflow, use --trigger-index 0 + cre workflow simulate my-workflow --non-interactive --trigger-index 0 --http-payload '{"key":"value"}' --target staging-settings + ``` + +- Non-interactive mode with EVM log trigger + + ```bash + # If your EVM log trigger handler is the second handler in your workflow, use --trigger-index 1 + # --evm-event-index 0 means you want the first event from that transaction + cre workflow simulate my-workflow --non-interactive --trigger-index 1 --evm-tx-hash 0x420721d7d00130a03c5b525b2dbfd42550906ddb3075e8377f9bb5d1a5992f8e --evm-event-index 0 --target staging-settings + ``` + {/* prettier-ignore */} <Aside type="note" title="Dry run by default"> By default, `cre workflow simulate` performs a **dry run** for onchain write operations. It simulates the transaction to confirm it would succeed, but does not broadcast it to the network. This results in a successful log with an empty transaction hash (`0x`). To send a real transaction, use the `--broadcast` flag. From 7e50bebdda3c3e5170e0aa76322c19c6e0034a57 Mon Sep 17 00:00:00 2001 From: Priyank Gupta <priyankgupta0308@gmail.com> Date: Thu, 15 Jan 2026 01:43:52 +0530 Subject: [PATCH 118/214] Update code snippet component (#3360) * chore: rough PR for preview of an updated code snippet component * fix: Fixed extra indentation * chore: added header to custom CodeSample component, fenced codeblocks pending * chore: added support for fenced codeblocks, added support for toml logo * fix: revert this file to no diff with main * chore: edited evm.mdx slightly to emphasise point of PR * chore: Tried out new code component param on two random pages * chore: tweaked some logos, PR ready to merge --- astro.config.ts | 9 +- public/images/language-icons/go.svg | 7 + public/images/language-icons/json.svg | 17 +++ public/images/language-icons/python.svg | 7 + public/images/language-icons/rust.svg | 7 + public/images/language-icons/solidity.svg | 27 ++++ public/images/language-icons/terminal.svg | 13 ++ public/images/language-icons/toml.svg | 12 ++ public/images/language-icons/typescript.svg | 7 + src/components/CodeSample/CodeSample.astro | 47 +++++- src/components/HeadCommon.astro | 1 + src/content/ccip/getting-started/evm.mdx | 4 +- .../ccip/tutorials/evm/manual-execution.mdx | 5 +- ...programmable-token-transfers-defensive.mdx | 5 +- src/lib/codeSample/language.ts | 25 ++++ src/lib/markdown/rehypeCodeSampleFences.ts | 141 ++++++++++++++++++ src/lib/markdown/remarkCodeFenceFilename.ts | 117 +++++++++++++++ src/scripts/codeSampleCopy.ts | 39 +++++ .../copyToClipboard/copyToClipboard.ts | 5 + src/scripts/index.ts | 1 + src/styles/code-blocks.css | 119 +++++++++++++++ 21 files changed, 607 insertions(+), 8 deletions(-) create mode 100644 public/images/language-icons/go.svg create mode 100644 public/images/language-icons/json.svg create mode 100644 public/images/language-icons/python.svg create mode 100644 public/images/language-icons/rust.svg create mode 100644 public/images/language-icons/solidity.svg create mode 100644 public/images/language-icons/terminal.svg create mode 100644 public/images/language-icons/toml.svg create mode 100644 public/images/language-icons/typescript.svg create mode 100644 src/lib/codeSample/language.ts create mode 100644 src/lib/markdown/rehypeCodeSampleFences.ts create mode 100644 src/lib/markdown/remarkCodeFenceFilename.ts create mode 100644 src/scripts/codeSampleCopy.ts create mode 100644 src/styles/code-blocks.css diff --git a/astro.config.ts b/astro.config.ts index bafbd5b77a2..1578962e7fb 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -14,6 +14,8 @@ import { ccipRedirects } from "./src/config/redirects/ccip" import trailingSlashMiddleware from "./src/integrations/trailing-slash-middleware" import redirectsJson from "./src/features/redirects/redirects.json" import { extractCanonicalUrlsWithLanguageVariants } from "./src/utils/sidebar" +import remarkCodeFenceFilename from "./src/lib/markdown/remarkCodeFenceFilename" +import rehypeCodeSampleFences from "./src/lib/markdown/rehypeCodeSampleFences" config() // Load .env file @@ -103,9 +105,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 [ @@ -116,6 +122,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/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 @@ +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> + <!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools --> +<svg width="100px" height="100px" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> + <g id="SVGRepo_bgCarrier" stroke-width="0"/> + <g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/> + <g id="SVGRepo_iconCarrier"> <path fill-rule="evenodd" clip-rule="evenodd" d="M18.1177 14.0442C17.7408 14.1497 17.3586 14.2566 16.9162 14.3768C16.7001 14.438 16.6509 14.4519 16.4498 14.2074C16.2086 13.9194 16.0317 13.7331 15.6939 13.5636C14.6807 13.0384 13.6996 13.1909 12.7829 13.8178C11.6893 14.5632 11.1264 15.6644 11.1425 17.0367C11.1585 18.3921 12.0431 19.5103 13.3137 19.6966C14.4073 19.8491 15.324 19.4425 16.0477 18.5785C16.1924 18.3922 16.3212 18.1887 16.482 17.9516H13.378C13.0402 17.9516 12.9598 17.7314 13.0724 17.4433C13.2815 16.9181 13.6675 16.0372 13.8926 15.5967C13.9409 15.495 14.0535 15.3256 14.2947 15.3256H19.4702C19.7027 14.5496 20.0799 13.8164 20.5831 13.1226C21.7572 11.4961 23.1725 10.649 25.0863 10.2933C26.7268 9.9883 28.2707 10.1577 29.6699 11.1573C30.9405 12.0722 31.7285 13.3089 31.9376 14.9354C32.211 17.2225 31.5838 19.0862 30.0881 20.6787C29.0266 21.8138 27.7239 22.5254 26.2282 22.8473C25.9429 22.9029 25.6576 22.9293 25.3768 22.9553C25.2303 22.9689 25.085 22.9823 24.9416 22.9998C23.478 22.9659 22.1432 22.5254 21.0173 21.5089C20.2256 20.7879 19.6803 19.9019 19.4092 18.8705C19.2211 19.2707 18.9962 19.6539 18.7336 20.0185C17.5756 21.628 16.0638 22.6276 14.15 22.8987C12.5738 23.1189 11.1103 22.797 9.82366 21.7805C8.63353 20.8317 7.95805 19.578 7.78114 18.0194C7.57206 16.1727 8.08671 14.5124 9.14818 13.0554C10.2901 11.4798 11.8019 10.4802 13.6514 10.1244C15.1632 9.8364 16.6106 10.0228 17.9134 10.9546C18.7657 11.5475 19.3769 12.3608 19.779 13.3434C19.8755 13.4959 19.8111 13.5806 19.6181 13.6314C19.0545 13.7822 18.5903 13.9121 18.1177 14.0442ZM28.7581 15.974C28.7613 16.0309 28.7646 16.0909 28.7693 16.1552C28.6889 17.6122 27.9973 18.6965 26.7268 19.3911C25.8744 19.8485 24.9898 19.8994 24.1053 19.4928C22.9473 18.9506 22.3361 17.6122 22.6256 16.2907C22.9795 14.6982 23.9444 13.6986 25.4401 13.3428C26.968 12.9701 28.4316 13.9188 28.7211 15.5961C28.7438 15.7161 28.7505 15.836 28.7581 15.974Z" fill="#ffffff"/> <path d="M2.44461 13.8517C2.41244 13.9025 2.42852 13.9364 2.49285 13.9364L7.2826 13.9534C7.33085 13.9534 7.41126 13.9025 7.44343 13.8517L7.71684 13.4112C7.749 13.3604 7.73292 13.3096 7.66859 13.3096H2.95926C2.89493 13.3096 2.81451 13.3435 2.78235 13.3943L2.44461 13.8517Z" fill="#ffffff"/> <path d="M0.0160829 15.4103C-0.0160829 15.4611 7.45058e-09 15.495 0.0643316 15.495L6.63928 15.4781C6.70361 15.4781 6.76794 15.4442 6.78402 15.3764L6.91269 14.9698C6.92877 14.919 6.8966 14.8682 6.83227 14.8682H0.530735C0.466404 14.8682 0.385989 14.902 0.353823 14.9529L0.0160829 15.4103Z" fill="#ffffff"/> <path d="M3.90813 16.9521C3.87596 17.0029 3.89204 17.0537 3.95638 17.0537L6.43019 17.0707C6.47843 17.0707 6.54277 17.0199 6.54277 16.9521L6.57493 16.5455C6.57493 16.4777 6.54277 16.4269 6.47843 16.4269H4.29412C4.22978 16.4269 4.16545 16.4777 4.13329 16.5285L3.90813 16.9521Z" fill="#ffffff"/> </g> + </svg> \ 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 @@ +<svg + viewBox="0 0 30 10" + fill="currentColor" + stroke="none" + xmlns="http://www.w3.org/2000/svg" +> + <path d="M30 0V10H28L26 4V10H24V0H26L28 6V0H30Z" /> + <path + d="M20.3335 10H17.6665C17.2247 9.9995 16.8011 9.82376 16.4887 9.51134C16.1762 9.19892 16.0005 8.77533 16 8.3335V1.6665C16.0005 1.22467 16.1762 0.801082 16.4887 0.488662C16.8011 0.176241 17.2247 0.000502876 17.6665 0H20.3335C20.7753 0.000502876 21.1989 0.176241 21.5113 0.488662C21.8238 0.801082 21.9995 1.22467 22 1.6665V8.3335C21.9995 8.77533 21.8238 9.19892 21.5113 9.51134C21.1989 9.82376 20.7753 9.9995 20.3335 10ZM18 8H20V2H18V8Z" + /> + <path + d="M12.3335 10H8V8H12V6H10C9.46973 5.99947 8.96133 5.78859 8.58637 5.41363C8.21141 5.03867 8.00053 4.53027 8 4V1.6665C8.0005 1.22467 8.17624 0.801082 8.48866 0.488662C8.80108 0.176241 9.22467 0.000502876 9.6665 0H14V2H10V4H12C12.5303 4.00053 13.0387 4.21141 13.4136 4.58637C13.7886 4.96133 13.9995 5.46973 14 6V8.3335C13.9995 8.77533 13.8238 9.19892 13.5113 9.51134C13.1989 9.82376 12.7753 9.9995 12.3335 10Z" + /> + <path + d="M4.3335 10H1.6665C1.22467 9.9995 0.801082 9.82376 0.488662 9.51134C0.176242 9.19892 0.000502876 8.77533 0 8.3335V6H2V8H4V0H6V8.3335C5.9995 8.77533 5.82376 9.19892 5.51134 9.51134C5.19892 9.82376 4.77533 9.9995 4.3335 10Z" + /> +</svg> 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 @@ +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> + <!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools --> +<svg width="100px" height="100px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#ffffff"> + <g id="SVGRepo_bgCarrier" stroke-width="0"/> + <g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/> + <g id="SVGRepo_iconCarrier"> <title>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/src/components/CodeSample/CodeSample.astro b/src/components/CodeSample/CodeSample.astro index 73cef4f4cb2..6f4eb4d4153 100644 --- a/src/components/CodeSample/CodeSample.astro +++ b/src/components/CodeSample/CodeSample.astro @@ -1,20 +1,30 @@ --- -import { Prism } from "@astrojs/prism" +import { runHighlighterWithAstro } from "@astrojs/prism/dist/highlighter" import fs from "node:fs/promises" import path from "node:path" +import { getLanguageIconSrc, languageBadge } from "../../lib/codeSample/language.js" + export type Props = { src: string lang?: string + filename?: string showButtonOnly?: boolean optimize?: boolean runs?: number } -const { src, lang, showButtonOnly, optimize, runs } = Astro.props as Props +const { src, lang, filename, showButtonOnly, optimize, runs } = Astro.props as Props const data = (await fs.readFile(path.join(process.cwd(), "public", src), "utf-8")).toString() +const prismLang = lang ?? "solidity" +const headerFilename = filename?.trim() || undefined +const { classLanguage, html } = runHighlighterWithAstro(prismLang, data) +const languageKey = prismLang.toLowerCase() +const languageIconSrc = getLanguageIconSrc(languageKey) +const preInnerHtml = `${html}` + const isSolidityFile = src.match(/\.sol/) const isSample = isSolidityFile && (src.indexOf("samples/") === 0 || src.indexOf("/samples/") === 0) @@ -29,7 +39,38 @@ const remixUrl = `https://remix.ethereum.org/#url=https://docs.chain.link/${clea }` --- -{!showButtonOnly && } +{ + !showButtonOnly && + (headerFilename ? ( +
+
+
+ + + {headerFilename} + +
+ +
+
+      
+ ) : ( +
+    ))
+}
+
 {
   isSample && (
     
diff --git a/src/components/HeadCommon.astro b/src/components/HeadCommon.astro index c9434d0daa4..ecd9c543eee 100644 --- a/src/components/HeadCommon.astro +++ b/src/components/HeadCommon.astro @@ -1,6 +1,7 @@ --- import "../styles/theme.css" import "../styles/index.css" +import "../styles/code-blocks.css" import "../styles/migrated.css" import "../styles/prism-darcula.css" import "@chainlink/design-system/global-styles.css" diff --git a/src/content/ccip/getting-started/evm.mdx b/src/content/ccip/getting-started/evm.mdx index 96d0822ddee..4aef5a8681e 100644 --- a/src/content/ccip/getting-started/evm.mdx +++ b/src/content/ccip/getting-started/evm.mdx @@ -169,7 +169,7 @@ Congratulations! You just sent your first cross-chain data using CCIP. Next, exa The smart contract in this tutorial is designed to interact with CCIP to send data. The contract code includes comments to clarify the various functions, events, and underlying logic. However, this section explains the key elements. You can see the full contract code below. - + #### Initializing the contract @@ -202,7 +202,7 @@ The `sendMessage` function completes several operations: The smart contract in this tutorial is designed to interact with CCIP to receive data. The contract code includes comments to clarify the various functions, events, and underlying logic. However, this section explains the key elements. You can see the full contract code below. - + #### Initializing the contract diff --git a/src/content/ccip/tutorials/evm/manual-execution.mdx b/src/content/ccip/tutorials/evm/manual-execution.mdx index 8b7055a533b..517cd94526c 100644 --- a/src/content/ccip/tutorials/evm/manual-execution.mdx +++ b/src/content/ccip/tutorials/evm/manual-execution.mdx @@ -50,7 +50,10 @@ In this tutorial, you'll send a text _string_ and CCIP-BnM tokens between smart 1. Manually retry the execution. 1. Observe successful execution after the gas limit adjustment. - + ### Deploy your contracts diff --git a/src/content/ccip/tutorials/evm/programmable-token-transfers-defensive.mdx b/src/content/ccip/tutorials/evm/programmable-token-transfers-defensive.mdx index 0b5d6141d56..972dd9696b3 100644 --- a/src/content/ccip/tutorials/evm/programmable-token-transfers-defensive.mdx +++ b/src/content/ccip/tutorials/evm/programmable-token-transfers-defensive.mdx @@ -50,7 +50,10 @@ In this guide, you'll initiate a transaction from a smart contract on _Avalanche that for successful scenarios. - + ### Deploy your contracts 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/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/scripts/codeSampleCopy.ts b/src/scripts/codeSampleCopy.ts
new file mode 100644
index 00000000000..0f82e113132
--- /dev/null
+++ b/src/scripts/codeSampleCopy.ts
@@ -0,0 +1,39 @@
+function copyText(text: string): Promise {
+  if (navigator.clipboard && window.isSecureContext) {
+    return navigator.clipboard.writeText(text)
+  }
+
+  // Fallback for non-secure contexts (e.g. http://localhost)
+  const textarea = document.createElement("textarea")
+  textarea.value = text
+  textarea.setAttribute("readonly", "")
+  textarea.style.position = "absolute"
+  textarea.style.left = "-9999px"
+  document.body.appendChild(textarea)
+  textarea.select()
+  const ok = document.execCommand("copy")
+  document.body.removeChild(textarea)
+  return ok ? Promise.resolve() : Promise.reject(new Error("Copy failed"))
+}
+
+document.addEventListener("click", async (e) => {
+  const target = e.target as HTMLElement | null
+  const button = (target?.closest?.(".code-sample__copy-button") as HTMLButtonElement | null) ?? null
+  if (!button) return
+
+  const root = button.closest(".code-sample")
+  const codeEl = (root?.querySelector("pre code") as HTMLElement | null) ?? null
+  const text = codeEl ? codeEl.innerText : ""
+  if (!text) return
+
+  const oldHtml = button.innerHTML
+  try {
+    await copyText(text)
+    button.innerHTML = 'Copied'
+    window.setTimeout(() => {
+      button.innerHTML = oldHtml
+    }, 1500)
+  } catch (_err) {
+    // no-op; keep original UI
+  }
+})
diff --git a/src/scripts/copyToClipboard/copyToClipboard.ts b/src/scripts/copyToClipboard/copyToClipboard.ts
index da7ffee25af..6a640eae21c 100644
--- a/src/scripts/copyToClipboard/copyToClipboard.ts
+++ b/src/scripts/copyToClipboard/copyToClipboard.ts
@@ -52,6 +52,11 @@ document.addEventListener("DOMContentLoaded", () => {
         return
       }
 
+      // Skip CodeSample-style blocks (they have their own header copy button)
+      if (codeBlock.closest(".code-sample")) {
+        return
+      }
+
       const copyButtonContainer = document.createElement("div")
       copyButtonContainer.className = styles.copyCodeButtonWrapper
 
diff --git a/src/scripts/index.ts b/src/scripts/index.ts
index 2b912568f04..7bb969536c7 100644
--- a/src/scripts/index.ts
+++ b/src/scripts/index.ts
@@ -1,4 +1,5 @@
 import "./fix-remix-urls"
 import "./fix-external-links"
+import "./codeSampleCopy"
 import "./copyToClipboard/copyToClipboard"
 import "./scroll-to-search"
diff --git a/src/styles/code-blocks.css b/src/styles/code-blocks.css
new file mode 100644
index 00000000000..652650faeee
--- /dev/null
+++ b/src/styles/code-blocks.css
@@ -0,0 +1,119 @@
+/* Shared styles for custom code blocks (CodeSample + future fenced blocks) */
+
+.code-sample {
+  margin: 1rem 0;
+  border-radius: 8px;
+  overflow: hidden;
+}
+
+.code-sample__header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 0.75rem;
+  padding: 10px 14px 11px 14px;
+  background: #3a3a3a;
+  color: #e0e0e0;
+  font-family: var(
+    --font-mono,
+    ui-monospace,
+    SFMono-Regular,
+    Menlo,
+    Monaco,
+    Consolas,
+    "Liberation Mono",
+    "Courier New",
+    monospace
+  );
+  font-size: 0.9rem;
+  line-height: 1;
+}
+
+.code-sample__header-left {
+  display: flex;
+  align-items: center;
+  gap: 0.75rem;
+  min-width: 0;
+}
+
+.code-sample__lang {
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  min-width: 30px;
+  height: 24px;
+  padding: 0 6px;
+  border-radius: 6px;
+  background: rgba(255, 255, 255, 0.1);
+  font-weight: 600;
+  letter-spacing: 0.02em;
+}
+
+.code-sample__lang-icon {
+  width: 24px;
+  height: 24px;
+  display: block;
+  object-fit: contain;
+}
+
+.code-sample__lang-icon,
+.code-sample__copy-button > img {
+  filter: brightness(0) invert(1);
+  opacity: 0.95;
+}
+
+/* When we render an icon, drop the "badge" background block. */
+.code-sample__lang--icon {
+  background: transparent;
+  padding: 0;
+  min-width: 24px;
+  border-radius: 0;
+}
+
+.code-sample__filename {
+  font-size: 0.95rem;
+  min-width: 0;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.code-sample__copy-button {
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  width: 34px;
+  height: 34px;
+  padding: 0;
+  border-radius: 8px;
+  border: 1px solid rgba(255, 255, 255, 0.15);
+  background: rgba(255, 255, 255, 0.08);
+  cursor: pointer;
+  flex: 0 0 auto;
+}
+
+.code-sample__copy-button:hover {
+  background: rgba(255, 255, 255, 0.12);
+}
+
+.code-sample__copy-button:focus-visible {
+  outline: 2px solid rgba(255, 255, 255, 0.35);
+  outline-offset: 2px;
+}
+
+.code-sample__copy-button > img {
+  display: block;
+}
+
+.code-sample__pre--with-header {
+  margin: 0;
+  border-top-left-radius: 0 !important;
+  border-top-right-radius: 0 !important;
+}
+
+/* Fenced blocks wrapped via remark won't have CodeSample's pre classes. */
+.code-sample > pre {
+  margin: 0;
+  border-top-left-radius: 0 !important;
+  border-top-right-radius: 0 !important;
+}

From e0a998fe7fba56f3c42bffda2c29a6ab10edebe3 Mon Sep 17 00:00:00 2001
From: "Karim H." <98668332+khadni@users.noreply.github.com>
Date: Wed, 14 Jan 2026 19:53:23 -0500
Subject: [PATCH 119/214] nit update (#3365)

---
 .../getting-started/part-1-project-setup-go.mdx    |  4 ++--
 .../getting-started/part-1-project-setup-ts.mdx    |  6 +++---
 .../http-trigger/local-testing-tool.mdx            |  4 ++--
 src/content/cre/llms-full-go.txt                   |  8 ++++----
 src/content/cre/llms-full-ts.txt                   | 14 +++++++-------
 .../cre/templates/running-demo-workflow-ts.mdx     |  4 ++--
 6 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/src/content/cre/getting-started/part-1-project-setup-go.mdx b/src/content/cre/getting-started/part-1-project-setup-go.mdx
index f4bb0a924e6..9f8bb8b0794 100644
--- a/src/content/cre/getting-started/part-1-project-setup-go.mdx
+++ b/src/content/cre/getting-started/part-1-project-setup-go.mdx
@@ -7,14 +7,14 @@ pageId: "getting-started-part-1"
 metadata:
   description: "Getting started Part 1 (Go): set up your first CRE project, explore the structure, and run a successful workflow simulation."
   datePublished: "2025-11-04"
-  lastModified: "2025-11-04"
+  lastModified: "2026-01-14"
 ---
 
 import { Aside, CopyText, CodeHighlightBlock } from "@components"
 import part1Code from "./snippets/part-1-main.go?raw"
 
 
 
diff --git a/src/content/cre/getting-started/part-1-project-setup-ts.mdx b/src/content/cre/getting-started/part-1-project-setup-ts.mdx
index d571e0f7895..f86233e35a4 100644
--- a/src/content/cre/getting-started/part-1-project-setup-ts.mdx
+++ b/src/content/cre/getting-started/part-1-project-setup-ts.mdx
@@ -7,14 +7,14 @@ pageId: "getting-started-part-1"
 metadata:
   description: "Getting started Part 1 (TypeScript): set up your first CRE project, explore the structure, and run a successful workflow simulation."
   datePublished: "2025-11-04"
-  lastModified: "2025-11-04"
+  lastModified: "2026-01-14"
 ---
 
 import { Aside, CopyText, CodeHighlightBlock } from "@components"
 import part1Code from "./snippets/part-1-main.ts?raw"
 
 
 
@@ -33,7 +33,7 @@ Before you begin, ensure you have the following:
 
 - **CRE CLI**: See the [Installation Guide](/cre/getting-started/cli-installation/macos-linux) for details.
 - **CRE account & authentication**: You must have a CRE account and be logged in with the CLI. See [Create your account](/cre/account/creating-account) and [Log in with the CLI](/cre/account/cli-login) for instructions.
-- **Bun**: You must have Bun version 1.2.21 or higher installed. Check your version with . See [Install Bun](https://bun.sh/) for instructions.
+- **Bun**: You must have Bun version 1.2.21 or higher installed. Check your version with . See [Install Bun](https://bun.com) for instructions.
 - **Funded Sepolia Account**: An account with Sepolia ETH to pay for transaction gas fees. Go to faucets.chain.link to get some Sepolia ETH.
 
 ## Step 1: Verify your authentication
diff --git a/src/content/cre/guides/workflow/using-triggers/http-trigger/local-testing-tool.mdx b/src/content/cre/guides/workflow/using-triggers/http-trigger/local-testing-tool.mdx
index 01bde9510d8..4d87c43e742 100644
--- a/src/content/cre/guides/workflow/using-triggers/http-trigger/local-testing-tool.mdx
+++ b/src/content/cre/guides/workflow/using-triggers/http-trigger/local-testing-tool.mdx
@@ -5,7 +5,7 @@ date: Last Modified
 metadata:
   description: "Test deployed HTTP trigger workflows easily with the cre-http-trigger TypeScript tool: automatic JWT generation, local proxy server, and simple configuration."
   datePublished: "2025-11-04"
-  lastModified: "2025-11-04"
+  lastModified: "2026-01-14"
 ---
 
 import { Aside } from "@components"
@@ -39,7 +39,7 @@ The `cre-http-trigger` tool eliminates this complexity by:
 
 ## Prerequisites
 
-- **Bun runtime**: The tool requires Bun version 1.2.21 or higher
+- **Bun runtime**: The tool requires Bun version 1.2.21 or higher
 - **Deployed workflow**: Your workflow must be deployed with an HTTP trigger
 - **Workflow ID**: Available from deployment output or the CRE UI
 - **Private key**: The private key corresponding to one of the `authorizedKeys` in your HTTP trigger configuration
diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt
index 8f8276d846b..de3b0237394 100644
--- a/src/content/cre/llms-full-go.txt
+++ b/src/content/cre/llms-full-go.txt
@@ -1657,7 +1657,7 @@ Manual JWT generation is complex and error-prone. For development and testing:
 
 # Testing with Local JWT Server
 Source: https://docs.chain.link/cre/guides/workflow/using-triggers/http-trigger/local-testing-tool
-Last Updated: 2025-11-04
+Last Updated: 2026-01-14
 
 The `cre-http-trigger` TypeScript package simplifies testing deployed workflows with HTTP triggers by handling JWT generation, signing, and request formatting automatically. It provides a local HTTP server that acts as a proxy between your test requests and the CRE gateway.
 
@@ -1688,7 +1688,7 @@ The `cre-http-trigger` tool eliminates this complexity by:
 
 ## Prerequisites
 
-- **Bun runtime**: The tool requires Bun version 1.2.21 or higher
+- **Bun runtime**: The tool requires Bun version 1.2.21 or higher
 - **Deployed workflow**: Your workflow must be deployed with an HTTP trigger
 - **Workflow ID**: Available from deployment output or the CRE UI
 - **Private key**: The private key corresponding to one of the `authorizedKeys` in your HTTP trigger configuration
@@ -8782,10 +8782,10 @@ Large Language Models (LLMs) generate different responses for the same prompt, e
 
 # Part 1: Project Setup & Simulation
 Source: https://docs.chain.link/cre/getting-started/part-1-project-setup-go
-Last Updated: 2025-11-04
+Last Updated: 2026-01-14
 
 
 
diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt
index 806acc794e7..35d56b9df2c 100644
--- a/src/content/cre/llms-full-ts.txt
+++ b/src/content/cre/llms-full-ts.txt
@@ -1645,7 +1645,7 @@ Manual JWT generation is complex and error-prone. For development and testing:
 
 # Testing with Local JWT Server
 Source: https://docs.chain.link/cre/guides/workflow/using-triggers/http-trigger/local-testing-tool
-Last Updated: 2025-11-04
+Last Updated: 2026-01-14
 
 The `cre-http-trigger` TypeScript package simplifies testing deployed workflows with HTTP triggers by handling JWT generation, signing, and request formatting automatically. It provides a local HTTP server that acts as a proxy between your test requests and the CRE gateway.
 
@@ -1676,7 +1676,7 @@ The `cre-http-trigger` tool eliminates this complexity by:
 
 ## Prerequisites
 
-- **Bun runtime**: The tool requires Bun version 1.2.21 or higher
+- **Bun runtime**: The tool requires Bun version 1.2.21 or higher
 - **Deployed workflow**: Your workflow must be deployed with an HTTP trigger
 - **Workflow ID**: Available from deployment output or the CRE UI
 - **Private key**: The private key corresponding to one of the `authorizedKeys` in your HTTP trigger configuration
@@ -7528,10 +7528,10 @@ Large Language Models (LLMs) generate different responses for the same prompt, e
 
 # Part 1: Project Setup & Simulation
 Source: https://docs.chain.link/cre/getting-started/part-1-project-setup-ts
-Last Updated: 2025-11-04
+Last Updated: 2026-01-14
 
 
 
@@ -7550,7 +7550,7 @@ Before you begin, ensure you have the following:
 
 - **CRE CLI**: See the [Installation Guide](/cre/getting-started/cli-installation/macos-linux) for details.
 - **CRE account & authentication**: You must have a CRE account and be logged in with the CLI. See [Create your account](/cre/account/creating-account) and [Log in with the CLI](/cre/account/cli-login) for instructions.
-- **Bun**: You must have Bun version 1.2.21 or higher installed. Check your version with bun --version. See [Install Bun](https://bun.sh/) for instructions.
+- **Bun**: You must have Bun version 1.2.21 or higher installed. Check your version with bun --version. See [Install Bun](https://bun.com) for instructions.
 - **Funded Sepolia Account**: An account with Sepolia ETH to pay for transaction gas fees. Go to faucets.chain.link to get some Sepolia ETH.
 
 ## Step 1: Verify your authentication
@@ -15138,7 +15138,7 @@ This section provides a reference for the built-in trigger capabilities of the C
 
 # Running a Demo Workflow
 Source: https://docs.chain.link/cre/templates/running-demo-workflow-ts
-Last Updated: 2025-11-04
+Last Updated: 2026-01-14
 
 This guide walks you through the core developer loop of CRE: initializing a project from a template and running it locally using the [simulator](/cre/guides/operations/simulating-workflows). By the end, you will have run the Custom Data Feed demo workflow and tested its two distinct behaviors: a **proactive** path where it fetches data from an API to write a result onchain, and a **reactive** path where it listens for onchain events to trigger new actions.
 
@@ -15155,7 +15155,7 @@ Before you begin, ensure you have the necessary tools installed:
 
 - **CRE CLI**: You must have the CRE CLI installed. See [Install the CLI](/cre/getting-started/cli-installation) for instructions.
 - **CRE account & authentication**: You must have a CRE account and be logged in with the CLI. Run cre whoami in your terminal to verify you're logged in, or run cre login to authenticate. See [Creating Your Account](/cre/account/creating-account) and [Logging in with the CLI](/cre/account/cli-login) for instructions.
-- **Bun**: You must have Bun version 1.2.21 or higher installed. Check your version with bun --version. See [Install Bun](https://bun.sh/docs/installation) for instructions.
+- **Bun**: You must have Bun version 1.2.21 or higher installed. Check your version with bun --version. See [Install Bun](https://bun.com/docs/installation) for instructions.
 - **Sepolia Testnet Account**: You need a private key for an account funded with Sepolia ETH. This is required because the demo workflow performs a write transaction. Go to faucets.chain.link to get some Sepolia ETH.
 
 ## 2. Initialize the demo project
diff --git a/src/content/cre/templates/running-demo-workflow-ts.mdx b/src/content/cre/templates/running-demo-workflow-ts.mdx
index df9bc00d75e..1f8cba0db68 100644
--- a/src/content/cre/templates/running-demo-workflow-ts.mdx
+++ b/src/content/cre/templates/running-demo-workflow-ts.mdx
@@ -7,7 +7,7 @@ pageId: "running-demo-workflow"
 metadata:
   description: "Run the Custom Data Feed demo: explore a TypeScript workflow template with API calls, blockchain reads, and onchain writes."
   datePublished: "2025-11-04"
-  lastModified: "2025-11-04"
+  lastModified: "2026-01-14"
 ---
 
 import { Aside, CopyText } from "@components"
@@ -27,7 +27,7 @@ Before you begin, ensure you have the necessary tools installed:
 
 - **CRE CLI**: You must have the CRE CLI installed. See [Install the CLI](/cre/getting-started/cli-installation) for instructions.
 - **CRE account & authentication**: You must have a CRE account and be logged in with the CLI. Run  in your terminal to verify you're logged in, or run  to authenticate. See [Creating Your Account](/cre/account/creating-account) and [Logging in with the CLI](/cre/account/cli-login) for instructions.
-- **Bun**: You must have Bun version 1.2.21 or higher installed. Check your version with . See [Install Bun](https://bun.sh/docs/installation) for instructions.
+- **Bun**: You must have Bun version 1.2.21 or higher installed. Check your version with . See [Install Bun](https://bun.com/docs/installation) for instructions.
 - **Sepolia Testnet Account**: You need a private key for an account funded with Sepolia ETH. This is required because the demo workflow performs a write transaction. Go to faucets.chain.link to get some Sepolia ETH.
 
 ## 2. Initialize the demo project

From cc9069856a34765b76692999880922a69170968a Mon Sep 17 00:00:00 2001
From: Simone Cuomo 
Date: Thu, 15 Jan 2026 15:40:50 +0000
Subject: [PATCH 120/214] Update Network to use Bucket

---
 src/components/CCIP/ChainHero/ChainHero.tsx   |  3 ++-
 .../CCIP/ChainHero/TokenDetailsHero.tsx       |  3 ++-
 src/components/CCIP/Landing/NetworkGrid.tsx   |  4 +--
 src/config/cdn.ts                             |  3 ++-
 src/config/data/ccip/data.ts                  | 25 ++++++++++++++-----
 .../components/NetworkIcons.tsx               |  3 ++-
 .../components/NetworkIcons.tsx               |  3 ++-
 src/features/utils/networkIcons.ts            |  2 +-
 8 files changed, 32 insertions(+), 14 deletions(-)

diff --git a/src/components/CCIP/ChainHero/ChainHero.tsx b/src/components/CCIP/ChainHero/ChainHero.tsx
index bc4b18ab7c6..97626aa0e6e 100644
--- a/src/components/CCIP/ChainHero/ChainHero.tsx
+++ b/src/components/CCIP/ChainHero/ChainHero.tsx
@@ -16,6 +16,7 @@ import { Tooltip } from "~/features/common/Tooltip/Tooltip.tsx"
 import { getChainTooltip } from "../Tooltip/index.ts"
 import { PoolProgramTooltip } from "../Tooltip/PoolProgramTooltip.tsx"
 import { ExplorerInfo, ChainType } from "@config/types.ts"
+import { getNetworkIconUrl } from "~/config/data/ccip/data.ts"
 
 interface ChainHeroProps {
   chains: {
@@ -149,7 +150,7 @@ function ChainHero({
         {(network || token) && (
           
{ diff --git a/src/components/CCIP/ChainHero/TokenDetailsHero.tsx b/src/components/CCIP/ChainHero/TokenDetailsHero.tsx index 94ce250d01f..edd989a1043 100644 --- a/src/components/CCIP/ChainHero/TokenDetailsHero.tsx +++ b/src/components/CCIP/ChainHero/TokenDetailsHero.tsx @@ -4,6 +4,7 @@ import { PoolType } from "~/config/data/ccip/types.ts" import { tokenPoolDisplay } from "~/config/data/ccip/utils.ts" import "./ChainHero.css" import { ExplorerInfo, ChainType } from "~/config/types.ts" +import { getNetworkIconUrl } from "~/config/data/ccip/data.ts" interface TokenDetailsHeroProps { network: { @@ -30,7 +31,7 @@ function TokenDetailsHero({ network, token }: TokenDetailsHeroProps) {
- + } + logo={} title={chain.name} subtitle={subtitle} link={`/ccip/directory/${environment}/chain/${chain.chain}`} diff --git a/src/config/cdn.ts b/src/config/cdn.ts index 43eb8fbb53c..28de60e15b9 100644 --- a/src/config/cdn.ts +++ b/src/config/cdn.ts @@ -8,7 +8,8 @@ export const CLOUDFRONT_CDN_BASE = "https://d2f70xi62kby8n.cloudfront.net" // Asset-specific paths export const TOKEN_ICONS_PATH = `${CLOUDFRONT_CDN_BASE}/tokens` -export const VERIFIER_LOGOS_PATH = `${CLOUDFRONT_CDN_BASE}/verifiers` +export const VERIFIER_ICON_PATH = `${CLOUDFRONT_CDN_BASE}/verifiers` +export const NETWORK_ICON_PATH = `${CLOUDFRONT_CDN_BASE}/bridge/icons/networks` // Other CDNs (for future centralization if needed) export const IMGIX_CDN_BASE = "https://smartcontract.imgix.net" diff --git a/src/config/data/ccip/data.ts b/src/config/data/ccip/data.ts index 9773dee205b..d65ce636aa1 100644 --- a/src/config/data/ccip/data.ts +++ b/src/config/data/ccip/data.ts @@ -19,7 +19,7 @@ import { } from "./types.ts" import { determineTokenMechanism } from "./utils.ts" import { ExplorerInfo, SupportedChain, ChainType } from "@config/types.ts" -import { VERIFIER_LOGOS_PATH } from "@config/cdn.ts" +import { NETWORK_ICON_PATH, VERIFIER_ICON_PATH } from "@config/cdn.ts" import { directoryToSupportedChain, getChainIcon, @@ -31,6 +31,7 @@ import { getTokenIconUrl, getNativeCurrency, } from "@features/utils/index.ts" +import { normalizeTechnologyName } from "src/features/utils/networkIcons.ts" // For mainnet import chainsMainnetv120 from "@config/data/ccip/v1_2_0/mainnet/chains.json" with { type: "json" } @@ -852,8 +853,20 @@ export const loadVerifiersData = ({ environment, version }: { environment: Envir * Get logo URL for a verifier by ID * Uses CloudFront CDN, same infrastructure as token icons */ -export const getVerifierLogoUrl = (verifierId: string): string => { - return `${VERIFIER_LOGOS_PATH}/${verifierId}.svg` +export const getVerifierIconUrl = (verifierId: string): string => { + return `${VERIFIER_ICON_PATH}/${verifierId}.svg` +} + +/** + * Get logo URL for a network by ID + * Uses CloudFront CDN, same infrastructure as token icons + */ +export const getNetworkIconUrl = (networkName: string | undefined): string | undefined => { + if (!networkName) { + return + } + const normalizedName = normalizeTechnologyName(networkName) + return `${NETWORK_ICON_PATH}/${normalizedName}.svg` } /** @@ -889,7 +902,7 @@ export const getAllVerifiers = ({ ...metadata, network: networkId, address, - logo: getVerifierLogoUrl(metadata.id), + logo: getVerifierIconUrl(metadata.id), }) } } @@ -927,7 +940,7 @@ export const getVerifiersByNetwork = ({ ...metadata, network: networkId, address, - logo: getVerifierLogoUrl(metadata.id), + logo: getVerifierIconUrl(metadata.id), }) } @@ -996,7 +1009,7 @@ export const getVerifier = ({ ...metadata, network: networkId, address, - logo: getVerifierLogoUrl(metadata.id), + logo: getVerifierIconUrl(metadata.id), } } diff --git a/src/features/chainlink-automation/components/NetworkIcons.tsx b/src/features/chainlink-automation/components/NetworkIcons.tsx index e8ba7419b95..2b610050934 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,7 +43,7 @@ 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}`) diff --git a/src/features/chainlink-functions/components/NetworkIcons.tsx b/src/features/chainlink-functions/components/NetworkIcons.tsx index 3942514c5f4..20834173b19 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,7 +31,7 @@ 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") 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, "-") } From a63d013bbbeb48355294f8d4b3c7c2b7be40f030 Mon Sep 17 00:00:00 2001 From: devin distefano Date: Thu, 15 Jan 2026 10:06:48 -0800 Subject: [PATCH 121/214] changelog update (#3366) --- public/changelog.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/public/changelog.json b/public/changelog.json index 809477246a3..c34869d99e8 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -358,6 +358,13 @@ } }, "data": [ + { + "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": "integration", "date": "2026-01-11", From cd06fdc97694d68659cc4151d98290189ad41883 Mon Sep 17 00:00:00 2001 From: devin distefano Date: Thu, 15 Jan 2026 10:18:23 -0800 Subject: [PATCH 122/214] added ronin to deprecating feeds chainlist (#3367) --- src/features/data/chains.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/features/data/chains.ts b/src/features/data/chains.ts index ae28c769084..454b0aba77a 100644 --- a/src/features/data/chains.ts +++ b/src/features/data/chains.ts @@ -997,6 +997,13 @@ export const ALL_CHAINS: Chain[] = [ rddUrl: "https://reference-data-directory.vercel.app/feeds-ethereum-mainnet-polygon-zkevm-1.json", queryString: "polygon-zkevm-mainnet", }, + { + name: "Ronin Mainnet", + explorerUrl: "https://app.roninchain.com/address/%s", + networkType: "mainnet", + rddUrl: "https://reference-data-directory.vercel.app/feeds-ronin-mainnet.json", + queryString: "ronin-mainnet", + }, { name: "Solana Mainnet", explorerUrl: "https://solscan.io/account/%s", From 2e36bef5abf1610f4b3b84c7e4bc4adbd639095a Mon Sep 17 00:00:00 2001 From: devin distefano Date: Thu, 15 Jan 2026 10:39:28 -0800 Subject: [PATCH 123/214] update verifier proxy for megaeth (#3368) --- src/features/feeds/data/StreamsNetworksData.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/feeds/data/StreamsNetworksData.ts b/src/features/feeds/data/StreamsNetworksData.ts index 9c5e68ee768..5ef6e0ec760 100644 --- a/src/features/feeds/data/StreamsNetworksData.ts +++ b/src/features/feeds/data/StreamsNetworksData.ts @@ -393,7 +393,7 @@ export const StreamsNetworksData: NetworkData[] = [ networkStatus: "https://uptime.megaeth.com", testnet: { label: "MegaETH Testnet", - verifierProxy: "0xfBFff08fE4169853F7B1b5Ac67eC10dc8806801d", + verifierProxy: "0xa33c1F0561eECe58ee7b7349D5BE018dd94EC9B6", explorerUrl: "https://www.megaexplorer.xyz/address/%s", }, }, From f40622b6416948dec6b8007c879011e130ed3ba4 Mon Sep 17 00:00:00 2001 From: devin distefano Date: Thu, 15 Jan 2026 16:07:59 -0800 Subject: [PATCH 124/214] Data Streams: Calculated Streams (#3277) --- .../calculated-streams-diagram.png | Bin 0 -> 433168 bytes reports/llms-report.json | 127 ++++++++++++ src/config/sidebar.ts | 4 + .../concepts/calculated-streams.mdx | 186 ++++++++++++++++++ src/content/data-streams/llms-full.txt | 160 +++++++++++++++ src/features/feeds/components/Tables.tsx | 17 ++ 6 files changed, 494 insertions(+) create mode 100644 public/images/data-streams/calculated-streams-diagram.png create mode 100644 reports/llms-report.json create mode 100644 src/content/data-streams/concepts/calculated-streams.mdx 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 0000000000000000000000000000000000000000..64b02149cde85511c10481d8f06687b24e1da83d GIT binary patch literal 433168 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

g%)R{K{O28<7C^ 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ÐV2>>j2Kj?Sr*v8v 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 = { title: "Best Practices", url: "data-streams/concepts/best-practices", }, + { + title: "Calculated Streams", + url: "data-streams/concepts/calculated-streams", + }, { title: "Liquidity-Weighted Bid and Ask prices", url: "data-streams/concepts/liquidity-weighted-prices", diff --git a/src/content/data-streams/concepts/calculated-streams.mdx b/src/content/data-streams/concepts/calculated-streams.mdx new file mode 100644 index 00000000000..0e079382d4c --- /dev/null +++ b/src/content/data-streams/concepts/calculated-streams.mdx @@ -0,0 +1,186 @@ +--- +section: dataStreams +date: "Last Modified" +title: "Calculated Streams" +metadata: + title: "Chainlink Calculated Streams | Derived Data Stream Values" + description: "Learn about Calculated Streams in Chainlink Data Streams - streams whose values are derived from multiple underlying inputs using predefined expressions." + keywords: + [ + "Calculated Streams", + "Data Streams", + "Derived Values", + "Index Pricing", + "Collateral Values", + "Tokenized Assets", + "Stream Calculations", + ] +whatsnext: + { + "Find the list of available Exchange Rate streams": "/data-streams/exchange-rate-streams", + "Learn about Data Streams architecture": "/data-streams/architecture", + "Data Streams Best Practices": "/data-streams/concepts/best-practices", + } +--- + +import { Aside, ClickToZoom } from "@components" + +Calculated streams are Chainlink data streams whose values are derived by applying arithmetic expressions to multiple underlying inputs. + +All Data Streams use a [Decentralized Oracle Network (DON)](/data-streams/architecture) where nodes reach consensus and publish signed reports. Traditional Data Streams aggregate market data from multiple independent providers, ensuring no single data source can compromise the stream's integrity. + +Instead of aggregating only raw market data, calculated streams compute derived values using predefined formulas applied to various inputs, including existing data streams, onchain state, and offchain APIs. Some inputs are decentralized aggregates (for example, crypto price streams from multiple independent providers), while others may come from a single protocol or API (for example, a specific vault contract or yield provider). Because a calculated stream depends on all of these inputs, you should evaluate their dependencies and failure modes carefully before using it in a value-securing application. + +

+ +## Why use calculated streams? + +- **Simpler integrations**: Consume one stream instead of implementing calculation logic in your contracts or backend +- **Canonical formulas**: All integrators use the same formula and inputs, ensuring consistency across protocols +- **Managed infrastructure**: Chainlink handles RPC calls, API integrations, and the calculation pipeline + +## How to identify calculated streams + +Calculated streams are marked with a Calculated badge in the Data Streams feed list. + +## How calculated streams work + +Calculated streams leverage existing Data Streams infrastructure. Data providers feed market data into the DON, which produces base streams. The DON then uses these base streams—along with onchain state and offchain APIs—as inputs to calculate derived values. + + + +### Architecture flow + +1. **Data collection**: The DON retrieves inputs specific to each calculated stream, which may include: + - Existing Data Streams (market prices from multiple independent data providers) + - Onchain state via RPC calls (vault balances, token supplies, contract data) + - Offchain data via APIs (yield rates, interest components, external reference data) +2. **Calculation**: The DON applies the predefined formula to combine the inputs +3. **Consensus and signing**: Nodes reach consensus on the calculated value and sign the report +4. **Publication**: Calculated streams are published through the Data Streams Aggregation Network + +### Input sources + +The inputs for a calculated stream depend on what it's computing. A stream might use: + +#### Existing Data Streams + +Market prices already aggregated from multiple independent sources (3+ providers). Example: using individual crypto asset prices as inputs for an index calculation. + +#### Onchain state + +Protocol-specific data read via RPC, such as vault balances, token supplies, or smart contract state. May come from a single protocol's contracts. + +#### Offchain APIs + +External data from specific trusted providers, such as yield rates or reference values. May come from a single API endpoint. + +### Calculation and output + +The DON executes the predefined formula (weighted averages, ratios, sums, etc.) using the latest available inputs. The calculated value is packaged into a signed report with standard metadata (timestamps, fees) and published through the Data Streams Aggregation Network. You consume these reports using the same REST APIs, WebSocket connections, and onchain verification as traditional streams. + +## Example: Tokenized yield product + +A calculated stream for a tokenized yield-bearing vault might combine: + +- **Vault balance (onchain)**: Total assets in the vault contract +- **Token supply (onchain)**: Circulating supply of vault shares +- **Accrued yield (offchain)**: Interest from an external API + +**Formula:** `(vault balance + accrued yield) / token supply` + +**Result**: a price per share that reflects the vault's total value including pending yield. + +Without this stream, protocols accepting the vault token as collateral would need to query the vault contract, fetch accrued interest from the yield provider's API, perform the calculation themselves, and keep this logic synchronized across all integrators. A calculated stream helps ensure integrators apply the same pricing logic and update together when the underlying formula or yield source changes. + +## Key differences from standard streams + +While calculated streams use the same infrastructure and delivery mechanisms as standard streams, they have distinct behaviors you should understand before integrating. For mitigation strategies, see [Risks and mitigation](#risks-and-mitigation). + +### Report availability + +Standard streams aggregate data from multiple independent providers, so they remain available as long as enough providers are reporting. Calculated streams depend on **all** of their inputs being available. If any required input becomes unavailable or returns errors, the calculated **stream stops producing reports until all inputs recover**. This prevents potentially incorrect values from being published. + +### Input reliability + +Standard streams source data exclusively from decentralized aggregates of multiple independent data providers. Calculated streams may include a mix of: + +- **Decentralized aggregates**: Existing Data Streams with multiple independent sources (similar reliability to standard streams) +- **Single-source inputs**: Specific protocol contracts or APIs where availability depends on a single system + +Single-source inputs carry higher risk. If that source experiences downtime, report production halts entirely until it recovers. Review the input sources for any calculated stream you plan to use. + +### Timing characteristics + +Standard streams reflect a single aggregated market price at a point in time. Calculated streams combine multiple inputs that may update at different frequencies and reflect slightly different timestamps. The calculated value is an approximation based on the latest available data from each input, not a single-block atomic snapshot. + +During rapid changes (large deposits, withdrawals, or sharp market moves), you may observe temporary differences between the calculated stream value and values from other sources like block explorers or protocol dashboards. These differences typically resolve as all inputs update to reflect the new state. + +--- + +## Risks and mitigation + +Calculated streams inherit risks from their underlying inputs and introduce additional considerations. Use these strategies to mitigate potential issues. + +### Handling report gaps + +Because calculated streams stop producing reports when any input fails, your application must handle gaps in report availability. + +#### Mitigation + +- Design your protocol to handle report gaps gracefully (pause operations, use last-known values with appropriate staleness checks, or implement fallbacks based on your risk tolerance) +- Implement staleness checks to detect when reports stop arriving and trigger appropriate protocol responses +- Set alerts for report gaps to detect input source issues early + +### Single-source input reliability + +Single-source inputs (specific APIs or contracts) may have lower availability than decentralized aggregates. + +#### Mitigation + +- Understand your input sources and assess the reliability of each, particularly single-source APIs or contracts +- For critical applications, consider independently monitoring the availability of single-source inputs +- Define acceptable downtime thresholds and corresponding protocol responses + +### Timing discrepancies + +Temporary differences between the calculated stream and other data sources are expected during rapid changes. + +#### Mitigation + +- Implement max deviation checks against expected ranges +- Use time-weighted averages or circuit breakers for extreme moves +- Monitor trends over time rather than reacting to individual updates +- Compare calculated values against market references when available (e.g., spot prices for index tokens) + + + +--- + +## Best practices + +### Protocol design + +- Set deviation limits to cap price changes per update or time window +- Define fallback behavior if the stream stops updating or jumps beyond thresholds +- Test your protocol's behavior during report gaps before deploying to production + +### Monitoring + +- Set alerts for report gaps to detect when no new reports arrive within your expected update frequency +- Track the calculated stream value over time to establish normal behavior patterns +- Monitor key inputs independently when feasible (vault balances, token supplies, API availability) to identify which input may be causing issues +- Alert on movements outside your expected range diff --git a/src/content/data-streams/llms-full.txt b/src/content/data-streams/llms-full.txt index b88a78422e4..18d921af81e 100644 --- a/src/content/data-streams/llms-full.txt +++ b/src/content/data-streams/llms-full.txt @@ -397,6 +397,166 @@ For broader guidance around market hours and event handling, refer to the [Marke --- +# Calculated Streams +Source: https://docs.chain.link/data-streams/concepts/calculated-streams + +Calculated streams are Chainlink data streams whose values are derived by applying arithmetic expressions to multiple underlying inputs. + +All Data Streams use a [Decentralized Oracle Network (DON)](/data-streams/architecture) where nodes reach consensus and publish signed reports. Traditional Data Streams aggregate market data from multiple independent providers, ensuring no single data source can compromise the stream's integrity. + +Instead of aggregating only raw market data, calculated streams compute derived values using predefined formulas applied to various inputs, including existing data streams, onchain state, and offchain APIs. Some inputs are decentralized aggregates (for example, crypto price streams from multiple independent providers), while others may come from a single protocol or API (for example, a specific vault contract or yield provider). Because a calculated stream depends on all of these inputs, you should evaluate their dependencies and failure modes carefully before using it in a value-securing application. + + + +## Why use calculated streams? + +- **Simpler integrations**: Consume one stream instead of implementing calculation logic in your contracts or backend +- **Canonical formulas**: All integrators use the same formula and inputs, ensuring consistency across protocols +- **Managed infrastructure**: Chainlink handles RPC calls, API integrations, and the calculation pipeline + +## How to identify calculated streams + +Calculated streams are marked with a Calculated badge in the Data Streams feed list. + +## How calculated streams work + +Calculated streams leverage existing Data Streams infrastructure. Data providers feed market data into the DON, which produces base streams. The DON then uses these base streams—along with onchain state and offchain APIs—as inputs to calculate derived values. + +### Architecture flow + +1. **Data collection**: The DON retrieves inputs specific to each calculated stream, which may include: + - Existing Data Streams (market prices from multiple independent data providers) + - Onchain state via RPC calls (vault balances, token supplies, contract data) + - Offchain data via APIs (yield rates, interest components, external reference data) +2. **Calculation**: The DON applies the predefined formula to combine the inputs +3. **Consensus and signing**: Nodes reach consensus on the calculated value and sign the report +4. **Publication**: Calculated streams are published through the Data Streams Aggregation Network + +### Input sources + +The inputs for a calculated stream depend on what it's computing. A stream might use: + +#### Existing Data Streams + +Market prices already aggregated from multiple independent sources (3+ providers). Example: using individual crypto asset prices as inputs for an index calculation. + +#### Onchain state + +Protocol-specific data read via RPC, such as vault balances, token supplies, or smart contract state. May come from a single protocol's contracts. + +#### Offchain APIs + +External data from specific trusted providers, such as yield rates or reference values. May come from a single API endpoint. + +### Calculation and output + +The DON executes the predefined formula (weighted averages, ratios, sums, etc.) using the latest available inputs. The calculated value is packaged into a signed report with standard metadata (timestamps, fees) and published through the Data Streams Aggregation Network. You consume these reports using the same REST APIs, WebSocket connections, and onchain verification as traditional streams. + +## Example: Tokenized yield product + +A calculated stream for a tokenized yield-bearing vault might combine: + +- **Vault balance (onchain)**: Total assets in the vault contract +- **Token supply (onchain)**: Circulating supply of vault shares +- **Accrued yield (offchain)**: Interest from an external API + +**Formula:** `(vault balance + accrued yield) / token supply` + +**Result**: a price per share that reflects the vault's total value including pending yield. + +Without this stream, protocols accepting the vault token as collateral would need to query the vault contract, fetch accrued interest from the yield provider's API, perform the calculation themselves, and keep this logic synchronized across all integrators. A calculated stream helps ensure integrators apply the same pricing logic and update together when the underlying formula or yield source changes. + +## Key differences from standard streams + +While calculated streams use the same infrastructure and delivery mechanisms as standard streams, they have distinct behaviors you should understand before integrating. For mitigation strategies, see [Risks and mitigation](#risks-and-mitigation). + +### Report availability + +Standard streams aggregate data from multiple independent providers, so they remain available as long as enough providers are reporting. Calculated streams depend on **all** of their inputs being available. If any required input becomes unavailable or returns errors, the calculated **stream stops producing reports until all inputs recover**. This prevents potentially incorrect values from being published. + +### Input reliability + +Standard streams source data exclusively from decentralized aggregates of multiple independent data providers. Calculated streams may include a mix of: + +- **Decentralized aggregates**: Existing Data Streams with multiple independent sources (similar reliability to standard streams) +- **Single-source inputs**: Specific protocol contracts or APIs where availability depends on a single system + +Single-source inputs carry higher risk. If that source experiences downtime, report production halts entirely until it recovers. Review the input sources for any calculated stream you plan to use. + +### Timing characteristics + +Standard streams reflect a single aggregated market price at a point in time. Calculated streams combine multiple inputs that may update at different frequencies and reflect slightly different timestamps. The calculated value is an approximation based on the latest available data from each input, not a single-block atomic snapshot. + +During rapid changes (large deposits, withdrawals, or sharp market moves), you may observe temporary differences between the calculated stream value and values from other sources like block explorers or protocol dashboards. These differences typically resolve as all inputs update to reflect the new state. + +*** + +## Risks and mitigation + +Calculated streams inherit risks from their underlying inputs and introduce additional considerations. Use these strategies to mitigate potential issues. + +### Handling report gaps + +Because calculated streams stop producing reports when any input fails, your application must handle gaps in report availability. + +#### Mitigation + +- Design your protocol to handle report gaps gracefully (pause operations, use last-known values with appropriate staleness checks, or implement fallbacks based on your risk tolerance) +- Implement staleness checks to detect when reports stop arriving and trigger appropriate protocol responses +- Set alerts for report gaps to detect input source issues early + +### Single-source input reliability + +Single-source inputs (specific APIs or contracts) may have lower availability than decentralized aggregates. + +#### Mitigation + +- Understand your input sources and assess the reliability of each, particularly single-source APIs or contracts +- For critical applications, consider independently monitoring the availability of single-source inputs +- Define acceptable downtime thresholds and corresponding protocol responses + +### Timing discrepancies + +Temporary differences between the calculated stream and other data sources are expected during rapid changes. + +#### Mitigation + +- Implement max deviation checks against expected ranges +- Use time-weighted averages or circuit breakers for extreme moves +- Monitor trends over time rather than reacting to individual updates +- Compare calculated values against market references when available (e.g., spot prices for index tokens) + + + +*** + +## Best practices + +### Protocol design + +- Set deviation limits to cap price changes per update or time window +- Define fallback behavior if the stream stops updating or jumps beyond thresholds +- Test your protocol's behavior during report gaps before deploying to production + +### Monitoring + +- Set alerts for report gaps to detect when no new reports arrive within your expected update frequency +- Track the calculated stream value over time to establish normal behavior patterns +- Monitor key inputs independently when feasible (vault balances, token supplies, API availability) to identify which input may be causing issues +- Alert on movements outside your expected range + +--- + # DEX State Price Streams Source: https://docs.chain.link/data-streams/concepts/dex-state-price-streams diff --git a/src/features/feeds/components/Tables.tsx b/src/features/feeds/components/Tables.tsx index da7d8047741..39d547da94c 100644 --- a/src/features/feeds/components/Tables.tsx +++ b/src/features/feeds/components/Tables.tsx @@ -848,6 +848,13 @@ 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 ( @@ -862,6 +869,16 @@ export const StreamsTr = ({ metadata, isMainnet }) => { DEX State Price )} + {isCalculatedStream && ( + + Calculated + + )}

{metadata.docs.shutdownDate && (
From 226ef894cdcae7672b403f49e6941e7045f2e5ca Mon Sep 17 00:00:00 2001 From: devin distefano Date: Fri, 16 Jan 2026 03:52:29 -0800 Subject: [PATCH 125/214] Data Streams: Billing + MegaETH updates (#3369) * add megaeth mainnet for private mainnet users, update explorer to new explorers * deprecation notice on pay-per-report * llms * report->verification --- reports/llms-report.json | 10 +++++----- src/content/data-streams/billing.mdx | 13 ++++++------- src/content/data-streams/llms-full.txt | 13 ++++++------- src/features/feeds/data/StreamsNetworksData.ts | 7 ++++++- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/reports/llms-report.json b/reports/llms-report.json index 80fa6064664..b42b02d209b 100644 --- a/reports/llms-report.json +++ b/reports/llms-report.json @@ -1,5 +1,5 @@ { - "startedAt": "2026-01-15T19:34:53.188Z", + "startedAt": "2026-01-16T10:56:22.202Z", "siteBase": "https://docs.chain.link", "sections": [ { @@ -46,9 +46,9 @@ "section": "data-streams", "pagesProcessed": 56, "outputPath": "src/content/data-streams/llms-full.txt", - "bytes": 517200, - "prevBytes": 515094, - "deltaBytes": 2106 + "bytes": 516892, + "prevBytes": 517200, + "deltaBytes": -308 }, { "section": "dta-technical-standard", @@ -123,5 +123,5 @@ "deltaBytes": 0 } ], - "finishedAt": "2026-01-15T19:34:57.003Z" + "finishedAt": "2026-01-16T10:56:26.000Z" } \ No newline at end of file diff --git a/src/content/data-streams/billing.mdx b/src/content/data-streams/billing.mdx index 5ac1b14b781..4344e7d6a35 100644 --- a/src/content/data-streams/billing.mdx +++ b/src/content/data-streams/billing.mdx @@ -22,12 +22,11 @@ import { Aside, ClickToZoom } from "@components" integrating Chainlink Data Streams with your applications. -Chainlink Data Streams offers two billing models: - -1. **Subscription model**: A subscription-based billing option. - -1. **Pay-per-report model**: You pay to verify reports from Data Streams onchain using the verifier contract. You pay per report verified. If you verify multiple reports in a batch, you pay for all of the reports included in that batch. - - The verification price is 0.35 USD per report. Chainlink Data Streams supports fee payments in LINK and in alternative assets, which currently includes native blockchain gas tokens and their ERC20-wrapped version. Payments made in alternative assets have a 10% surcharge when compared to LINK payments. +Chainlink Data Streams uses a subscription-based billing option. [Contact us](https://chainlinkcommunity.typeform.com/datastreams?#ref_id=docs) to learn more about Mainnet pricing and subscription options. + + diff --git a/src/content/data-streams/llms-full.txt b/src/content/data-streams/llms-full.txt index 18d921af81e..d9f0b327aba 100644 --- a/src/content/data-streams/llms-full.txt +++ b/src/content/data-streams/llms-full.txt @@ -119,16 +119,15 @@ Source: https://docs.chain.link/data-streams/billing integrating Chainlink Data Streams with your applications. -Chainlink Data Streams offers two billing models: - -1. **Subscription model**: A subscription-based billing option. - -2. **Pay-per-report model**: You pay to verify reports from Data Streams onchain using the verifier contract. You pay per report verified. If you verify multiple reports in a batch, you pay for all of the reports included in that batch. - - The verification price is 0.35 USD per report. Chainlink Data Streams supports fee payments in LINK and in alternative assets, which currently includes native blockchain gas tokens and their ERC20-wrapped version. Payments made in alternative assets have a 10% surcharge when compared to LINK payments. +Chainlink Data Streams uses a subscription-based billing option. [Contact us](https://chainlinkcommunity.typeform.com/datastreams?#ref_id=docs) to learn more about Mainnet pricing and subscription options. + + --- # Data Streams Best Practices diff --git a/src/features/feeds/data/StreamsNetworksData.ts b/src/features/feeds/data/StreamsNetworksData.ts index 5ef6e0ec760..ce4cd7cdc81 100644 --- a/src/features/feeds/data/StreamsNetworksData.ts +++ b/src/features/feeds/data/StreamsNetworksData.ts @@ -391,10 +391,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: "0xa33c1F0561eECe58ee7b7349D5BE018dd94EC9B6", - explorerUrl: "https://www.megaexplorer.xyz/address/%s", + explorerUrl: "https://megaeth-testnet-v2.blockscout.com/address/%s", }, }, { From 32f03f100edda9a93b393159ef54a48137ed3f11 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Fri, 16 Jan 2026 11:22:25 -0500 Subject: [PATCH 126/214] deprecate APM quickstart (#3372) --- src/content/data-streams/llms-full.txt | 4 ++-- .../quickstarts/automated-portfolio-manager.mdx | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/content/data-streams/llms-full.txt b/src/content/data-streams/llms-full.txt index d9f0b327aba..161f3d459bb 100644 --- a/src/content/data-streams/llms-full.txt +++ b/src/content/data-streams/llms-full.txt @@ -123,8 +123,8 @@ Chainlink Data Streams uses a subscription-based billing option. [Contact us](https://chainlinkcommunity.typeform.com/datastreams?#ref_id=docs) to learn more about Mainnet pricing and subscription options. -
| SHA-256 Checksum | -| ------------------------------------- | ----------------------------------------------------------------------------------------- | -| `cre_windows_amd64.zip` | | +1. Go to https://github.com/smartcontractkit/cre-cli/releases +2. Find the release version you downloaded (e.g., v1.0.5) +3. Under the **Assets** section, locate `cre_windows_amd64.zip` +4. Compare the SHA-256 checksum shown next to the file with the `Hash` value from your PowerShell output -If the checksum doesn't match, do not proceed with installation. Contact your Chainlink point of contact for assistance. +**Example:** For `cre_windows_amd64.zip` in release v1.0.5, you'll see something like: + +``` +cre_windows_amd64.zip +sha256:372d16566479ff6bbfe9eb1d5cebe0e1e2a3c67062c6f0439fc96c735ddeaa18 +``` + +If the checksums match, the file is authentic and safe to install. If they don't match, do not proceed with installation and contact the Chainlink team for assistance. #### 2. Extract and install 1. Navigate to the directory where you downloaded the archive. 1. Right-click the `.zip` file and select **Extract All...**. 1. Choose a permanent location for the extracted folder (e.g., `C:\Program Files\cre-cli`). -1. Inside the extracted folder, rename the file `cre_v1.0.4_windows_amd64.exe` to `cre.exe`. +1. Inside the extracted folder, rename the file `cre_v1.0.5_windows_amd64.exe` to `cre.exe`. #### 3. Add the CLI to your PATH @@ -131,7 +139,7 @@ Open a new **PowerShell** or **Command Prompt** window and run: cre version ``` -You should see version information: `cre version v1.0.4`. +You should see version information: `cre version v1.0.5`. ## Next steps diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index de3b0237394..a2280f8c8c7 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -446,6 +446,15 @@ Last Updated: 2025-11-20 This page provides detailed release notes for CRE. It includes information on new features, significant changes, and known limitations. +## CLI v1.0.5 - January 13, 2026 + +**CRE CLI version 1.0.5 is now available.** This release includes various small improvements and bug fixes. + +**How to update:** + +- **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. +- **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). + ## CLI v1.0.4 - January 9, 2026 **CRE CLI version 1.0.4 is now available.** This release includes various small improvements and bug fixes. @@ -550,7 +559,7 @@ These guides explain how to install the Chainlink Developer Platform CLI (also r Source: https://docs.chain.link/cre/getting-started/cli-installation/macos-linux Last Updated: 2025-11-20 -This page explains how to install the CRE CLI on macOS or Linux. The recommended version at the time of writing is **v1.0.4**. +This page explains how to install the CRE CLI on macOS or Linux. The recommended version at the time of writing is **v1.0.5**. ## Installation @@ -581,7 +590,7 @@ After the script completes, verify the installation: cre version ``` -**Expected output:** `cre version v1.0.4` +**Expected output:** `cre version v1.0.5`
- {network.mainnet?.label} + + {network.mainnet?.label} + {network.mainnet?.note && ( +
+ )} + {network.isSolana ? ( <> @@ -774,7 +782,15 @@ export const StreamsNetworkAddressesTable = ({
)} - {network.testnet?.label} + + {network.testnet?.label} + {network.testnet?.note && ( +
+ )} + {network.isSolana ? ( <> diff --git a/src/features/feeds/data/StreamsNetworksData.ts b/src/features/feeds/data/StreamsNetworksData.ts index ce4cd7cdc81..ae67f5f60a3 100644 --- a/src/features/feeds/data/StreamsNetworksData.ts +++ b/src/features/feeds/data/StreamsNetworksData.ts @@ -4,6 +4,7 @@ export type NetworkDetails = { accessController?: string explorerUrl: string label: string + note?: string } export type NetworkData = { @@ -393,6 +394,7 @@ export const StreamsNetworksData: NetworkData[] = [ networkStatus: "https://uptime.megaeth.com", mainnet: { label: "MegaETH Mainnet", + note: "Currently in private beta. Address whitelist required.", verifierProxy: "0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB", explorerUrl: "https://megaeth.blockscout.com/address/%s", }, From 4423f66e3d5c92bbead0d237ff029affd5bde00c Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Fri, 23 Jan 2026 09:17:50 -0500 Subject: [PATCH 144/214] nit (#3393) --- src/content/vrf/v2-5/supported-networks.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/vrf/v2-5/supported-networks.mdx b/src/content/vrf/v2-5/supported-networks.mdx index be0b59fc33e..ff8ae743a54 100644 --- a/src/content/vrf/v2-5/supported-networks.mdx +++ b/src/content/vrf/v2-5/supported-networks.mdx @@ -215,7 +215,7 @@ Testnet LINK is available from https://faucets.chain.link/fuji | VRF Coordinator |
| | 2 gwei Key Hash | | | 30 gwei Key Hash | | -| Premium percentage
(paying with BASE) | 60 | +| Premium percentage
(paying with BASE Mainnet ETH) | 60 | | Premium percentage
(paying with LINK) | 50 | | Max Gas Limit | 2,500,000 | | Minimum Confirmations | 0 | @@ -230,7 +230,7 @@ Testnet LINK is available from https://faucets.chain.link/fuji | VRF Coordinator |
| | 2 gwei Key Hash | | | 30 gwei Key Hash | | | -| Premium percentage
(paying with BASE) | 60 | +| Premium percentage
(paying with BASE Mainnet ETH) | 60 | | Premium percentage
(paying with LINK) | 50 | | Minimum Confirmations | 0 | | Maximum Confirmations | 200 | From 491a406ea45b270dfde954b845f98dc0004be98b Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Fri, 23 Jan 2026 10:01:08 -0500 Subject: [PATCH 145/214] clarify workflow status preservation during updates (#3394) --- .../guides/operations/updating-deployed-workflows.mdx | 8 +++++++- src/content/cre/llms-full-go.txt | 9 +++++++-- src/content/cre/llms-full-ts.txt | 9 +++++++-- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/content/cre/guides/operations/updating-deployed-workflows.mdx b/src/content/cre/guides/operations/updating-deployed-workflows.mdx index 4ccb0177715..4e3592893f3 100644 --- a/src/content/cre/guides/operations/updating-deployed-workflows.mdx +++ b/src/content/cre/guides/operations/updating-deployed-workflows.mdx @@ -5,7 +5,7 @@ title: "Updating Deployed Workflows" metadata: description: "Update your live workflows: learn how to safely deploy new versions and replace your running workflows without downtime." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2026-01-23" --- import { Aside } from "@components" @@ -36,6 +36,12 @@ cre workflow deploy my-workflow --target production-settings 1. **Upload**: The new binary and configuration files are uploaded to the CRE Storage Service 1. **Registration**: A new registration transaction is sent to the Workflow Registry contract 1. **Replacement**: The previous version is replaced with the new deployment +1. **Status preserved**: The workflow's status (active or paused) is preserved from the previous deployment + +{/* prettier-ignore */} + {/* prettier-ignore */}
@@ -181,6 +185,14 @@ const chainStructuredData = generateChainStructuredData( grid-template-columns: 1fr; gap: var(--space-2x); } + :global(.chain-add-button) { + border-color: var(--blue-600) !important; + color: var(--blue-600) !important; + } + + :global(.chain-add-button:hover) { + background-color: var(--blue-100) !important; + } @media (min-width: 50em) { .layout { diff --git a/src/components/CCIP/ChainHero/ChainHero.tsx b/src/components/CCIP/ChainHero/ChainHero.tsx index 97626aa0e6e..21e6d0cbc08 100644 --- a/src/components/CCIP/ChainHero/ChainHero.tsx +++ b/src/components/CCIP/ChainHero/ChainHero.tsx @@ -1,5 +1,5 @@ import { Environment, LaneConfig, Network, Version } from "~/config/data/ccip/types.ts" -import { getTokenData } from "~/config/data/ccip/data.ts" +import { getTokenData, getNetworkIconUrl } from "~/config/data/ccip/data.ts" import Address from "~/components/AddressReact.tsx" import Breadcrumb from "../Breadcrumb/Breadcrumb.tsx" import Search from "../Search/Search.tsx" @@ -16,7 +16,6 @@ import { Tooltip } from "~/features/common/Tooltip/Tooltip.tsx" import { getChainTooltip } from "../Tooltip/index.ts" import { PoolProgramTooltip } from "../Tooltip/PoolProgramTooltip.tsx" import { ExplorerInfo, ChainType } from "@config/types.ts" -import { getNetworkIconUrl } from "~/config/data/ccip/data.ts" interface ChainHeroProps { chains: { diff --git a/src/components/CCIP/Drawer/TokenDrawer.tsx b/src/components/CCIP/Drawer/TokenDrawer.tsx index 19d31f1cbbe..ac32df98710 100644 --- a/src/components/CCIP/Drawer/TokenDrawer.tsx +++ b/src/components/CCIP/Drawer/TokenDrawer.tsx @@ -26,6 +26,7 @@ import { Tooltip } from "~/features/common/Tooltip/Tooltip.tsx" import { useMultiLaneRateLimits } from "~/hooks/useMultiLaneRateLimits.ts" import { RateLimitCell } from "~/components/CCIP/RateLimitCell.tsx" import { realtimeDataService } from "~/lib/ccip/services/realtime-data-instance.ts" +import { Typography } from "@chainlink/blocks" enum TokenTab { Outbound = "outbound", @@ -202,17 +203,25 @@ function TokenDrawer({ - - - - + + + + {verifiers.length === 0 ? ( ) : ( @@ -226,7 +235,7 @@ function TokenDrawer({ className="ccip-table__logo" style={{ width: "24px", height: "24px" }} /> - {verifier.name} + {verifier.name} - - + + )) )} diff --git a/src/components/CCIP/Tables/ChainTable.tsx b/src/components/CCIP/Tables/ChainTable.tsx index 5e278233d20..7ab6c7c559e 100644 --- a/src/components/CCIP/Tables/ChainTable.tsx +++ b/src/components/CCIP/Tables/ChainTable.tsx @@ -68,9 +68,6 @@ function ChainTable({ lanes, explorer, sourceNetwork, environment }: TableProps) onChange={(key) => setInOutbound(key as LaneFilter)} />
-
- -
View lane status +
+ +
diff --git a/src/components/CCIP/Tables/Table.css b/src/components/CCIP/Tables/Table.css index a99fb0b836a..6adf43a6b31 100644 --- a/src/components/CCIP/Tables/Table.css +++ b/src/components/CCIP/Tables/Table.css @@ -219,6 +219,8 @@ display: flex; align-items: center; gap: var(--space-2x); + border: 1px solid var(--blue-600); + color: var(--blue-600); } .ccip-table__filters__external-icon { diff --git a/src/config/data/ccip/data.ts b/src/config/data/ccip/data.ts index d65ce636aa1..d5cd936e3f2 100644 --- a/src/config/data/ccip/data.ts +++ b/src/config/data/ccip/data.ts @@ -31,7 +31,7 @@ import { getTokenIconUrl, getNativeCurrency, } from "@features/utils/index.ts" -import { normalizeTechnologyName } from "src/features/utils/networkIcons.ts" +import { normalizeTechnologyName } from "@features/utils/networkIcons.ts" // For mainnet import chainsMainnetv120 from "@config/data/ccip/v1_2_0/mainnet/chains.json" with { type: "json" } diff --git a/src/features/chainlink-automation/components/NetworkIcons.tsx b/src/features/chainlink-automation/components/NetworkIcons.tsx index 2b610050934..52b60afa43c 100644 --- a/src/features/chainlink-automation/components/NetworkIcons.tsx +++ b/src/features/chainlink-automation/components/NetworkIcons.tsx @@ -49,7 +49,7 @@ export default function NetworkIcons() { // 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/components/NetworkIcons.tsx b/src/features/chainlink-functions/components/NetworkIcons.tsx index 20834173b19..03184e362ae 100644 --- a/src/features/chainlink-functions/components/NetworkIcons.tsx +++ b/src/features/chainlink-functions/components/NetworkIcons.tsx @@ -35,7 +35,7 @@ export default function NetworkIcons() { // 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" From 3ed5b5b78418ecb2351b2d8f8d6ee4ef6f851624 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Tue, 3 Feb 2026 18:22:54 -0500 Subject: [PATCH 179/214] Refactor supported ntwks, add version requirements (#3430) * refactor supported ntwks, add vers reqs * llm gen * add note for workflow ID changes on update * add note for workflow ID changes on update * add chain selectors, go constants to EVM client ref * remove SDK versions from ref --- public/changelog.json | 4 +- .../QuickLinks/data/productChainLinks.ts | 16 +- src/config/sidebar.ts | 13 +- .../updating-deployed-workflows.mdx | 5 + ...orks-go.mdx => forwarder-directory-go.mdx} | 41 +- ...orks-ts.mdx => forwarder-directory-ts.mdx} | 41 +- .../building-consumer-contracts.mdx | 12 +- src/content/cre/llms-full-go.txt | 395 ++++++++++------- src/content/cre/llms-full-ts.txt | 402 +++++++++++------- src/content/cre/reference/cli/utilities.mdx | 7 +- .../reference/project-configuration-go.mdx | 39 +- .../reference/project-configuration-ts.mdx | 43 +- .../cre/reference/sdk/evm-client-go.mdx | 47 +- .../cre/reference/sdk/evm-client-ts.mdx | 50 ++- src/content/cre/reference/sdk/overview-go.mdx | 11 +- src/content/cre/reference/sdk/overview-ts.mdx | 7 +- src/content/cre/release-notes.mdx | 6 +- src/content/cre/supported-networks-go.mdx | 58 +++ src/content/cre/supported-networks-ts.mdx | 58 +++ src/features/redirects/redirects.json | 15 + 20 files changed, 864 insertions(+), 406 deletions(-) rename src/content/cre/guides/workflow/using-evm-client/{supported-networks-go.mdx => forwarder-directory-go.mdx} (81%) rename src/content/cre/guides/workflow/using-evm-client/{supported-networks-ts.mdx => forwarder-directory-ts.mdx} (81%) create mode 100644 src/content/cre/supported-networks-go.mdx create mode 100644 src/content/cre/supported-networks-ts.mdx diff --git a/public/changelog.json b/public/changelog.json index 48304af305f..49696ef2829 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -793,7 +793,7 @@ { "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\nSee the [Supported Networks](https://docs.chain.link/cre/guides/workflow/using-evm-client/supported-networks) page for chain names and configuration details.", + "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" @@ -830,7 +830,7 @@ { "category": "integration", "date": "2026-01-26", - "description": "CRE now supports ZKSync Era mainnet and testnet for workflow simulation and production deployment. See the [Supported Networks](https://docs.chain.link/cre/guides/workflow/using-evm-client/supported-networks) page for chain names and forwarder addresses.", + "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" diff --git a/src/components/QuickLinks/data/productChainLinks.ts b/src/components/QuickLinks/data/productChainLinks.ts index 23bc2cf257f..6ce23f4b831 100644 --- a/src/components/QuickLinks/data/productChainLinks.ts +++ b/src/components/QuickLinks/data/productChainLinks.ts @@ -109,14 +109,14 @@ export const productChainLinks: ProductChainLinks = { learnMoreLink: "cre", logo: creLogo, chains: { - arbitrum: "/cre/guides/workflow/using-evm-client/supported-networks", - avalanche: "/cre/guides/workflow/using-evm-client/supported-networks", - base: "/cre/guides/workflow/using-evm-client/supported-networks", - "bnb-chain": "/cre/guides/workflow/using-evm-client/supported-networks", - ethereum: "/cre/guides/workflow/using-evm-client/supported-networks", - optimism: "/cre/guides/workflow/using-evm-client/supported-networks", - polygon: "/cre/guides/workflow/using-evm-client/supported-networks", - zksync: "/cre/guides/workflow/using-evm-client/supported-networks", + arbitrum: "/cre/supported-networks", + avalanche: "/cre/supported-networks", + base: "/cre/supported-networks", + "bnb-chain": "/cre/supported-networks", + ethereum: "/cre/supported-networks", + optimism: "/cre/supported-networks", + polygon: "/cre/supported-networks", + zksync: "/cre/supported-networks", }, }, "Data Feeds": { diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index 689af0cbcdf..e2abce1aba2 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -81,6 +81,11 @@ export const SIDEBAR: Partial> = { title: "Service Quotas", url: "cre/service-quotas", }, + { + title: "Supported Networks", + url: "cre/supported-networks", + highlightAsCurrent: ["cre/supported-networks-ts", "cre/supported-networks-go"], + }, { title: "Support & Feedback", url: "cre/support-feedback", @@ -248,11 +253,11 @@ export const SIDEBAR: Partial> = { ], }, { - title: "Supported Networks", - url: "cre/guides/workflow/using-evm-client/supported-networks", + title: "Forwarder Directory", + url: "cre/guides/workflow/using-evm-client/forwarder-directory", highlightAsCurrent: [ - "cre/guides/workflow/using-evm-client/supported-networks-ts", - "cre/guides/workflow/using-evm-client/supported-networks-go", + "cre/guides/workflow/using-evm-client/forwarder-directory-ts", + "cre/guides/workflow/using-evm-client/forwarder-directory-go", ], }, ], diff --git a/src/content/cre/guides/operations/updating-deployed-workflows.mdx b/src/content/cre/guides/operations/updating-deployed-workflows.mdx index 4e3592893f3..d3ce1a4b47c 100644 --- a/src/content/cre/guides/operations/updating-deployed-workflows.mdx +++ b/src/content/cre/guides/operations/updating-deployed-workflows.mdx @@ -12,6 +12,11 @@ import { Aside } from "@components" When you update a deployed workflow, you redeploy it with the same workflow name. The new deployment replaces the previous version in the Workflow Registry contract. Currently, CRE does not maintain version history—each deployment overwrites the previous one. +{/* prettier-ignore */} + + ## Prerequisites Before updating a deployed workflow, ensure you have: diff --git a/src/content/cre/guides/workflow/using-evm-client/supported-networks-go.mdx b/src/content/cre/guides/workflow/using-evm-client/forwarder-directory-go.mdx similarity index 81% rename from src/content/cre/guides/workflow/using-evm-client/supported-networks-go.mdx rename to src/content/cre/guides/workflow/using-evm-client/forwarder-directory-go.mdx index b83bc5dd0bc..32ec87b8a48 100644 --- a/src/content/cre/guides/workflow/using-evm-client/supported-networks-go.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/forwarder-directory-go.mdx @@ -1,18 +1,22 @@ --- section: cre -title: "Supported Networks" +title: "Forwarder Directory" date: Last Modified sdkLang: "go" -pageId: "evm-supported-networks" +pageId: "evm-forwarder-directory" metadata: - description: "Learn which EVM networks are supported for read and write operations in CRE workflows." + description: "Find forwarder contract addresses for CRE workflows on supported EVM networks." datePublished: "2025-11-04" - lastModified: "2026-01-29" + lastModified: "2026-02-03" --- import { Aside, CopyText } from "@components" -This page lists the EVM-compatible networks supported by CRE workflows, along with their chain names (for configuration) and forwarder contract addresses (for consumer contract validation). + + +This page lists forwarder contract addresses for CRE workflows, organized by network. ## How to Use This Page @@ -98,13 +102,20 @@ These `KeystoneForwarder` addresses are used by deployed workflows. Use these ad ### Testnets -| Network | Chain Name | Forwarder Address | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------ | -| Arbitrum Sepolia | | | -| Avalanche Fuji | | | -| Base Sepolia | | | -| BNB Chain Testnet | | | -| Ethereum Sepolia | | | -| OP Sepolia | | | -| Polygon Amoy | | | -| ZKSync Era Sepolia | | | +| Network | Chain Name | Forwarder Address | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------------ | +| Apechain Curtis | | | +| Arbitrum Sepolia | | | +| Avalanche Fuji | | | +| Base Sepolia | | | +| BNB Chain Testnet | | | +| Ethereum Sepolia | | | +| Hyperliquid Testnet | | | +| Ink Sepolia | | | +| Jovay Testnet | | | +| Linea Sepolia | | | +| OP Sepolia | | | +| Plasma Testnet | | | +| Polygon Amoy | | | +| World Chain Sepolia | | | +| ZKSync Era Sepolia | | | diff --git a/src/content/cre/guides/workflow/using-evm-client/supported-networks-ts.mdx b/src/content/cre/guides/workflow/using-evm-client/forwarder-directory-ts.mdx similarity index 81% rename from src/content/cre/guides/workflow/using-evm-client/supported-networks-ts.mdx rename to src/content/cre/guides/workflow/using-evm-client/forwarder-directory-ts.mdx index 73dbe1230fd..4baf0ff9d4f 100644 --- a/src/content/cre/guides/workflow/using-evm-client/supported-networks-ts.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/forwarder-directory-ts.mdx @@ -1,18 +1,22 @@ --- section: cre -title: "Supported Networks" +title: "Forwarder Directory" date: Last Modified sdkLang: "ts" -pageId: "evm-supported-networks" +pageId: "evm-forwarder-directory" metadata: - description: "Learn which EVM networks are supported for read and write operations in CRE workflows." + description: "Find forwarder contract addresses for CRE workflows on supported EVM networks." datePublished: "2025-11-04" - lastModified: "2026-01-29" + lastModified: "2026-02-03" --- import { Aside, CopyText } from "@components" -This page lists the EVM-compatible networks supported by CRE workflows, along with their chain names (for configuration) and forwarder contract addresses (for consumer contract validation). + + +This page lists forwarder contract addresses for CRE workflows, organized by network. ## How to Use This Page @@ -98,13 +102,20 @@ These `KeystoneForwarder` addresses are used by deployed workflows. Use these ad ### Testnets -| Network | Chain Name | Forwarder Address | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------ | -| Arbitrum Sepolia | | | -| Avalanche Fuji | | | -| Base Sepolia | | | -| BSC Testnet | | | -| Ethereum Sepolia | | | -| OP Sepolia | | | -| Polygon Amoy | | | -| ZKSync Era Sepolia | | | +| Network | Chain Name | Forwarder Address | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------------ | +| Apechain Curtis | | | +| Arbitrum Sepolia | | | +| Avalanche Fuji | | | +| Base Sepolia | | | +| BSC Testnet | | | +| Ethereum Sepolia | | | +| Hyperliquid Testnet | | | +| Ink Sepolia | | | +| Jovay Testnet | | | +| Linea Sepolia | | | +| OP Sepolia | | | +| Plasma Testnet | | | +| Polygon Amoy | | | +| World Chain Sepolia | | | +| ZKSync Era Sepolia | | | diff --git a/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx b/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx index f58184e286f..f05c3f441e2 100644 --- a/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts.mdx @@ -5,7 +5,7 @@ date: Last Modified metadata: description: "Build smart contracts that receive CRE data: learn to implement the IReceiver interface and safely handle verified workflow reports." datePublished: "2025-11-04" - lastModified: "2025-11-20" + lastModified: "2026-02-03" --- import { Aside, ClickToZoom, CodeSample } from "@components" @@ -87,7 +87,7 @@ The forwarder address is configured at deployment via the constructor and provid {/* prettier-ignore */} **Configuration examples:** @@ -181,11 +181,11 @@ address mockForwarder = 0x15fC6ae953E024d975e77382eEeC56A9101f9F88; // Ethereum MyConsumer myConsumer = new MyConsumer(mockForwarder); ``` -Find Mock Forwarder addresses for all networks in the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page. +Find Mock Forwarder addresses for all networks in the [Forwarder Directory](/cre/guides/workflow/using-evm-client/forwarder-directory) page. {/* prettier-ignore */} ### Metadata-based validation @@ -484,7 +484,7 @@ updateReservesProxy.setExpectedWorkflowId(0xYourWorkflowId...); {/* prettier-ignore */} #### How it Works @@ -557,7 +557,7 @@ The forwarder address provides baseline security, but you can add additional val ### Best practices -1. **Always deploy with a valid forwarder address** - The constructor requires this for security. Use `MockForwarder` for simulation, `KeystoneForwarder` for production. Forwarder addresses are available in the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page. +1. **Always deploy with a valid forwarder address** - The constructor requires this for security. Use `MockForwarder` for simulation, `KeystoneForwarder` for production. Forwarder addresses are available in the [Forwarder Directory](/cre/guides/workflow/using-evm-client/forwarder-directory) page. 1. **Add additional validation for production**: - **Single workflow**: Use `setExpectedWorkflowId()` to restrict to one specific workflow (highest security) - **Multiple workflows from same owner**: Use `setExpectedAuthor()` to restrict to workflows you own diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index a6c8f2c77dc..130e5ff44f4 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -442,7 +442,7 @@ To help us assist you faster, please include: # Release Notes Source: https://docs.chain.link/cre/release-notes -Last Updated: 2026-01-29 +Last Updated: 2026-02-03 This page provides detailed release notes for CRE. It includes information on new features, significant changes, and known limitations. @@ -459,7 +459,7 @@ CRE now supports additional testnets for workflow simulation and production depl - Plasma Testnet - World Chain Sepolia -See the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page for chain names and forwarder addresses. +**Required versions:** CLI v1.0.7+, Go SDK v1.1.4+, TS SDK v1.0.7+ ## CLI v1.0.7 - January 29, 2026 @@ -490,7 +490,7 @@ For details on using time in workflows, see [Time in CRE](/cre/concepts/time-in- CRE now supports **ZKSync Era mainnet and testnet** for workflow simulation and production deployment. You can now build and test workflows that interact with ZKSync Era chains. -See the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page for chain names and forwarder addresses. +**Required versions:** CLI v1.0.6+, Go SDK v1.1.3+ (mainnet) / v1.1.2+ (testnet), TS SDK v1.0.7+ ## TS SDK v1.0.4 - January 26, 2026 @@ -2471,7 +2471,7 @@ Now that you know how to generate bindings, you can use them to [read data from] # Building Consumer Contracts Source: https://docs.chain.link/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts -Last Updated: 2025-11-20 +Last Updated: 2026-02-03 When your workflow [writes data to the blockchain](/cre/guides/workflow/using-evm-client/onchain-write), it doesn't call your contract directly. Instead, it submits a signed report to a Chainlink `KeystoneForwarder` contract, which then calls your contract. @@ -2835,7 +2835,7 @@ The forwarder address is configured at deployment via the constructor and provid **Configuration examples:** @@ -2930,11 +2930,11 @@ address mockForwarder = 0x15fC6ae953E024d975e77382eEeC56A9101f9F88; // Ethereum MyConsumer myConsumer = new MyConsumer(mockForwarder); ``` -Find Mock Forwarder addresses for all networks in the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page. +Find Mock Forwarder addresses for all networks in the [Forwarder Directory](/cre/guides/workflow/using-evm-client/forwarder-directory) page. ### Metadata-based validation @@ -3233,7 +3233,7 @@ updateReservesProxy.setExpectedWorkflowId(0xYourWorkflowId...); #### How it Works @@ -3304,7 +3304,7 @@ The forwarder address provides baseline security, but you can add additional val ### Best practices -1. **Always deploy with a valid forwarder address** - The constructor requires this for security. Use `MockForwarder` for simulation, `KeystoneForwarder` for production. Forwarder addresses are available in the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page. +1. **Always deploy with a valid forwarder address** - The constructor requires this for security. Use `MockForwarder` for simulation, `KeystoneForwarder` for production. Forwarder addresses are available in the [Forwarder Directory](/cre/guides/workflow/using-evm-client/forwarder-directory) page. 2. **Add additional validation for production**: - **Single workflow**: Use `setExpectedWorkflowId()` to restrict to one specific workflow (highest security) - **Multiple workflows from same owner**: Use `setExpectedAuthor()` to restrict to workflows you own @@ -5644,6 +5644,11 @@ Last Updated: 2026-01-23 When you update a deployed workflow, you redeploy it with the same workflow name. The new deployment replaces the previous version in the Workflow Registry contract. Currently, CRE does not maintain version history—each deployment overwrites the previous one. + + + ## Prerequisites Before updating a deployed workflow, ensure you have: @@ -8599,7 +8604,7 @@ For details, see [Using Multi-sig Wallets](/cre/guides/operations/using-multisig # Utility Commands Source: https://docs.chain.link/cre/reference/cli/utilities -Last Updated: 2026-01-29 +Last Updated: 2026-02-03 Utility commands provide helpful information and troubleshooting capabilities. @@ -8631,6 +8636,11 @@ cre update The CLI automatically checks if your version is outdated when you run certain commands. If a newer version is available, you'll see a warning message encouraging you to run `cre update`. + + + ## `cre version` Prints the current version of the CRE CLI. @@ -10580,6 +10590,120 @@ func main() { --- +# Forwarder Directory +Source: https://docs.chain.link/cre/guides/workflow/using-evm-client/forwarder-directory-go +Last Updated: 2026-02-03 + + + +This page lists forwarder contract addresses for CRE workflows, organized by network. + +## How to Use This Page + +This reference provides three key pieces of information for each network: + +1. **Network Name**: The human-readable network identifier +2. **Chain Name**: The value to use in your [`project.yaml`](/cre/reference/project-configuration-go#31-global-configuration-projectyaml) configuration and [EVM Client code](/cre/reference/sdk/evm-client-go#chain-selectors) +3. **Forwarder Address**: The contract address for optional consumer contract validation + +## Understanding Forwarder Addresses + +Forwarder addresses identify the trusted Chainlink Forwarder contract that delivers verified workflow reports to your consumer contract. Your workflow code does not interact with forwarders directly—the EVM capability handles report delivery automatically. Learn more: [Onchain Write Overview](/cre/guides/workflow/using-evm-client/onchain-write/overview-go). + +**Using the [ReceiverTemplate](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts#3-using-receivertemplate) (recommended)**: If you use the [`ReceiverTemplate`](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts#receivertemplate), the forwarder address is **required** in the constructor. This ensures your contract only accepts reports from the trusted Chainlink Forwarder. + +**Custom implementations**: If you implement the `IReceiver` interface directly without using `ReceiverTemplate`, you control your own security checks. See [Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts) for details. + +### Simulation vs Production Addresses + +**Important**: Forwarder contracts differ between local simulation and production: + +| Environment | Contract Type | Section | +| ---------------- | ----------------------- | ----------------------------------------------- | +| Local simulation | `MockKeystoneForwarder` | [Simulation Forwarders](#simulation-forwarders) | +| Production | `KeystoneForwarder` | [Production Forwarders](#production-forwarders) | + +If you configure forwarder validation in your consumer contract, **remember to update the forwarder address** when deploying to production. Learn more: [Working with Simulation](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts#4-working-with-simulation). + +## Simulation Forwarders + +These `MockKeystoneForwarder` addresses are used when running `cre workflow simulate` with the `--broadcast` flag. Use these addresses **only** during local development and testing. + +### Simulation Mainnets + +| Network | Chain Name | Mock Forwarder Address | +| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------ | +| Arbitrum One | ethereum-mainnet-arbitrum-1 | 0xd770499057619c9a76205fd4168161cf94abc532 | +| Avalanche | avalanche-mainnet | 0xdc21e279934ff6721cadfdd112dafb3261f09a2c | +| Base | ethereum-mainnet-base-1 | 0x5e342a8438b4f5d39e72875fcee6f76b39cce548 | +| BNB Chain | binance_smart_chain-mainnet | 0x6f3239bbb26e98961e1115aba83f8a282e5508c8 | +| Ethereum Mainnet | ethereum-mainnet | 0xa3d1ad4ac559a6575a114998affb2fb2ec97a7d9 | +| OP Mainnet | ethereum-mainnet-optimism-1 | 0x9119a1501550ed94a3f2794038ed9258337afa18 | +| Polygon | polygon-mainnet | 0xf458d621885e29a5003ea9bbba5280d54e19b1ce | +| ZKSync Era | ethereum-mainnet-zksync-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | + +### Simulation Testnets + +| Network | Chain Name | Mock Forwarder Address | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | ------------------------------------------ | +| Apechain Curtis | apechain-testnet-curtis | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| Arc Testnet | arc-testnet | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| Arbitrum Sepolia | ethereum-testnet-sepolia-arbitrum-1 | 0xd41263567ddfead91504199b8c6c87371e83ca5d | +| Avalanche Fuji | avalanche-testnet-fuji | 0x2e7371a5d032489e4f60216d8d898a4c10805963 | +| Base Sepolia | ethereum-testnet-sepolia-base-1 | 0x82300bd7c3958625581cc2f77bc6464dcecdf3e5 | +| BNB Chain Testnet | binance_smart_chain-testnet | 0xa238e42cb8782808dbb2f37e19859244ec4779b0 | +| Ethereum Sepolia | ethereum-testnet-sepolia | 0x15fC6ae953E024d975e77382eEeC56A9101f9F88 | +| Hyperliquid Testnet | hyperliquid-testnet | 0xB27fA1c28288c50542527F64BCda22C9FbAc24CB | +| Ink Sepolia | ink-testnet-sepolia | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| Jovay Testnet | jovay-testnet | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| Linea Sepolia | ethereum-testnet-sepolia-linea-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| OP Sepolia | ethereum-testnet-sepolia-optimism-1 | 0xa2888380dff3704a8ab6d1cd1a8f69c15fea5ee3 | +| Plasma Testnet | plasma-testnet | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| Polygon Amoy | polygon-testnet-amoy | 0x3675a5eb2286a3f87e8278fc66edf458a2e3bb74 | +| World Chain Sepolia | ethereum-testnet-sepolia-worldchain-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| ZKSync Era Sepolia | ethereum-testnet-sepolia-zksync-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | + +## Production Forwarders + +These `KeystoneForwarder` addresses are used by deployed workflows. Use these addresses when configuring your consumer contracts for production. + +### Mainnets + +| Network | Chain Name | Forwarder Address | +| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------ | +| Arbitrum One | ethereum-mainnet-arbitrum-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | +| Avalanche | avalanche-mainnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Base | ethereum-mainnet-base-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | +| BNB Chain | binance_smart_chain-mainnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Ethereum Mainnet | ethereum-mainnet | 0x0b93082D9b3C7C97fAcd250082899BAcf3af3885 | +| OP Mainnet | ethereum-mainnet-optimism-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | +| Polygon | polygon-mainnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| ZKSync Era | ethereum-mainnet-zksync-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | + +### Testnets + +| Network | Chain Name | Forwarder Address | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | ------------------------------------------ | +| Apechain Curtis | apechain-testnet-curtis | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Arbitrum Sepolia | ethereum-testnet-sepolia-arbitrum-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Avalanche Fuji | avalanche-testnet-fuji | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Base Sepolia | ethereum-testnet-sepolia-base-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | +| BNB Chain Testnet | binance_smart_chain-testnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Ethereum Sepolia | ethereum-testnet-sepolia | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | +| Hyperliquid Testnet | hyperliquid-testnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Ink Sepolia | ink-testnet-sepolia | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Jovay Testnet | jovay-testnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Linea Sepolia | ethereum-testnet-sepolia-linea-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| OP Sepolia | ethereum-testnet-sepolia-optimism-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Plasma Testnet | plasma-testnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Polygon Amoy | polygon-testnet-amoy | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| World Chain Sepolia | ethereum-testnet-sepolia-worldchain-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| ZKSync Era Sepolia | ethereum-testnet-sepolia-zksync-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | + +--- + # Onchain Read Source: https://docs.chain.link/cre/guides/workflow/using-evm-client/onchain-read-go Last Updated: 2025-12-10 @@ -11108,109 +11232,6 @@ This approach gives you IDE autocompletion, compile-time type checking, and elim --- -# Supported Networks -Source: https://docs.chain.link/cre/guides/workflow/using-evm-client/supported-networks-go -Last Updated: 2026-01-29 - -This page lists the EVM-compatible networks supported by CRE workflows, along with their chain names (for configuration) and forwarder contract addresses (for consumer contract validation). - -## How to Use This Page - -This reference provides three key pieces of information for each network: - -1. **Network Name**: The human-readable network identifier -2. **Chain Name**: The value to use in your [`project.yaml`](/cre/reference/project-configuration-go#31-global-configuration-projectyaml) configuration and [EVM Client code](/cre/reference/sdk/evm-client-go#chain-selectors) -3. **Forwarder Address**: The contract address for optional consumer contract validation - -## Understanding Forwarder Addresses - -Forwarder addresses identify the trusted Chainlink Forwarder contract that delivers verified workflow reports to your consumer contract. Your workflow code does not interact with forwarders directly—the EVM capability handles report delivery automatically. Learn more: [Onchain Write Overview](/cre/guides/workflow/using-evm-client/onchain-write/overview-go). - -**Using the [ReceiverTemplate](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts#3-using-receivertemplate) (recommended)**: If you use the [`ReceiverTemplate`](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts#receivertemplate), the forwarder address is **required** in the constructor. This ensures your contract only accepts reports from the trusted Chainlink Forwarder. - -**Custom implementations**: If you implement the `IReceiver` interface directly without using `ReceiverTemplate`, you control your own security checks. See [Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts) for details. - -### Simulation vs Production Addresses - -**Important**: Forwarder contracts differ between local simulation and production: - -| Environment | Contract Type | Section | -| ---------------- | ----------------------- | ----------------------------------------------- | -| Local simulation | `MockKeystoneForwarder` | [Simulation Forwarders](#simulation-forwarders) | -| Production | `KeystoneForwarder` | [Production Forwarders](#production-forwarders) | - -If you configure forwarder validation in your consumer contract, **remember to update the forwarder address** when deploying to production. Learn more: [Working with Simulation](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts#4-working-with-simulation). - -## Simulation Forwarders - -These `MockKeystoneForwarder` addresses are used when running `cre workflow simulate` with the `--broadcast` flag. Use these addresses **only** during local development and testing. - -### Simulation Mainnets - -| Network | Chain Name | Mock Forwarder Address | -| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------ | -| Arbitrum One | ethereum-mainnet-arbitrum-1 | 0xd770499057619c9a76205fd4168161cf94abc532 | -| Avalanche | avalanche-mainnet | 0xdc21e279934ff6721cadfdd112dafb3261f09a2c | -| Base | ethereum-mainnet-base-1 | 0x5e342a8438b4f5d39e72875fcee6f76b39cce548 | -| BNB Chain | binance_smart_chain-mainnet | 0x6f3239bbb26e98961e1115aba83f8a282e5508c8 | -| Ethereum Mainnet | ethereum-mainnet | 0xa3d1ad4ac559a6575a114998affb2fb2ec97a7d9 | -| OP Mainnet | ethereum-mainnet-optimism-1 | 0x9119a1501550ed94a3f2794038ed9258337afa18 | -| Polygon | polygon-mainnet | 0xf458d621885e29a5003ea9bbba5280d54e19b1ce | -| ZKSync Era | ethereum-mainnet-zksync-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | - -### Simulation Testnets - -| Network | Chain Name | Mock Forwarder Address | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | ------------------------------------------ | -| Apechain Curtis | apechain-testnet-curtis | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| Arc Testnet | arc-testnet | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| Arbitrum Sepolia | ethereum-testnet-sepolia-arbitrum-1 | 0xd41263567ddfead91504199b8c6c87371e83ca5d | -| Avalanche Fuji | avalanche-testnet-fuji | 0x2e7371a5d032489e4f60216d8d898a4c10805963 | -| Base Sepolia | ethereum-testnet-sepolia-base-1 | 0x82300bd7c3958625581cc2f77bc6464dcecdf3e5 | -| BNB Chain Testnet | binance_smart_chain-testnet | 0xa238e42cb8782808dbb2f37e19859244ec4779b0 | -| Ethereum Sepolia | ethereum-testnet-sepolia | 0x15fC6ae953E024d975e77382eEeC56A9101f9F88 | -| Hyperliquid Testnet | hyperliquid-testnet | 0xB27fA1c28288c50542527F64BCda22C9FbAc24CB | -| Ink Sepolia | ink-testnet-sepolia | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| Jovay Testnet | jovay-testnet | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| Linea Sepolia | ethereum-testnet-sepolia-linea-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| OP Sepolia | ethereum-testnet-sepolia-optimism-1 | 0xa2888380dff3704a8ab6d1cd1a8f69c15fea5ee3 | -| Plasma Testnet | plasma-testnet | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| Polygon Amoy | polygon-testnet-amoy | 0x3675a5eb2286a3f87e8278fc66edf458a2e3bb74 | -| World Chain Sepolia | ethereum-testnet-sepolia-worldchain-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| ZKSync Era Sepolia | ethereum-testnet-sepolia-zksync-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | - -## Production Forwarders - -These `KeystoneForwarder` addresses are used by deployed workflows. Use these addresses when configuring your consumer contracts for production. - -### Mainnets - -| Network | Chain Name | Forwarder Address | -| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------ | -| Arbitrum One | ethereum-mainnet-arbitrum-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | -| Avalanche | avalanche-mainnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| Base | ethereum-mainnet-base-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | -| BNB Chain | binance_smart_chain-mainnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| Ethereum Mainnet | ethereum-mainnet | 0x0b93082D9b3C7C97fAcd250082899BAcf3af3885 | -| OP Mainnet | ethereum-mainnet-optimism-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | -| Polygon | polygon-mainnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| ZKSync Era | ethereum-mainnet-zksync-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | - -### Testnets - -| Network | Chain Name | Forwarder Address | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | ------------------------------------------ | -| Arbitrum Sepolia | ethereum-testnet-sepolia-arbitrum-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| Avalanche Fuji | avalanche-testnet-fuji | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| Base Sepolia | ethereum-testnet-sepolia-base-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | -| BNB Chain Testnet | binance_smart_chain-testnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| Ethereum Sepolia | ethereum-testnet-sepolia | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | -| OP Sepolia | ethereum-testnet-sepolia-optimism-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| Polygon Amoy | polygon-testnet-amoy | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| ZKSync Era Sepolia | ethereum-testnet-sepolia-zksync-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | - ---- - # Making GET Requests Source: https://docs.chain.link/cre/guides/workflow/using-http-client/get-request-go Last Updated: 2025-12-16 @@ -13443,7 +13464,7 @@ The typical project setup flow for Go workflows: # Project Configuration Source: https://docs.chain.link/cre/reference/project-configuration-go -Last Updated: 2025-11-04 +Last Updated: 2026-02-03 This page explains how to manage configuration within Chainlink Runtime Environment (CRE) projects. It covers the standard project structure, the roles and usage of the configuration files (`project.yaml` and `workflow.yaml`), and the concept of **targets** for handling environment-specific settings. @@ -13527,9 +13548,9 @@ production-settings: ``` #### Configuration fields @@ -13659,6 +13680,37 @@ When you run a CLI command with a target, e.g., `--target staging-settings`: `workflow.yaml`. A mismatch causes the CLI to abort with a clear error message. +## 5. Updating dependencies + +When new networks or SDK features are released, you may need to update your project dependencies. + +### Updating the CLI + +Run [cre update](/cre/reference/cli/utilities#cre-update) to download and install the latest CLI version: + +```bash +cre update +``` + +New projects created with an updated CLI automatically use compatible SDK versions. + +### Updating the SDK (existing projects) + +If you created your project with an older CLI version, update the SDK in your `go.mod`: + +```bash +go get github.com/smartcontractkit/cre-sdk-go@v1.1.4 +``` + +Then run `go mod tidy` to clean up dependencies. + +### Checking your versions + +- **CLI version:** Run `cre version` +- **SDK version:** Check `go.mod` for the `cre-sdk-go` dependency version + +For a list of which versions support which networks, see [Supported Networks](/cre/supported-networks). + --- # SDK Reference: Consensus & Aggregation @@ -14036,7 +14088,7 @@ func onTrigger(config *Config, runtime cre.Runtime, ...) (string, error) { # SDK Reference: EVM Client Source: https://docs.chain.link/cre/reference/sdk/evm-client-go -Last Updated: 2025-11-04 +Last Updated: 2026-02-03 This page provides a reference for the `evm.Client`, the low-level tool for all interactions with EVM-compatible blockchains. The client includes a comprehensive set of read, write, and utility methods for building chain-aware workflows. @@ -14287,8 +14339,7 @@ A **chain selector** is a unique identifier for a blockchain network used throug @@ -14310,22 +14361,32 @@ A **chain selector** is a unique identifier for a blockchain network used throug This table shows all three equivalent formats for each supported chain: -| Chain | String Name | Go Constant | Numeric ID | -| ----------------- | ----------------------------------- | ----------------------------------- | -------------------- | -| Arbitrum One | ethereum-mainnet-arbitrum-1 | evm.EthereumMainnetArbitrum1 | 4949039107694359620 | -| Arbitrum Sepolia | ethereum-testnet-sepolia-arbitrum-1 | evm.EthereumTestnetSepoliaArbitrum1 | 3478487238524512106 | -| Avalanche Mainnet | avalanche-mainnet | evm.AvalancheMainnet | 6433500567565415381 | -| Avalanche Fuji | avalanche-testnet-fuji | evm.AvalancheTestnetFuji | 14767482510784806043 | -| Base Mainnet | ethereum-mainnet-base-1 | evm.EthereumMainnetBase1 | 15971525489660198786 | -| Base Sepolia | ethereum-testnet-sepolia-base-1 | evm.EthereumTestnetSepoliaBase1 | 10344971235874465080 | -| BNB Chain Mainnet | binance_smart_chain-mainnet | evm.BinanceSmartChainMainnet | 11344663589394136015 | -| BNB Chain Testnet | binance_smart_chain-testnet | evm.BinanceSmartChainTestnet | 5142893604156789321 | -| Ethereum Mainnet | ethereum-mainnet | evm.EthereumMainnet | 5009297550715157269 | -| Ethereum Sepolia | ethereum-testnet-sepolia | evm.EthereumTestnetSepolia | 16015286601757825753 | -| OP Mainnet | ethereum-mainnet-optimism-1 | evm.EthereumMainnetOptimism1 | 3734403246176062136 | -| OP Sepolia | ethereum-testnet-sepolia-optimism-1 | evm.EthereumTestnetSepoliaOptimism1 | 5224473277236331295 | -| Polygon Mainnet | polygon-mainnet | evm.PolygonMainnet | 4051577828743386545 | -| Polygon Amoy | polygon-testnet-amoy | evm.PolygonTestnetAmoy | 16281711391670634445 | +| Chain | String Name | Go Constant | Numeric ID | +| ------------------- | ------------------------------------- | ------------------------------------- | -------------------- | +| Apechain Curtis | apechain-testnet-curtis | evm.ApechainTestnetCurtis | 9900119385908781505 | +| Arc Testnet | arc-testnet | evm.ArcTestnet | 3034092155422581607 | +| Arbitrum One | ethereum-mainnet-arbitrum-1 | evm.EthereumMainnetArbitrum1 | 4949039107694359620 | +| Arbitrum Sepolia | ethereum-testnet-sepolia-arbitrum-1 | evm.EthereumTestnetSepoliaArbitrum1 | 3478487238524512106 | +| Avalanche Mainnet | avalanche-mainnet | evm.AvalancheMainnet | 6433500567565415381 | +| Avalanche Fuji | avalanche-testnet-fuji | evm.AvalancheTestnetFuji | 14767482510784806043 | +| Base Mainnet | ethereum-mainnet-base-1 | evm.EthereumMainnetBase1 | 15971525489660198786 | +| Base Sepolia | ethereum-testnet-sepolia-base-1 | evm.EthereumTestnetSepoliaBase1 | 10344971235874465080 | +| BNB Chain Mainnet | binance_smart_chain-mainnet | evm.BinanceSmartChainMainnet | 11344663589394136015 | +| BNB Chain Testnet | binance_smart_chain-testnet | evm.BinanceSmartChainTestnet | 13264668187771770619 | +| Ethereum Mainnet | ethereum-mainnet | evm.EthereumMainnet | 5009297550715157269 | +| Ethereum Sepolia | ethereum-testnet-sepolia | evm.EthereumTestnetSepolia | 16015286601757825753 | +| Hyperliquid Testnet | hyperliquid-testnet | evm.HyperliquidTestnet | 4286062357653186312 | +| Ink Sepolia | ink-testnet-sepolia | evm.InkTestnetSepolia | 9763904284804119144 | +| Jovay Testnet | jovay-testnet | evm.JovayTestnet | 945045181441419236 | +| Linea Sepolia | ethereum-testnet-sepolia-linea-1 | evm.EthereumTestnetSepoliaLinea1 | 5719461335882077547 | +| OP Mainnet | ethereum-mainnet-optimism-1 | evm.EthereumMainnetOptimism1 | 3734403246176062136 | +| OP Sepolia | ethereum-testnet-sepolia-optimism-1 | evm.EthereumTestnetSepoliaOptimism1 | 5224473277236331295 | +| Plasma Testnet | plasma-testnet | evm.PlasmaTestnet | 3967220077692964309 | +| Polygon Mainnet | polygon-mainnet | evm.PolygonMainnet | 4051577828743386545 | +| Polygon Amoy | polygon-testnet-amoy | evm.PolygonTestnetAmoy | 16281711391670634445 | +| World Chain Sepolia | ethereum-testnet-sepolia-worldchain-1 | evm.EthereumTestnetSepoliaWorldchain1 | 5299555114858065850 | +| ZKSync Era | ethereum-mainnet-zksync-1 | evm.EthereumMainnetZksync1 | 1562403441176082196 | +| ZKSync Era Sepolia | ethereum-testnet-sepolia-zksync-1 | evm.EthereumTestnetSepoliaZksync1 | 6898391096552792247 | ### Usage examples @@ -14803,15 +14864,6 @@ For complete examples of including signatures in different formats (body, header Source: https://docs.chain.link/cre/reference/sdk/overview-go Last Updated: 2025-11-04 - - This section provides a detailed technical reference for the public interfaces of the CRE Go SDK. Use this reference for quick lookups of specific functions, types, and method signatures. ## How to read this section @@ -15057,6 +15109,59 @@ This section provides a reference for the built-in trigger capabilities of the C --- +# Supported Networks +Source: https://docs.chain.link/cre/supported-networks-go +Last Updated: 2026-02-03 + +This page lists all EVM-compatible networks supported by CRE workflows, along with the minimum CLI and SDK versions required for each network. + +## Version Requirements + +Network support depends on your CLI and SDK versions. The tables below show the minimum versions required for each network. + +- **New projects:** Run `cre update` to get the latest CLI, which includes compatible SDK versions. +- **Existing projects:** You may need to update your SDK dependency. See [Updating Dependencies](/cre/reference/project-configuration-go#5-updating-dependencies) for instructions. + +## Mainnets + +| Network | CLI | Go SDK | TS SDK | +| ------------ | ------ | ------ | ------ | +| Arbitrum One | v1.0.0 | v1.0.0 | v1.0.1 | +| Avalanche | v1.0.0 | v1.0.0 | v1.0.1 | +| Base | v1.0.0 | v1.0.0 | v1.0.1 | +| BNB Chain | v1.0.0 | v1.0.0 | v1.0.1 | +| Ethereum | v1.0.0 | v1.0.0 | v1.0.1 | +| OP Mainnet | v1.0.0 | v1.0.0 | v1.0.1 | +| Polygon | v1.0.0 | v1.0.0 | v1.0.1 | +| ZKSync Era | v1.0.6 | v1.1.3 | v1.0.7 | + +## Testnets + +| Network | CLI | Go SDK | TS SDK | +| ------------------- | ------ | ------ | ------ | +| Apechain Curtis | v1.0.7 | v1.1.4 | v1.0.7 | +| Arc Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Arbitrum Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| Avalanche Fuji | v1.0.0 | v1.0.0 | v1.0.1 | +| Base Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| BNB Chain Testnet | v1.0.0 | v1.0.0 | v1.0.1 | +| Ethereum Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| Hyperliquid Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Ink Sepolia | v1.0.7 | v1.1.4 | v1.0.7 | +| Jovay Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Linea Sepolia | v1.0.7 | v1.1.4 | v1.0.7 | +| OP Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| Plasma Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Polygon Amoy | v1.0.0 | v1.0.0 | v1.0.1 | +| World Chain Sepolia | v1.0.7 | v1.1.4 | v1.0.7 | +| ZKSync Era Sepolia | v1.0.6 | v1.1.2 | v1.0.7 | + +## Forwarder Addresses + +For forwarder contract addresses and chain names, see the [Forwarder Directory](/cre/guides/workflow/using-evm-client/forwarder-directory). Forwarder addresses are used when building consumer contracts that receive workflow reports onchain. Learn more about [Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write/overview). + +--- + # Running a Demo Workflow Source: https://docs.chain.link/cre/templates/running-demo-workflow-go Last Updated: 2025-11-04 diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index ccfba396674..c4de67a4524 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -442,7 +442,7 @@ To help us assist you faster, please include: # Release Notes Source: https://docs.chain.link/cre/release-notes -Last Updated: 2026-01-29 +Last Updated: 2026-02-03 This page provides detailed release notes for CRE. It includes information on new features, significant changes, and known limitations. @@ -459,7 +459,7 @@ CRE now supports additional testnets for workflow simulation and production depl - Plasma Testnet - World Chain Sepolia -See the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page for chain names and forwarder addresses. +**Required versions:** CLI v1.0.7+, Go SDK v1.1.4+, TS SDK v1.0.7+ ## CLI v1.0.7 - January 29, 2026 @@ -490,7 +490,7 @@ For details on using time in workflows, see [Time in CRE](/cre/concepts/time-in- CRE now supports **ZKSync Era mainnet and testnet** for workflow simulation and production deployment. You can now build and test workflows that interact with ZKSync Era chains. -See the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page for chain names and forwarder addresses. +**Required versions:** CLI v1.0.6+, Go SDK v1.1.3+ (mainnet) / v1.1.2+ (testnet), TS SDK v1.0.7+ ## TS SDK v1.0.4 - January 26, 2026 @@ -2058,7 +2058,7 @@ This tool is **not intended for production use**. For production integrations: # Building Consumer Contracts Source: https://docs.chain.link/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts -Last Updated: 2025-11-20 +Last Updated: 2026-02-03 When your workflow [writes data to the blockchain](/cre/guides/workflow/using-evm-client/onchain-write), it doesn't call your contract directly. Instead, it submits a signed report to a Chainlink `KeystoneForwarder` contract, which then calls your contract. @@ -2422,7 +2422,7 @@ The forwarder address is configured at deployment via the constructor and provid **Configuration examples:** @@ -2517,11 +2517,11 @@ address mockForwarder = 0x15fC6ae953E024d975e77382eEeC56A9101f9F88; // Ethereum MyConsumer myConsumer = new MyConsumer(mockForwarder); ``` -Find Mock Forwarder addresses for all networks in the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page. +Find Mock Forwarder addresses for all networks in the [Forwarder Directory](/cre/guides/workflow/using-evm-client/forwarder-directory) page. ### Metadata-based validation @@ -2820,7 +2820,7 @@ updateReservesProxy.setExpectedWorkflowId(0xYourWorkflowId...); #### How it Works @@ -2891,7 +2891,7 @@ The forwarder address provides baseline security, but you can add additional val ### Best practices -1. **Always deploy with a valid forwarder address** - The constructor requires this for security. Use `MockForwarder` for simulation, `KeystoneForwarder` for production. Forwarder addresses are available in the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page. +1. **Always deploy with a valid forwarder address** - The constructor requires this for security. Use `MockForwarder` for simulation, `KeystoneForwarder` for production. Forwarder addresses are available in the [Forwarder Directory](/cre/guides/workflow/using-evm-client/forwarder-directory) page. 2. **Add additional validation for production**: - **Single workflow**: Use `setExpectedWorkflowId()` to restrict to one specific workflow (highest security) - **Multiple workflows from same owner**: Use `setExpectedAuthor()` to restrict to workflows you own @@ -4567,6 +4567,11 @@ Last Updated: 2026-01-23 When you update a deployed workflow, you redeploy it with the same workflow name. The new deployment replaces the previous version in the Workflow Registry contract. Currently, CRE does not maintain version history—each deployment overwrites the previous one. + + + ## Prerequisites Before updating a deployed workflow, ensure you have: @@ -7352,7 +7357,7 @@ For details, see [Using Multi-sig Wallets](/cre/guides/operations/using-multisig # Utility Commands Source: https://docs.chain.link/cre/reference/cli/utilities -Last Updated: 2026-01-29 +Last Updated: 2026-02-03 Utility commands provide helpful information and troubleshooting capabilities. @@ -7384,6 +7389,11 @@ cre update The CLI automatically checks if your version is outdated when you run certain commands. If a newer version is available, you'll see a warning message encouraging you to run `cre update`. + + + ## `cre version` Prints the current version of the CRE CLI. @@ -9438,6 +9448,120 @@ export async function main() { --- +# Forwarder Directory +Source: https://docs.chain.link/cre/guides/workflow/using-evm-client/forwarder-directory-ts +Last Updated: 2026-02-03 + + + +This page lists forwarder contract addresses for CRE workflows, organized by network. + +## How to Use This Page + +This reference provides three key pieces of information for each network: + +1. **Network Name**: The human-readable network identifier (click to view the forwarder contract on the block explorer) +2. **Chain Name**: The value to use in your [`project.yaml`](/cre/reference/project-configuration-ts#31-global-configuration-projectyaml) configuration and [EVM Client code](/cre/reference/sdk/evm-client-ts#chain-selectors) +3. **Forwarder Address**: The contract address for optional consumer contract validation + +## Understanding Forwarder Addresses + +Forwarder addresses identify the trusted Chainlink Forwarder contract that delivers verified workflow reports to your consumer contract. Your workflow code does not interact with forwarders directly—the EVM capability handles report delivery automatically. Learn more: [Onchain Write Overview](/cre/guides/workflow/using-evm-client/onchain-write/overview-ts). + +**Using the [ReceiverTemplate](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts#3-using-receivertemplate) (recommended)**: If you use the [`ReceiverTemplate`](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts#receivertemplate), the forwarder address is **required** in the constructor. This ensures your contract only accepts reports from the trusted Chainlink Forwarder. + +**Custom implementations**: If you implement the `IReceiver` interface directly without using `ReceiverTemplate`, you control your own security checks. See [Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts) for details. + +### Simulation vs Production Addresses + +**Important**: Forwarder contracts differ between local simulation and production: + +| Environment | Contract Type | Section | +| ---------------- | ----------------------- | ----------------------------------------------- | +| Local simulation | `MockKeystoneForwarder` | [Simulation Forwarders](#simulation-forwarders) | +| Production | `KeystoneForwarder` | [Production Forwarders](#production-forwarders) | + +If you configure forwarder validation in your consumer contract, **remember to update the forwarder address** when deploying to production. Learn more: [Working with Simulation](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts#4-working-with-simulation). + +## Simulation Forwarders + +These `MockKeystoneForwarder` addresses are used when running `cre workflow simulate` with the `--broadcast` flag. Use these addresses **only** during local development and testing. + +### Simulation Mainnets + +| Network | Chain Name | Mock Forwarder Address | +| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------ | +| Arbitrum One | ethereum-mainnet-arbitrum-1 | 0xd770499057619c9a76205fd4168161cf94abc532 | +| Avalanche | avalanche-mainnet | 0xdc21e279934ff6721cadfdd112dafb3261f09a2c | +| Base | ethereum-mainnet-base-1 | 0x5e342a8438b4f5d39e72875fcee6f76b39cce548 | +| BNB Smart Chain | binance_smart_chain-mainnet | 0x6f3239bbb26e98961e1115aba83f8a282e5508c8 | +| Ethereum Mainnet | ethereum-mainnet | 0xa3d1ad4ac559a6575a114998affb2fb2ec97a7d9 | +| OP Mainnet | ethereum-mainnet-optimism-1 | 0x9119a1501550ed94a3f2794038ed9258337afa18 | +| Polygon | polygon-mainnet | 0xf458d621885e29a5003ea9bbba5280d54e19b1ce | +| ZKSync Era | ethereum-mainnet-zksync-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | + +### Simulation Testnets + +| Network | Chain Name | Mock Forwarder Address | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | ------------------------------------------ | +| Apechain Curtis | apechain-testnet-curtis | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| Arc Testnet | arc-testnet | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| Arbitrum Sepolia | ethereum-testnet-sepolia-arbitrum-1 | 0xd41263567ddfead91504199b8c6c87371e83ca5d | +| Avalanche Fuji | avalanche-testnet-fuji | 0x2e7371a5d032489e4f60216d8d898a4c10805963 | +| Base Sepolia | ethereum-testnet-sepolia-base-1 | 0x82300bd7c3958625581cc2f77bc6464dcecdf3e5 | +| BSC Testnet | binance_smart_chain-testnet | 0xa238e42cb8782808dbb2f37e19859244ec4779b0 | +| Ethereum Sepolia | ethereum-testnet-sepolia | 0x15fC6ae953E024d975e77382eEeC56A9101f9F88 | +| Hyperliquid Testnet | hyperliquid-testnet | 0xB27fA1c28288c50542527F64BCda22C9FbAc24CB | +| Ink Sepolia | ink-testnet-sepolia | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| Jovay Testnet | jovay-testnet | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| Linea Sepolia | ethereum-testnet-sepolia-linea-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| OP Sepolia | ethereum-testnet-sepolia-optimism-1 | 0xa2888380dff3704a8ab6d1cd1a8f69c15fea5ee3 | +| Plasma Testnet | plasma-testnet | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| Polygon Amoy | polygon-testnet-amoy | 0x3675a5eb2286a3f87e8278fc66edf458a2e3bb74 | +| World Chain Sepolia | ethereum-testnet-sepolia-worldchain-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | +| ZKSync Era Sepolia | ethereum-testnet-sepolia-zksync-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | + +## Production Forwarders + +These `KeystoneForwarder` addresses are used by deployed workflows. Use these addresses when configuring your consumer contracts for production. + +### Mainnets + +| Network | Chain Name | Forwarder Address | +| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------ | +| Arbitrum One | ethereum-mainnet-arbitrum-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | +| Avalanche | avalanche-mainnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Base | ethereum-mainnet-base-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | +| BNB Smart Chain | binance_smart_chain-mainnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Ethereum Mainnet | ethereum-mainnet | 0x0b93082D9b3C7C97fAcd250082899BAcf3af3885 | +| OP Mainnet | ethereum-mainnet-optimism-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | +| Polygon | polygon-mainnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| ZKSync Era | ethereum-mainnet-zksync-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | + +### Testnets + +| Network | Chain Name | Forwarder Address | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | ------------------------------------------ | +| Apechain Curtis | apechain-testnet-curtis | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Arbitrum Sepolia | ethereum-testnet-sepolia-arbitrum-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Avalanche Fuji | avalanche-testnet-fuji | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Base Sepolia | ethereum-testnet-sepolia-base-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | +| BSC Testnet | binance_smart_chain-testnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Ethereum Sepolia | ethereum-testnet-sepolia | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | +| Hyperliquid Testnet | hyperliquid-testnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Ink Sepolia | ink-testnet-sepolia | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Jovay Testnet | jovay-testnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Linea Sepolia | ethereum-testnet-sepolia-linea-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| OP Sepolia | ethereum-testnet-sepolia-optimism-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Plasma Testnet | plasma-testnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| Polygon Amoy | polygon-testnet-amoy | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| World Chain Sepolia | ethereum-testnet-sepolia-worldchain-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | +| ZKSync Era Sepolia | ethereum-testnet-sepolia-zksync-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | + +--- + # Onchain Read Source: https://docs.chain.link/cre/guides/workflow/using-evm-client/onchain-read-ts Last Updated: 2026-01-20 @@ -9982,109 +10106,6 @@ This approach gives you the flexibility of direct ABI handling with the type saf --- -# Supported Networks -Source: https://docs.chain.link/cre/guides/workflow/using-evm-client/supported-networks-ts -Last Updated: 2026-01-29 - -This page lists the EVM-compatible networks supported by CRE workflows, along with their chain names (for configuration) and forwarder contract addresses (for consumer contract validation). - -## How to Use This Page - -This reference provides three key pieces of information for each network: - -1. **Network Name**: The human-readable network identifier (click to view the forwarder contract on the block explorer) -2. **Chain Name**: The value to use in your [`project.yaml`](/cre/reference/project-configuration-ts#31-global-configuration-projectyaml) configuration and [EVM Client code](/cre/reference/sdk/evm-client-ts#chain-selectors) -3. **Forwarder Address**: The contract address for optional consumer contract validation - -## Understanding Forwarder Addresses - -Forwarder addresses identify the trusted Chainlink Forwarder contract that delivers verified workflow reports to your consumer contract. Your workflow code does not interact with forwarders directly—the EVM capability handles report delivery automatically. Learn more: [Onchain Write Overview](/cre/guides/workflow/using-evm-client/onchain-write/overview-ts). - -**Using the [ReceiverTemplate](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts#3-using-receivertemplate) (recommended)**: If you use the [`ReceiverTemplate`](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts#receivertemplate), the forwarder address is **required** in the constructor. This ensures your contract only accepts reports from the trusted Chainlink Forwarder. - -**Custom implementations**: If you implement the `IReceiver` interface directly without using `ReceiverTemplate`, you control your own security checks. See [Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts) for details. - -### Simulation vs Production Addresses - -**Important**: Forwarder contracts differ between local simulation and production: - -| Environment | Contract Type | Section | -| ---------------- | ----------------------- | ----------------------------------------------- | -| Local simulation | `MockKeystoneForwarder` | [Simulation Forwarders](#simulation-forwarders) | -| Production | `KeystoneForwarder` | [Production Forwarders](#production-forwarders) | - -If you configure forwarder validation in your consumer contract, **remember to update the forwarder address** when deploying to production. Learn more: [Working with Simulation](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts#4-working-with-simulation). - -## Simulation Forwarders - -These `MockKeystoneForwarder` addresses are used when running `cre workflow simulate` with the `--broadcast` flag. Use these addresses **only** during local development and testing. - -### Simulation Mainnets - -| Network | Chain Name | Mock Forwarder Address | -| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------ | -| Arbitrum One | ethereum-mainnet-arbitrum-1 | 0xd770499057619c9a76205fd4168161cf94abc532 | -| Avalanche | avalanche-mainnet | 0xdc21e279934ff6721cadfdd112dafb3261f09a2c | -| Base | ethereum-mainnet-base-1 | 0x5e342a8438b4f5d39e72875fcee6f76b39cce548 | -| BNB Smart Chain | binance_smart_chain-mainnet | 0x6f3239bbb26e98961e1115aba83f8a282e5508c8 | -| Ethereum Mainnet | ethereum-mainnet | 0xa3d1ad4ac559a6575a114998affb2fb2ec97a7d9 | -| OP Mainnet | ethereum-mainnet-optimism-1 | 0x9119a1501550ed94a3f2794038ed9258337afa18 | -| Polygon | polygon-mainnet | 0xf458d621885e29a5003ea9bbba5280d54e19b1ce | -| ZKSync Era | ethereum-mainnet-zksync-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | - -### Simulation Testnets - -| Network | Chain Name | Mock Forwarder Address | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | ------------------------------------------ | -| Apechain Curtis | apechain-testnet-curtis | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| Arc Testnet | arc-testnet | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| Arbitrum Sepolia | ethereum-testnet-sepolia-arbitrum-1 | 0xd41263567ddfead91504199b8c6c87371e83ca5d | -| Avalanche Fuji | avalanche-testnet-fuji | 0x2e7371a5d032489e4f60216d8d898a4c10805963 | -| Base Sepolia | ethereum-testnet-sepolia-base-1 | 0x82300bd7c3958625581cc2f77bc6464dcecdf3e5 | -| BSC Testnet | binance_smart_chain-testnet | 0xa238e42cb8782808dbb2f37e19859244ec4779b0 | -| Ethereum Sepolia | ethereum-testnet-sepolia | 0x15fC6ae953E024d975e77382eEeC56A9101f9F88 | -| Hyperliquid Testnet | hyperliquid-testnet | 0xB27fA1c28288c50542527F64BCda22C9FbAc24CB | -| Ink Sepolia | ink-testnet-sepolia | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| Jovay Testnet | jovay-testnet | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| Linea Sepolia | ethereum-testnet-sepolia-linea-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| OP Sepolia | ethereum-testnet-sepolia-optimism-1 | 0xa2888380dff3704a8ab6d1cd1a8f69c15fea5ee3 | -| Plasma Testnet | plasma-testnet | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| Polygon Amoy | polygon-testnet-amoy | 0x3675a5eb2286a3f87e8278fc66edf458a2e3bb74 | -| World Chain Sepolia | ethereum-testnet-sepolia-worldchain-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | -| ZKSync Era Sepolia | ethereum-testnet-sepolia-zksync-1 | 0x6E9EE680ef59ef64Aa8C7371279c27E496b5eDc1 | - -## Production Forwarders - -These `KeystoneForwarder` addresses are used by deployed workflows. Use these addresses when configuring your consumer contracts for production. - -### Mainnets - -| Network | Chain Name | Forwarder Address | -| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------ | -| Arbitrum One | ethereum-mainnet-arbitrum-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | -| Avalanche | avalanche-mainnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| Base | ethereum-mainnet-base-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | -| BNB Smart Chain | binance_smart_chain-mainnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| Ethereum Mainnet | ethereum-mainnet | 0x0b93082D9b3C7C97fAcd250082899BAcf3af3885 | -| OP Mainnet | ethereum-mainnet-optimism-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | -| Polygon | polygon-mainnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| ZKSync Era | ethereum-mainnet-zksync-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | - -### Testnets - -| Network | Chain Name | Forwarder Address | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | ------------------------------------------ | -| Arbitrum Sepolia | ethereum-testnet-sepolia-arbitrum-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| Avalanche Fuji | avalanche-testnet-fuji | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| Base Sepolia | ethereum-testnet-sepolia-base-1 | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | -| BSC Testnet | binance_smart_chain-testnet | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| Ethereum Sepolia | ethereum-testnet-sepolia | 0xF8344CFd5c43616a4366C34E3EEE75af79a74482 | -| OP Sepolia | ethereum-testnet-sepolia-optimism-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| Polygon Amoy | polygon-testnet-amoy | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | -| ZKSync Era Sepolia | ethereum-testnet-sepolia-zksync-1 | 0x76c9cf548b4179F8901cda1f8623568b58215E62 | - ---- - # Making GET Requests Source: https://docs.chain.link/cre/guides/workflow/using-http-client/get-request-ts Last Updated: 2026-01-20 @@ -12547,7 +12568,7 @@ The typical project setup flow for TypeScript workflows: # Project Configuration Source: https://docs.chain.link/cre/reference/project-configuration-ts -Last Updated: 2025-11-04 +Last Updated: 2026-02-03 This page explains how to manage configuration within Chainlink Runtime Environment (CRE) projects. It covers the standard project structure, the roles and usage of the configuration files (`project.yaml` and `workflow.yaml`), and the concept of **targets** for handling environment-specific settings. @@ -12636,9 +12657,9 @@ production-settings: ``` #### Configuration fields @@ -12773,6 +12794,41 @@ When you run a CLI command with a target, e.g., `--target staging-settings`: `workflow.yaml`. A mismatch causes the CLI to abort with a clear error message. +## 5. Updating dependencies + +When new networks or SDK features are released, you may need to update your project dependencies. + +### Updating the CLI + +Run [cre update](/cre/reference/cli/utilities#cre-update) to download and install the latest CLI version: + +```bash +cre update +``` + +New projects created with an updated CLI automatically use compatible SDK versions. + +### Updating the SDK (existing projects) + +If you created your project with an older CLI version, update the `@chainlink/cre-sdk` dependency in your workflow's `package.json`: + +```json +{ + "dependencies": { + "@chainlink/cre-sdk": "^1.0.7" + } +} +``` + +Then run `bun install` from your workflow directory to update `bun.lock`. + +### Checking your versions + +- **CLI version:** Run `cre version` +- **SDK version:** Check `package.json` or `bun.lock` in your workflow directory + +For a list of which versions support which networks, see [Supported Networks](/cre/supported-networks). + --- # SDK Reference: Consensus & Aggregation @@ -13505,7 +13561,7 @@ const onTrigger = (runtime: Runtime, ...): string => { # SDK Reference: EVM Client Source: https://docs.chain.link/cre/reference/sdk/evm-client-ts -Last Updated: 2026-01-20 +Last Updated: 2026-02-03 This page provides a reference for the `EVMClient`, the low-level tool for all interactions with EVM-compatible blockchains. The client includes a comprehensive set of read, write, and utility methods for building chain-aware workflows. @@ -14290,28 +14346,38 @@ EVMClient.SUPPORTED_CHAINS This table shows the chain selector names and their numeric IDs. In your configuration files (`project.yaml`, `config.staging.json`, `config.production.json`, etc.), you always use the **String Name**. The numeric ID is used internally by the SDK and is returned by the `getNetwork()` helper function. + - -| Chain | String Name | Numeric ID | -| ----------------- | ----------------------------------- | -------------------- | -| Arbitrum One | ethereum-mainnet-arbitrum-1 | 4949039107694359620 | -| Arbitrum Sepolia | ethereum-testnet-sepolia-arbitrum-1 | 3478487238524512106 | -| Avalanche Mainnet | avalanche-mainnet | 6433500567565415381 | -| Avalanche Fuji | avalanche-testnet-fuji | 14767482510784806043 | -| Base Mainnet | ethereum-mainnet-base-1 | 15971525489660198786 | -| Base Sepolia | ethereum-testnet-sepolia-base-1 | 10344971235874465080 | -| BNB Chain Mainnet | binance_smart_chain-mainnet | 11344663589394136015 | -| BNB Chain Testnet | binance_smart_chain-testnet | 5142893604156789321 | -| Ethereum Mainnet | ethereum-mainnet | 5009297550715157269 | -| Ethereum Sepolia | ethereum-testnet-sepolia | 16015286601757825753 | -| OP Mainnet | ethereum-mainnet-optimism-1 | 3734403246176062136 | -| OP Sepolia | ethereum-testnet-sepolia-optimism-1 | 5224473277236331295 | -| Polygon Mainnet | polygon-mainnet | 4051577828743386545 | -| Polygon Amoy | polygon-testnet-amoy | 16281711391670634445 | + - **Forwarder addresses**: For network-specific forwarder contract addresses, see [Forwarder Directory](/cre/guides/workflow/using-evm-client/forwarder-directory) + - **RPC configuration**: For configuring RPC endpoints in `project.yaml`, see [Project Configuration](/cre/reference/project-configuration) + + +| Chain | String Name | Numeric ID | +| ------------------- | ------------------------------------- | -------------------- | +| Apechain Curtis | apechain-testnet-curtis | 9900119385908781505 | +| Arc Testnet | arc-testnet | 3034092155422581607 | +| Arbitrum One | ethereum-mainnet-arbitrum-1 | 4949039107694359620 | +| Arbitrum Sepolia | ethereum-testnet-sepolia-arbitrum-1 | 3478487238524512106 | +| Avalanche Mainnet | avalanche-mainnet | 6433500567565415381 | +| Avalanche Fuji | avalanche-testnet-fuji | 14767482510784806043 | +| Base Mainnet | ethereum-mainnet-base-1 | 15971525489660198786 | +| Base Sepolia | ethereum-testnet-sepolia-base-1 | 10344971235874465080 | +| BNB Chain Mainnet | binance_smart_chain-mainnet | 11344663589394136015 | +| BNB Chain Testnet | binance_smart_chain-testnet | 13264668187771770619 | +| Ethereum Mainnet | ethereum-mainnet | 5009297550715157269 | +| Ethereum Sepolia | ethereum-testnet-sepolia | 16015286601757825753 | +| Hyperliquid Testnet | hyperliquid-testnet | 4286062357653186312 | +| Ink Sepolia | ink-testnet-sepolia | 9763904284804119144 | +| Jovay Testnet | jovay-testnet | 945045181441419236 | +| Linea Sepolia | ethereum-testnet-sepolia-linea-1 | 5719461335882077547 | +| OP Mainnet | ethereum-mainnet-optimism-1 | 3734403246176062136 | +| OP Sepolia | ethereum-testnet-sepolia-optimism-1 | 5224473277236331295 | +| Plasma Testnet | plasma-testnet | 3967220077692964309 | +| Polygon Mainnet | polygon-mainnet | 4051577828743386545 | +| Polygon Amoy | polygon-testnet-amoy | 16281711391670634445 | +| World Chain Sepolia | ethereum-testnet-sepolia-worldchain-1 | 5299555114858065850 | +| ZKSync Era | ethereum-mainnet-zksync-1 | 1562403441176082196 | +| ZKSync Era Sepolia | ethereum-testnet-sepolia-zksync-1 | 6898391096552792247 | ### Usage in configuration files @@ -15006,11 +15072,6 @@ const reserveInfo = httpClient Source: https://docs.chain.link/cre/reference/sdk/overview-ts Last Updated: 2026-01-29 - - This section provides a detailed technical reference for the public interfaces of the CRE TypeScript SDK. Use this reference for quick lookups of specific functions, types, and method signatures. ## How to read this section @@ -15734,6 +15795,59 @@ This section provides a reference for the built-in trigger capabilities of the C --- +# Supported Networks +Source: https://docs.chain.link/cre/supported-networks-ts +Last Updated: 2026-02-03 + +This page lists all EVM-compatible networks supported by CRE workflows, along with the minimum CLI and SDK versions required for each network. + +## Version Requirements + +Network support depends on your CLI and SDK versions. The tables below show the minimum versions required for each network. + +- **New projects:** Run `cre update` to get the latest CLI, which includes compatible SDK versions. +- **Existing projects:** You may need to update your SDK dependency. See [Updating Dependencies](/cre/reference/project-configuration-ts#5-updating-dependencies) for instructions. + +## Mainnets + +| Network | CLI | Go SDK | TS SDK | +| ------------ | ------ | ------ | ------ | +| Arbitrum One | v1.0.0 | v1.0.0 | v1.0.1 | +| Avalanche | v1.0.0 | v1.0.0 | v1.0.1 | +| Base | v1.0.0 | v1.0.0 | v1.0.1 | +| BNB Chain | v1.0.0 | v1.0.0 | v1.0.1 | +| Ethereum | v1.0.0 | v1.0.0 | v1.0.1 | +| OP Mainnet | v1.0.0 | v1.0.0 | v1.0.1 | +| Polygon | v1.0.0 | v1.0.0 | v1.0.1 | +| ZKSync Era | v1.0.6 | v1.1.3 | v1.0.7 | + +## Testnets + +| Network | CLI | Go SDK | TS SDK | +| ------------------- | ------ | ------ | ------ | +| Apechain Curtis | v1.0.7 | v1.1.4 | v1.0.7 | +| Arc Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Arbitrum Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| Avalanche Fuji | v1.0.0 | v1.0.0 | v1.0.1 | +| Base Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| BNB Chain Testnet | v1.0.0 | v1.0.0 | v1.0.1 | +| Ethereum Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| Hyperliquid Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Ink Sepolia | v1.0.7 | v1.1.4 | v1.0.7 | +| Jovay Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Linea Sepolia | v1.0.7 | v1.1.4 | v1.0.7 | +| OP Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| Plasma Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Polygon Amoy | v1.0.0 | v1.0.0 | v1.0.1 | +| World Chain Sepolia | v1.0.7 | v1.1.4 | v1.0.7 | +| ZKSync Era Sepolia | v1.0.6 | v1.1.2 | v1.0.7 | + +## Forwarder Addresses + +For forwarder contract addresses and chain names, see the [Forwarder Directory](/cre/guides/workflow/using-evm-client/forwarder-directory). Forwarder addresses are used when building consumer contracts that receive workflow reports onchain. Learn more about [Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write/overview). + +--- + # Running a Demo Workflow Source: https://docs.chain.link/cre/templates/running-demo-workflow-ts Last Updated: 2026-01-20 diff --git a/src/content/cre/reference/cli/utilities.mdx b/src/content/cre/reference/cli/utilities.mdx index 777ea4859a4..5569b1330ea 100644 --- a/src/content/cre/reference/cli/utilities.mdx +++ b/src/content/cre/reference/cli/utilities.mdx @@ -5,7 +5,7 @@ title: "Utility Commands" metadata: description: "Find CLI utility commands: reference for version checking, binding generation, and helpful development tools." datePublished: "2025-11-04" - lastModified: "2026-01-29" + lastModified: "2026-02-03" --- import { Aside } from "@components" @@ -40,6 +40,11 @@ cre update The CLI automatically checks if your version is outdated when you run certain commands. If a newer version is available, you'll see a warning message encouraging you to run `cre update`. +{/* prettier-ignore */} + + ## `cre version` Prints the current version of the CRE CLI. diff --git a/src/content/cre/reference/project-configuration-go.mdx b/src/content/cre/reference/project-configuration-go.mdx index 9b77dc2141f..fe8e8197422 100644 --- a/src/content/cre/reference/project-configuration-go.mdx +++ b/src/content/cre/reference/project-configuration-go.mdx @@ -7,7 +7,7 @@ date: Last Modified metadata: description: "Configure your Go project: learn to manage project.yaml, workflow.yaml, and targets for different environments." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2026-02-03" --- import { ClickToZoom, Aside } from "@components" @@ -94,9 +94,9 @@ production-settings: ``` #### Configuration fields @@ -231,3 +231,34 @@ When you run a CLI command with a target, e.g., `--target staging-settings`: If your workflow directory contains a `workflow.yaml`, the target you specify must exist in both `project.yaml` and `workflow.yaml`. A mismatch causes the CLI to abort with a clear error message. + +## 5. Updating dependencies + +When new networks or SDK features are released, you may need to update your project dependencies. + +### Updating the CLI + +Run [cre update](/cre/reference/cli/utilities#cre-update) to download and install the latest CLI version: + +```bash +cre update +``` + +New projects created with an updated CLI automatically use compatible SDK versions. + +### Updating the SDK (existing projects) + +If you created your project with an older CLI version, update the SDK in your `go.mod`: + +```bash +go get github.com/smartcontractkit/cre-sdk-go@v1.1.4 +``` + +Then run `go mod tidy` to clean up dependencies. + +### Checking your versions + +- **CLI version:** Run `cre version` +- **SDK version:** Check `go.mod` for the `cre-sdk-go` dependency version + +For a list of which versions support which networks, see [Supported Networks](/cre/supported-networks). diff --git a/src/content/cre/reference/project-configuration-ts.mdx b/src/content/cre/reference/project-configuration-ts.mdx index ec8f344e95e..d8b4f2ffacb 100644 --- a/src/content/cre/reference/project-configuration-ts.mdx +++ b/src/content/cre/reference/project-configuration-ts.mdx @@ -7,7 +7,7 @@ date: Last Modified metadata: description: "Configure your TypeScript project: learn to manage project.yaml, workflow.yaml, and targets for different environments." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2026-02-03" --- import { ClickToZoom, Aside } from "@components" @@ -99,9 +99,9 @@ production-settings: ``` #### Configuration fields @@ -241,3 +241,38 @@ When you run a CLI command with a target, e.g., `--target staging-settings`: If your workflow directory contains a `workflow.yaml`, the target you specify must exist in both `project.yaml` and `workflow.yaml`. A mismatch causes the CLI to abort with a clear error message. + +## 5. Updating dependencies + +When new networks or SDK features are released, you may need to update your project dependencies. + +### Updating the CLI + +Run [cre update](/cre/reference/cli/utilities#cre-update) to download and install the latest CLI version: + +```bash +cre update +``` + +New projects created with an updated CLI automatically use compatible SDK versions. + +### Updating the SDK (existing projects) + +If you created your project with an older CLI version, update the `@chainlink/cre-sdk` dependency in your workflow's `package.json`: + +```json +{ + "dependencies": { + "@chainlink/cre-sdk": "^1.0.7" + } +} +``` + +Then run `bun install` from your workflow directory to update `bun.lock`. + +### Checking your versions + +- **CLI version:** Run `cre version` +- **SDK version:** Check `package.json` or `bun.lock` in your workflow directory + +For a list of which versions support which networks, see [Supported Networks](/cre/supported-networks). diff --git a/src/content/cre/reference/sdk/evm-client-go.mdx b/src/content/cre/reference/sdk/evm-client-go.mdx index 852f7711cf9..0c68c7ad60f 100644 --- a/src/content/cre/reference/sdk/evm-client-go.mdx +++ b/src/content/cre/reference/sdk/evm-client-go.mdx @@ -7,7 +7,7 @@ pageId: "reference-sdk-evm-client" metadata: description: "Reference for Go EVM Client: complete API for smart contract interactions, reads, writes, report generation, and chain configuration." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2026-02-03" --- import { Aside, CopyText } from "@components" @@ -261,8 +261,7 @@ A **chain selector** is a unique identifier for a blockchain network used throug {/* prettier-ignore */} @@ -284,22 +283,32 @@ A **chain selector** is a unique identifier for a blockchain network used throug This table shows all three equivalent formats for each supported chain: -|
Chain
| String Name |
Go Constant
|
Numeric ID
| -| -------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | --------------------------------------------- | -| Arbitrum One | | | | -| Arbitrum Sepolia | | | | -| Avalanche Mainnet | | | | -| Avalanche Fuji | | | | -| Base Mainnet | | | | -| Base Sepolia | | | | -| BNB Chain Mainnet | | | | -| BNB Chain Testnet | | | | -| Ethereum Mainnet | | | | -| Ethereum Sepolia | | | | -| OP Mainnet | | | | -| OP Sepolia | | | | -| Polygon Mainnet | | | | -| Polygon Amoy | | | | +|
Chain
| String Name |
Go Constant
|
Numeric ID
| +| -------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | --------------------------------------------- | +| Apechain Curtis | | | | +| Arc Testnet | | | | +| Arbitrum One | | | | +| Arbitrum Sepolia | | | | +| Avalanche Mainnet | | | | +| Avalanche Fuji | | | | +| Base Mainnet | | | | +| Base Sepolia | | | | +| BNB Chain Mainnet | | | | +| BNB Chain Testnet | | | | +| Ethereum Mainnet | | | | +| Ethereum Sepolia | | | | +| Hyperliquid Testnet | | | | +| Ink Sepolia | | | | +| Jovay Testnet | | | | +| Linea Sepolia | | | | +| OP Mainnet | | | | +| OP Sepolia | | | | +| Plasma Testnet | | | | +| Polygon Mainnet | | | | +| Polygon Amoy | | | | +| World Chain Sepolia | | | | +| ZKSync Era | | | | +| ZKSync Era Sepolia | | | | ### Usage examples diff --git a/src/content/cre/reference/sdk/evm-client-ts.mdx b/src/content/cre/reference/sdk/evm-client-ts.mdx index 1c2bd2397f6..53e52ca12a6 100644 --- a/src/content/cre/reference/sdk/evm-client-ts.mdx +++ b/src/content/cre/reference/sdk/evm-client-ts.mdx @@ -7,7 +7,7 @@ pageId: "reference-sdk-evm-client" metadata: description: "Reference for TypeScript EVM Client: complete API for smart contract interactions, reads, writes, and report generation with Viem." datePublished: "2025-11-04" - lastModified: "2026-01-20" + lastModified: "2026-02-03" --- import { Aside, CopyText } from "@components" @@ -795,28 +795,38 @@ EVMClient.SUPPORTED_CHAINS This table shows the chain selector names and their numeric IDs. In your configuration files (`project.yaml`, `config.staging.json`, `config.production.json`, etc.), you always use the **String Name**. The numeric ID is used internally by the SDK and is returned by the `getNetwork()` helper function. +{/* prettier-ignore */} -|
Chain
| String Name |
Numeric ID
| -| -------------------------------------- | ------------------------------------------------------------ | --------------------------------------------- | -| Arbitrum One | | | -| Arbitrum Sepolia | | | -| Avalanche Mainnet | | | -| Avalanche Fuji | | | -| Base Mainnet | | | -| Base Sepolia | | | -| BNB Chain Mainnet | | | -| BNB Chain Testnet | | | -| Ethereum Mainnet | | | -| Ethereum Sepolia | | | -| OP Mainnet | | | -| OP Sepolia | | | -| Polygon Mainnet | | | -| Polygon Amoy | | | +|
Chain
| String Name |
Numeric ID
| +| -------------------------------------- | -------------------------------------------------------------- | --------------------------------------------- | +| Apechain Curtis | | | +| Arc Testnet | | | +| Arbitrum One | | | +| Arbitrum Sepolia | | | +| Avalanche Mainnet | | | +| Avalanche Fuji | | | +| Base Mainnet | | | +| Base Sepolia | | | +| BNB Chain Mainnet | | | +| BNB Chain Testnet | | | +| Ethereum Mainnet | | | +| Ethereum Sepolia | | | +| Hyperliquid Testnet | | | +| Ink Sepolia | | | +| Jovay Testnet | | | +| Linea Sepolia | | | +| OP Mainnet | | | +| OP Sepolia | | | +| Plasma Testnet | | | +| Polygon Mainnet | | | +| Polygon Amoy | | | +| World Chain Sepolia | | | +| ZKSync Era | | | +| ZKSync Era Sepolia | | | ### Usage in configuration files diff --git a/src/content/cre/reference/sdk/overview-go.mdx b/src/content/cre/reference/sdk/overview-go.mdx index 6e4c27b4e4e..39d0569dfae 100644 --- a/src/content/cre/reference/sdk/overview-go.mdx +++ b/src/content/cre/reference/sdk/overview-go.mdx @@ -7,20 +7,11 @@ pageId: "reference-sdk-overview" metadata: description: "Explore the Go SDK API: complete technical reference for workflows, handlers, triggers, capabilities, and runtime methods." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2026-02-03" --- import { Aside } from "@components" - - This section provides a detailed technical reference for the public interfaces of the CRE Go SDK. Use this reference for quick lookups of specific functions, types, and method signatures. ## How to read this section diff --git a/src/content/cre/reference/sdk/overview-ts.mdx b/src/content/cre/reference/sdk/overview-ts.mdx index 4e6ac4ea189..0eef941adc9 100644 --- a/src/content/cre/reference/sdk/overview-ts.mdx +++ b/src/content/cre/reference/sdk/overview-ts.mdx @@ -7,16 +7,11 @@ pageId: "reference-sdk-overview" metadata: description: "Explore the TypeScript SDK API: complete technical reference for workflows, handlers, triggers, capabilities, and runtime methods." datePublished: "2025-11-04" - lastModified: "2026-01-29" + lastModified: "2026-02-03" --- import { Aside } from "@components" - - This section provides a detailed technical reference for the public interfaces of the CRE TypeScript SDK. Use this reference for quick lookups of specific functions, types, and method signatures. ## How to read this section diff --git a/src/content/cre/release-notes.mdx b/src/content/cre/release-notes.mdx index 675c78c48aa..d40fd367bb9 100644 --- a/src/content/cre/release-notes.mdx +++ b/src/content/cre/release-notes.mdx @@ -5,7 +5,7 @@ date: Last Modified metadata: description: "Discover what's new in CRE: latest features, changes, and improvements in each release of the Chainlink Runtime Environment." datePublished: "2025-11-04" - lastModified: "2026-01-29" + lastModified: "2026-02-03" --- import { Aside } from "@components" @@ -25,7 +25,7 @@ CRE now supports additional testnets for workflow simulation and production depl - Plasma Testnet - World Chain Sepolia -See the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page for chain names and forwarder addresses. +**Required versions:** CLI v1.0.7+, Go SDK v1.1.4+, TS SDK v1.0.7+ ## CLI v1.0.7 - January 29, 2026 @@ -56,7 +56,7 @@ For details on using time in workflows, see [Time in CRE](/cre/concepts/time-in- CRE now supports **ZKSync Era mainnet and testnet** for workflow simulation and production deployment. You can now build and test workflows that interact with ZKSync Era chains. -See the [Supported Networks](/cre/guides/workflow/using-evm-client/supported-networks) page for chain names and forwarder addresses. +**Required versions:** CLI v1.0.6+, Go SDK v1.1.3+ (mainnet) / v1.1.2+ (testnet), TS SDK v1.0.7+ ## TS SDK v1.0.4 - January 26, 2026 diff --git a/src/content/cre/supported-networks-go.mdx b/src/content/cre/supported-networks-go.mdx new file mode 100644 index 00000000000..3c85dac359a --- /dev/null +++ b/src/content/cre/supported-networks-go.mdx @@ -0,0 +1,58 @@ +--- +section: cre +title: "Supported Networks" +date: Last Modified +sdkLang: "go" +pageId: "supported-networks" +metadata: + description: "View all EVM networks supported by CRE workflows, including required CLI and SDK versions for each network." + datePublished: "2026-02-03" + lastModified: "2026-02-03" +--- + +This page lists all EVM-compatible networks supported by CRE workflows, along with the minimum CLI and SDK versions required for each network. + +## Version Requirements + +Network support depends on your CLI and SDK versions. The tables below show the minimum versions required for each network. + +- **New projects:** Run `cre update` to get the latest CLI, which includes compatible SDK versions. +- **Existing projects:** You may need to update your SDK dependency. See [Updating Dependencies](/cre/reference/project-configuration-go#5-updating-dependencies) for instructions. + +## Mainnets + +| Network | CLI | Go SDK | TS SDK | +| ------------ | ------ | ------ | ------ | +| Arbitrum One | v1.0.0 | v1.0.0 | v1.0.1 | +| Avalanche | v1.0.0 | v1.0.0 | v1.0.1 | +| Base | v1.0.0 | v1.0.0 | v1.0.1 | +| BNB Chain | v1.0.0 | v1.0.0 | v1.0.1 | +| Ethereum | v1.0.0 | v1.0.0 | v1.0.1 | +| OP Mainnet | v1.0.0 | v1.0.0 | v1.0.1 | +| Polygon | v1.0.0 | v1.0.0 | v1.0.1 | +| ZKSync Era | v1.0.6 | v1.1.3 | v1.0.7 | + +## Testnets + +| Network | CLI | Go SDK | TS SDK | +| ------------------- | ------ | ------ | ------ | +| Apechain Curtis | v1.0.7 | v1.1.4 | v1.0.7 | +| Arc Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Arbitrum Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| Avalanche Fuji | v1.0.0 | v1.0.0 | v1.0.1 | +| Base Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| BNB Chain Testnet | v1.0.0 | v1.0.0 | v1.0.1 | +| Ethereum Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| Hyperliquid Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Ink Sepolia | v1.0.7 | v1.1.4 | v1.0.7 | +| Jovay Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Linea Sepolia | v1.0.7 | v1.1.4 | v1.0.7 | +| OP Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| Plasma Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Polygon Amoy | v1.0.0 | v1.0.0 | v1.0.1 | +| World Chain Sepolia | v1.0.7 | v1.1.4 | v1.0.7 | +| ZKSync Era Sepolia | v1.0.6 | v1.1.2 | v1.0.7 | + +## Forwarder Addresses + +For forwarder contract addresses and chain names, see the [Forwarder Directory](/cre/guides/workflow/using-evm-client/forwarder-directory). Forwarder addresses are used when building consumer contracts that receive workflow reports onchain. Learn more about [Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write/overview). diff --git a/src/content/cre/supported-networks-ts.mdx b/src/content/cre/supported-networks-ts.mdx new file mode 100644 index 00000000000..9075cce2d68 --- /dev/null +++ b/src/content/cre/supported-networks-ts.mdx @@ -0,0 +1,58 @@ +--- +section: cre +title: "Supported Networks" +date: Last Modified +sdkLang: "ts" +pageId: "supported-networks" +metadata: + description: "View all EVM networks supported by CRE workflows, including required CLI and SDK versions for each network." + datePublished: "2026-02-03" + lastModified: "2026-02-03" +--- + +This page lists all EVM-compatible networks supported by CRE workflows, along with the minimum CLI and SDK versions required for each network. + +## Version Requirements + +Network support depends on your CLI and SDK versions. The tables below show the minimum versions required for each network. + +- **New projects:** Run `cre update` to get the latest CLI, which includes compatible SDK versions. +- **Existing projects:** You may need to update your SDK dependency. See [Updating Dependencies](/cre/reference/project-configuration-ts#5-updating-dependencies) for instructions. + +## Mainnets + +| Network | CLI | Go SDK | TS SDK | +| ------------ | ------ | ------ | ------ | +| Arbitrum One | v1.0.0 | v1.0.0 | v1.0.1 | +| Avalanche | v1.0.0 | v1.0.0 | v1.0.1 | +| Base | v1.0.0 | v1.0.0 | v1.0.1 | +| BNB Chain | v1.0.0 | v1.0.0 | v1.0.1 | +| Ethereum | v1.0.0 | v1.0.0 | v1.0.1 | +| OP Mainnet | v1.0.0 | v1.0.0 | v1.0.1 | +| Polygon | v1.0.0 | v1.0.0 | v1.0.1 | +| ZKSync Era | v1.0.6 | v1.1.3 | v1.0.7 | + +## Testnets + +| Network | CLI | Go SDK | TS SDK | +| ------------------- | ------ | ------ | ------ | +| Apechain Curtis | v1.0.7 | v1.1.4 | v1.0.7 | +| Arc Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Arbitrum Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| Avalanche Fuji | v1.0.0 | v1.0.0 | v1.0.1 | +| Base Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| BNB Chain Testnet | v1.0.0 | v1.0.0 | v1.0.1 | +| Ethereum Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| Hyperliquid Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Ink Sepolia | v1.0.7 | v1.1.4 | v1.0.7 | +| Jovay Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Linea Sepolia | v1.0.7 | v1.1.4 | v1.0.7 | +| OP Sepolia | v1.0.0 | v1.0.0 | v1.0.1 | +| Plasma Testnet | v1.0.7 | v1.1.4 | v1.0.7 | +| Polygon Amoy | v1.0.0 | v1.0.0 | v1.0.1 | +| World Chain Sepolia | v1.0.7 | v1.1.4 | v1.0.7 | +| ZKSync Era Sepolia | v1.0.6 | v1.1.2 | v1.0.7 | + +## Forwarder Addresses + +For forwarder contract addresses and chain names, see the [Forwarder Directory](/cre/guides/workflow/using-evm-client/forwarder-directory). Forwarder addresses are used when building consumer contracts that receive workflow reports onchain. Learn more about [Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write/overview). diff --git a/src/features/redirects/redirects.json b/src/features/redirects/redirects.json index 62e70bba4e0..12723f10a1f 100644 --- a/src/features/redirects/redirects.json +++ b/src/features/redirects/redirects.json @@ -2574,6 +2574,21 @@ "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 } ] } From dbd59a56a9bb3c7a352530e9af8af24a6eb14412 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Tue, 3 Feb 2026 18:30:55 -0500 Subject: [PATCH 180/214] move Time to Workflow Guides and add HTTP callouts (#3431) --- src/config/sidebar.ts | 10 +- .../cre/concepts/non-determinism-go.mdx | 6 +- .../cre/concepts/non-determinism-ts.mdx | 6 +- .../workflow/time-in-workflows-go.mdx} | 8 +- .../workflow/time-in-workflows-ts.mdx} | 8 +- .../using-http-client/get-request-go.mdx | 7 +- .../using-http-client/get-request-ts.mdx | 7 +- .../workflow/using-http-client/index.mdx | 9 +- .../using-http-client/post-request-go.mdx | 7 +- .../using-http-client/post-request-ts.mdx | 7 +- src/content/cre/llms-full-go.txt | 241 +++++++++-------- src/content/cre/llms-full-ts.txt | 255 +++++++++--------- src/content/cre/reference/sdk/core-ts.mdx | 2 +- src/content/cre/release-notes.mdx | 2 +- src/features/redirects/redirects.json | 15 ++ 15 files changed, 331 insertions(+), 259 deletions(-) rename src/content/cre/{concepts/time-in-cre-go.mdx => guides/workflow/time-in-workflows-go.mdx} (97%) rename src/content/cre/{concepts/time-in-cre-ts.mdx => guides/workflow/time-in-workflows-ts.mdx} (98%) diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index e2abce1aba2..3cc950c98ed 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -314,6 +314,11 @@ export const SIDEBAR: Partial> = { }, ], }, + { + title: "Using Time in Workflows", + url: "cre/guides/workflow/time-in-workflows", + highlightAsCurrent: ["cre/guides/workflow/time-in-workflows-ts", "cre/guides/workflow/time-in-workflows-go"], + }, ], }, { @@ -411,11 +416,6 @@ export const SIDEBAR: Partial> = { url: "cre/concepts/non-determinism", highlightAsCurrent: ["cre/concepts/non-determinism-go", "cre/concepts/non-determinism-ts"], }, - { - title: "Time in CRE", - url: "cre/concepts/time-in-cre", - highlightAsCurrent: ["cre/concepts/time-in-cre-go", "cre/concepts/time-in-cre-ts"], - }, { title: "Random in CRE", url: "cre/concepts/random-in-cre", diff --git a/src/content/cre/concepts/non-determinism-go.mdx b/src/content/cre/concepts/non-determinism-go.mdx index 2460cb376b9..100b4c3f68d 100644 --- a/src/content/cre/concepts/non-determinism-go.mdx +++ b/src/content/cre/concepts/non-determinism-go.mdx @@ -7,7 +7,7 @@ date: Last Modified metadata: description: "Learn how to avoid non-deterministic behaviors in CRE Go workflows that prevent nodes from reaching consensus." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2026-02-03" --- import { Aside } from "@components" @@ -71,7 +71,7 @@ Never use Go's `time` package functions in DON mode. Nodes have different system **The problem:** Using `time.Now()` returns different values on each node. -**The solution:** Use `runtime.Now()` from the CRE SDK, which provides DON Time—a consensus-derived timestamp that all nodes agree on. See [Time in CRE](/cre/concepts/time-in-cre) for details. +**The solution:** Use `runtime.Now()` from the CRE SDK, which provides DON Time—a consensus-derived timestamp that all nodes agree on. See [Time in CRE](/cre/guides/workflow/time-in-workflows-go) for details. ## 5. Random number generation @@ -113,6 +113,6 @@ Large Language Models (LLMs) generate different responses for the same prompt, e ## Related concepts -- **[Time in CRE](/cre/concepts/time-in-cre)**: Learn about DON Time and why `runtime.Now()` is required +- **[Time in CRE](/cre/guides/workflow/time-in-workflows-go)**: Learn about DON Time and why `runtime.Now()` is required - **[Random in CRE](/cre/concepts/random-in-cre)**: Understand consensus-safe random number generation - **[Consensus Computing](/cre/concepts/consensus-computing)**: Deep dive into how nodes reach agreement diff --git a/src/content/cre/concepts/non-determinism-ts.mdx b/src/content/cre/concepts/non-determinism-ts.mdx index 770025aa6fa..ce1b70975b9 100644 --- a/src/content/cre/concepts/non-determinism-ts.mdx +++ b/src/content/cre/concepts/non-determinism-ts.mdx @@ -7,7 +7,7 @@ date: Last Modified metadata: description: "Learn how to avoid non-deterministic behaviors in CRE TypeScript workflows that prevent nodes from reaching consensus." datePublished: "2025-11-04" - lastModified: "2026-01-20" + lastModified: "2026-02-03" --- import { Aside } from "@components" @@ -188,7 +188,7 @@ const now = runtime.now() // Same timestamp across all nodes runtime.log(`Current time: ${now.toISOString()}`) ``` -The `runtime.now()` method returns a `Date` object representing DON Time—a consensus-derived timestamp that all nodes agree on. See [Time in CRE](/cre/concepts/time-in-cre) for more details. +The `runtime.now()` method returns a `Date` object representing DON Time—a consensus-derived timestamp that all nodes agree on. See [Time in CRE](/cre/guides/workflow/time-in-workflows-ts) for more details. ## 4. Working with LLMs @@ -217,6 +217,6 @@ Large Language Models (LLMs) generate different responses for the same prompt, e ## Related concepts -- **[Time in CRE](/cre/concepts/time-in-cre)**: Learn about DON Time and why `runtime.now()` is required +- **[Time in CRE](/cre/guides/workflow/time-in-workflows-ts)**: Learn about DON Time and why `runtime.now()` is required - **[Consensus Computing](/cre/concepts/consensus-computing)**: Deep dive into how nodes reach agreement - **[Core SDK Reference](/cre/reference/sdk/core-ts)**: Details on `Runtime`, `NodeRuntime`, and the `.result()` pattern diff --git a/src/content/cre/concepts/time-in-cre-go.mdx b/src/content/cre/guides/workflow/time-in-workflows-go.mdx similarity index 97% rename from src/content/cre/concepts/time-in-cre-go.mdx rename to src/content/cre/guides/workflow/time-in-workflows-go.mdx index 6515bd79819..1645b5876ce 100644 --- a/src/content/cre/concepts/time-in-cre-go.mdx +++ b/src/content/cre/guides/workflow/time-in-workflows-go.mdx @@ -1,13 +1,13 @@ --- section: cre -title: "Time in CRE" +title: "Using Time in Workflows" sdkLang: "go" -pageId: "time-in-cre" +pageId: "time-in-workflows" date: Last Modified metadata: description: "Understand DON Time in CRE: learn why all nodes need the same timestamp and how to use runtime.Now() for deterministic workflows." - datePublished: "2025-11-04" - lastModified: "2025-11-04" + datePublished: "2026-02-03" + lastModified: "2026-02-03" --- import { Aside } from "@components" diff --git a/src/content/cre/concepts/time-in-cre-ts.mdx b/src/content/cre/guides/workflow/time-in-workflows-ts.mdx similarity index 98% rename from src/content/cre/concepts/time-in-cre-ts.mdx rename to src/content/cre/guides/workflow/time-in-workflows-ts.mdx index 598543b29b8..d22bf5bc21c 100644 --- a/src/content/cre/concepts/time-in-cre-ts.mdx +++ b/src/content/cre/guides/workflow/time-in-workflows-ts.mdx @@ -1,13 +1,13 @@ --- section: cre -title: "Time in CRE" +title: "Using Time in Workflows" sdkLang: "ts" -pageId: "time-in-cre" +pageId: "time-in-workflows" date: Last Modified metadata: description: "Understand DON Time in CRE: learn why all nodes need the same timestamp and how to use runtime.now() for deterministic workflows." - datePublished: "2026-01-28" - lastModified: "2026-01-28" + datePublished: "2026-02-03" + lastModified: "2026-02-03" --- import { Aside } from "@components" diff --git a/src/content/cre/guides/workflow/using-http-client/get-request-go.mdx b/src/content/cre/guides/workflow/using-http-client/get-request-go.mdx index 9560458aaee..0af264b455c 100644 --- a/src/content/cre/guides/workflow/using-http-client/get-request-go.mdx +++ b/src/content/cre/guides/workflow/using-http-client/get-request-go.mdx @@ -7,7 +7,7 @@ pageId: "guides-workflow-http-get-request" metadata: description: "Fetch data from APIs in Go: learn to make GET requests with consensus validation to bring offchain data into your workflow." datePublished: "2025-11-04" - lastModified: "2025-12-16" + lastModified: "2026-02-03" --- import { Aside } from "@components" @@ -28,6 +28,11 @@ This guide assumes you have a basic understanding of CRE. If you are new, we str HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +{/* prettier-ignore */} + + ## Choosing your approach ### Use `http.SendRequest` (Section 1) when: diff --git a/src/content/cre/guides/workflow/using-http-client/get-request-ts.mdx b/src/content/cre/guides/workflow/using-http-client/get-request-ts.mdx index 84b21457667..838740afec1 100644 --- a/src/content/cre/guides/workflow/using-http-client/get-request-ts.mdx +++ b/src/content/cre/guides/workflow/using-http-client/get-request-ts.mdx @@ -7,7 +7,7 @@ pageId: "guides-workflow-http-get-request" metadata: description: "Fetch data from APIs in TypeScript: learn to make GET requests with consensus validation to bring offchain data into your workflow." datePublished: "2025-11-04" - lastModified: "2026-01-20" + lastModified: "2026-02-03" --- import { Aside } from "@components" @@ -28,6 +28,11 @@ This guide assumes you have a basic understanding of CRE. If you are new, we str HTTP requests to URLs that return redirects (3xx status codes) will fail. Ensure the URL you provide is the final destination and does not redirect to another URL. +{/* prettier-ignore */} + + ## Choosing your approach ### Use `sendRequest` (Section 1) when: diff --git a/src/content/cre/guides/workflow/using-http-client/index.mdx b/src/content/cre/guides/workflow/using-http-client/index.mdx index 3ec5577bb61..903b8a1a7ff 100644 --- a/src/content/cre/guides/workflow/using-http-client/index.mdx +++ b/src/content/cre/guides/workflow/using-http-client/index.mdx @@ -6,11 +6,18 @@ isIndex: true metadata: description: "Connect your workflow to external APIs: learn to make GET and POST requests with built-in consensus for secure offchain data." datePublished: "2025-11-04" - lastModified: "2025-11-04" + lastModified: "2026-02-03" --- +import { Aside } from "@components" + The CRE SDK provides an HTTP client that allows your workflows to interact with external APIs. Use it to fetch offchain data, send results to other systems, or trigger external events. +{/* prettier-ignore */} + + These guides will walk you through the common use cases for the HTTP client. ## Guides diff --git a/src/content/cre/guides/workflow/using-http-client/post-request-go.mdx b/src/content/cre/guides/workflow/using-http-client/post-request-go.mdx index 52fd49e3fe4..008586c4798 100644 --- a/src/content/cre/guides/workflow/using-http-client/post-request-go.mdx +++ b/src/content/cre/guides/workflow/using-http-client/post-request-go.mdx @@ -7,7 +7,7 @@ pageId: "guides-workflow-http-post-request" metadata: description: "Send data to external APIs in Go: learn to make POST requests from your workflow with authentication and custom headers." datePublished: "2025-11-04" - lastModified: "2025-12-16" + lastModified: "2026-02-03" --- import { Aside } from "@components" @@ -26,6 +26,11 @@ All HTTP requests are wrapped in a consensus mechanism. The SDK provides two way - **[`http.SendRequest`](#1-the-httpsendrequest-pattern-recommended):** A high-level helper function that simplifies making requests. This is the recommended approach for most use cases. - **[`cre.RunInNodeMode`](#2-the-cre-runinnodemode-pattern-low-level):** The lower-level pattern for more complex scenarios. +{/* prettier-ignore */} + + ## Choosing your approach ### Use `http.SendRequest` (Section 1) when: diff --git a/src/content/cre/guides/workflow/using-http-client/post-request-ts.mdx b/src/content/cre/guides/workflow/using-http-client/post-request-ts.mdx index 82f40a59550..6821e38c348 100644 --- a/src/content/cre/guides/workflow/using-http-client/post-request-ts.mdx +++ b/src/content/cre/guides/workflow/using-http-client/post-request-ts.mdx @@ -7,7 +7,7 @@ pageId: "guides-workflow-http-post-request" metadata: description: "Send data to external APIs in TypeScript: learn to make POST requests from your workflow with authentication and custom headers." datePublished: "2025-11-04" - lastModified: "2026-01-20" + lastModified: "2026-02-03" --- import { Aside } from "@components" @@ -26,6 +26,11 @@ All HTTP requests are wrapped in a consensus mechanism. The SDK provides two way - **[High-level `sendRequest`](#1-the-high-level-sendrequest-pattern-recommended):** A high-level helper method that simplifies making requests. This is the recommended approach for most use cases. - **[Low-level `runInNodeMode`](#2-the-low-level-runinnodemode-pattern):** The lower-level pattern for more complex scenarios. +{/* prettier-ignore */} + + ## Choosing your approach ### Use High-Level `sendRequest` (Section 1) when: diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 130e5ff44f4..4818eaca9ce 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -482,7 +482,7 @@ CRE now supports additional testnets for workflow simulation and production depl - **Bug Fix**: Fixed an issue with `runtime.now()` returning incorrect timestamps -For details on using time in workflows, see [Time in CRE](/cre/concepts/time-in-cre). +For details on using time in workflows, see [Time in CRE](/cre/guides/workflow/time-in-workflows-ts). [See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.0.4...v1.0.5) @@ -4530,10 +4530,15 @@ See the [CLI Reference](/cre/reference/cli/workflow#cre-workflow-simulate) for m # API Interactions Source: https://docs.chain.link/cre/guides/workflow/using-http-client -Last Updated: 2025-11-04 +Last Updated: 2026-02-03 The CRE SDK provides an HTTP client that allows your workflows to interact with external APIs. Use it to fetch offchain data, send results to other systems, or trigger external events. + + + These guides will walk you through the common use cases for the HTTP client. ## Guides @@ -8781,7 +8786,7 @@ By default, triggers use `SAFE` if no confidence level is specified. For details # Avoiding Non-Determinism in Workflows Source: https://docs.chain.link/cre/concepts/non-determinism-go -Last Updated: 2025-11-04 +Last Updated: 2026-02-03 + + + ## Choosing your approach ### Use `http.SendRequest` (Section 1) when: @@ -11445,7 +11455,7 @@ The `http.Request` struct provides several fields to customize your request. See # Making POST Requests Source: https://docs.chain.link/cre/guides/workflow/using-http-client/post-request-go -Last Updated: 2025-12-16 +Last Updated: 2026-02-03 This guide explains how to use the HTTP Client to send data to an external API using a `POST` request. Because POST requests typically create resources or trigger actions, this guide shows you how to ensure your request executes only once, even though multiple nodes in the DON run your workflow. @@ -11461,6 +11471,11 @@ All HTTP requests are wrapped in a consensus mechanism. The SDK provides two way - **[`http.SendRequest`](#1-the-httpsendrequest-pattern-recommended):** A high-level helper function that simplifies making requests. This is the recommended approach for most use cases. - **[`cre.RunInNodeMode`](#2-the-cre-runinnodemode-pattern-low-level):** The lower-level pattern for more complex scenarios. + + + ## Choosing your approach ### Use `http.SendRequest` (Section 1) when: @@ -14862,7 +14877,7 @@ For complete examples of including signatures in different formats (body, header # SDK Reference Source: https://docs.chain.link/cre/reference/sdk/overview-go -Last Updated: 2025-11-04 +Last Updated: 2026-02-03 This section provides a detailed technical reference for the public interfaces of the CRE Go SDK. Use this reference for quick lookups of specific functions, types, and method signatures. diff --git a/src/content/cre/llms-full-ts.txt b/src/content/cre/llms-full-ts.txt index c4de67a4524..91888bd27a2 100644 --- a/src/content/cre/llms-full-ts.txt +++ b/src/content/cre/llms-full-ts.txt @@ -482,7 +482,7 @@ CRE now supports additional testnets for workflow simulation and production depl - **Bug Fix**: Fixed an issue with `runtime.now()` returning incorrect timestamps -For details on using time in workflows, see [Time in CRE](/cre/concepts/time-in-cre). +For details on using time in workflows, see [Time in CRE](/cre/guides/workflow/time-in-workflows-ts). [See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.0.4...v1.0.5) @@ -3453,10 +3453,15 @@ if (writeResult.txStatus === TxStatus.SUCCESS) { # API Interactions Source: https://docs.chain.link/cre/guides/workflow/using-http-client -Last Updated: 2025-11-04 +Last Updated: 2026-02-03 The CRE SDK provides an HTTP client that allows your workflows to interact with external APIs. Use it to fetch offchain data, send results to other systems, or trigger external events. + + + These guides will walk you through the common use cases for the HTTP client. ## Guides @@ -7534,7 +7539,7 @@ By default, triggers use `SAFE` if no confidence level is specified. For details # Avoiding Non-Determinism in Workflows Source: https://docs.chain.link/cre/concepts/non-determinism-ts -Last Updated: 2026-01-20 +Last Updated: 2026-02-03 + + + ## Choosing your approach ### Use `sendRequest` (Section 1) when: @@ -10483,7 +10493,7 @@ The request object provides several fields to customize your HTTP call. See the # Making POST Requests Source: https://docs.chain.link/cre/guides/workflow/using-http-client/post-request-ts -Last Updated: 2026-01-20 +Last Updated: 2026-02-03 This guide explains how to use the HTTP Client to send data to an external API using a `POST` request. Because POST requests typically create resources or trigger actions, this guide shows you how to ensure your request executes only once, even though multiple nodes in the DON run your workflow. @@ -10499,6 +10509,11 @@ All HTTP requests are wrapped in a consensus mechanism. The SDK provides two way - **[High-level `sendRequest`](#1-the-high-level-sendrequest-pattern-recommended):** A high-level helper method that simplifies making requests. This is the recommended approach for most use cases. - **[Low-level `runInNodeMode`](#2-the-low-level-runinnodemode-pattern):** The lower-level pattern for more complex scenarios. + + + ## Choosing your approach ### Use High-Level `sendRequest` (Section 1) when: @@ -13219,7 +13234,7 @@ To learn more about how to aggregate results from `NodeRuntime`, see the [Consen Both `Runtime` and `NodeRuntime` provide: - **`config`**: Access to your workflow's configuration -- **`now()`**: Returns the current `Date` object. See [Time in CRE](/cre/concepts/time-in-cre-ts) for details. +- **`now()`**: Returns the current `Date` object. See [Time in CRE](/cre/guides/workflow/time-in-workflows-ts) for details. - **`log(message: string)`**: Logs a message (see [Logging](#logging) below) - **`callCapability(...)`**: Internal method for calling capabilities (used by generated code) @@ -15070,7 +15085,7 @@ const reserveInfo = httpClient # SDK Reference Source: https://docs.chain.link/cre/reference/sdk/overview-ts -Last Updated: 2026-01-29 +Last Updated: 2026-02-03 This section provides a detailed technical reference for the public interfaces of the CRE TypeScript SDK. Use this reference for quick lookups of specific functions, types, and method signatures. diff --git a/src/content/cre/reference/sdk/core-ts.mdx b/src/content/cre/reference/sdk/core-ts.mdx index 16dd5bebc54..cb9a1011c3a 100644 --- a/src/content/cre/reference/sdk/core-ts.mdx +++ b/src/content/cre/reference/sdk/core-ts.mdx @@ -99,7 +99,7 @@ To learn more about how to aggregate results from `NodeRuntime`, see the [Consen Both `Runtime` and `NodeRuntime` provide: - **`config`**: Access to your workflow's configuration -- **`now()`**: Returns the current `Date` object. See [Time in CRE](/cre/concepts/time-in-cre-ts) for details. +- **`now()`**: Returns the current `Date` object. See [Time in CRE](/cre/guides/workflow/time-in-workflows-ts) for details. - **`log(message: string)`**: Logs a message (see [Logging](#logging) below) - **`callCapability(...)`**: Internal method for calling capabilities (used by generated code) diff --git a/src/content/cre/release-notes.mdx b/src/content/cre/release-notes.mdx index d40fd367bb9..1b408f78d79 100644 --- a/src/content/cre/release-notes.mdx +++ b/src/content/cre/release-notes.mdx @@ -48,7 +48,7 @@ CRE now supports additional testnets for workflow simulation and production depl - **Bug Fix**: Fixed an issue with `runtime.now()` returning incorrect timestamps -For details on using time in workflows, see [Time in CRE](/cre/concepts/time-in-cre). +For details on using time in workflows, see [Time in CRE](/cre/guides/workflow/time-in-workflows-ts). [See all changes on GitHub](https://github.com/smartcontractkit/cre-sdk-typescript/compare/v1.0.4...v1.0.5) diff --git a/src/features/redirects/redirects.json b/src/features/redirects/redirects.json index 12723f10a1f..07a3ae89ec0 100644 --- a/src/features/redirects/redirects.json +++ b/src/features/redirects/redirects.json @@ -2589,6 +2589,21 @@ "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 } ] } From 4dfcbe921e91870bdd43f2aa1bfa6604e1a9b4d0 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:26:32 -0500 Subject: [PATCH 181/214] Rename Getting Started conclusion to "Before You Build" with key tips (#3433) * rename conclusion to Before You Build with key tips * add number precision loss callout * update int links --- src/config/sidebar.ts | 6 +- .../getting-started/before-you-build-go.mdx | 92 +++++++ .../getting-started/before-you-build-ts.mdx | 115 +++++++++ .../cre/getting-started/conclusion.mdx | 115 --------- .../part-4-writing-onchain-go.mdx | 2 +- .../part-4-writing-onchain-ts.mdx | 2 +- .../onchain-write/writing-data-onchain.mdx | 18 +- src/content/cre/llms-full-go.txt | 197 +++++++-------- src/content/cre/llms-full-ts.txt | 237 +++++++++--------- src/features/redirects/redirects.json | 5 + 10 files changed, 443 insertions(+), 346 deletions(-) create mode 100644 src/content/cre/getting-started/before-you-build-go.mdx create mode 100644 src/content/cre/getting-started/before-you-build-ts.mdx delete mode 100644 src/content/cre/getting-started/conclusion.mdx diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index 3cc950c98ed..d2fb9304b86 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -140,7 +140,11 @@ export const SIDEBAR: Partial> = { "cre/getting-started/part-4-writing-onchain-go", ], }, - { title: "Conclusion & Next Steps", url: "cre/getting-started/conclusion" }, + { + title: "Before You Build", + url: "cre/getting-started/before-you-build", + highlightAsCurrent: ["cre/getting-started/before-you-build-ts", "cre/getting-started/before-you-build-go"], + }, ], }, { diff --git a/src/content/cre/getting-started/before-you-build-go.mdx b/src/content/cre/getting-started/before-you-build-go.mdx new file mode 100644 index 00000000000..d9547b74bc8 --- /dev/null +++ b/src/content/cre/getting-started/before-you-build-go.mdx @@ -0,0 +1,92 @@ +--- +section: cre +title: "Before You Build" +date: Last Modified +pageId: "getting-started-before-you-build" +sdkLang: "go" +metadata: + description: "Essential tips before building your own CRE workflows: working with time, randomness, and next steps for production deployment." + datePublished: "2026-02-04" + lastModified: "2026-02-04" +--- + +import { Aside } from "@components" + +You've completed the Getting Started guide and built a workflow that fetches offchain data, reads from a smart contract, performs calculations, and writes results onchain. You're ready to build your own workflows. + +Before you do, take two minutes to understand how CRE differs from typical development. These tips will save you debugging time. + +## Working with time + +If your workflow uses timestamps (e.g., for API authentication or time-based queries), use `runtime.Now()` instead of `time.Now()`. This ensures all nodes in the DON use the same timestamp and can reach consensus. + +{/* prettier-ignore */} + + +## Working with randomness + +If your workflow needs random values (e.g., selecting a winner or generating nonces), use `runtime.Rand()` instead of Go's `rand` package. This ensures all nodes generate the same random sequence and can reach consensus. + +{/* prettier-ignore */} + + +{/* prettier-ignore */} + + +## What's next? + +Here are resources to help you go from simulation to production. + +### Learn from examples + +- **[Run the Custom Data Feed Demo](/cre/templates/running-demo-workflow)** — A starter template you can run locally and customize +- **[Browse all Templates](/cre/templates)** — Building blocks for specific patterns (secrets, HTTP auth, streams) and starter templates +- **[AI-Powered Prediction Market](/cre/demos/prediction-market)** — Full end-to-end demo integrating CRE with Gemini AI and Firebase + +### Deploy to production + +{/* prettier-ignore */} + + +1. **[Link a Wallet Key](/cre/organization/linking-keys)** — Connect your wallet to your organization +1. **[Deploy Your Workflow](/cre/guides/operations/deploying-workflows)** — Push your workflow live +1. **[Monitor Your Workflow](/cre/guides/operations/monitoring-workflows)** — Watch it execute and debug issues + +### Explore different triggers + +You used a Cron trigger. Most production workflows react to events: + +- **[HTTP Trigger](/cre/guides/workflow/using-triggers/http-trigger/overview)** — Trigger via API calls +- **[EVM Log Trigger](/cre/guides/workflow/using-triggers/evm-log-trigger)** — React to onchain events + +### Add secrets + +Real workflows need API keys and sensitive data: + +- **[Using Secrets in Simulation](/cre/guides/workflow/secrets/using-secrets-simulation)** — Local development +- **[Using Secrets with Deployed Workflows](/cre/guides/workflow/secrets/using-secrets-deployed)** — Store secrets in the Vault DON for production +- **[Managing Secrets with 1Password](/cre/guides/workflow/secrets/managing-secrets-1password)** — Best practice: inject secrets at runtime + +### Build your own consumer contract + +- **[Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts)** — Create contracts that receive CRE data + +## Reference + +Dive deeper into concepts from this guide: + +| Topic | Resources | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **Workflow structure** | [Core SDK](/cre/reference/sdk/core), [Triggers Overview](/cre/guides/workflow/using-triggers/overview) | +| **HTTP & offchain data** | [API Interactions](/cre/guides/workflow/using-http-client), [Consensus & Aggregation](/cre/reference/sdk/consensus) | +| **EVM interactions** | [EVM Client Overview](/cre/guides/workflow/using-evm-client/overview), [Onchain Read](/cre/guides/workflow/using-evm-client/onchain-read), [Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write/overview) | +| **Configuration** | [Project Configuration](/cre/reference/project-configuration), [Secrets Guide](/cre/guides/workflow/secrets) | +| **All capabilities** | [Capabilities Overview](/cre/capabilities) | diff --git a/src/content/cre/getting-started/before-you-build-ts.mdx b/src/content/cre/getting-started/before-you-build-ts.mdx new file mode 100644 index 00000000000..031aa7a0f56 --- /dev/null +++ b/src/content/cre/getting-started/before-you-build-ts.mdx @@ -0,0 +1,115 @@ +--- +section: cre +title: "Before You Build" +date: Last Modified +pageId: "getting-started-before-you-build" +sdkLang: "ts" +metadata: + description: "Essential tips before building your own CRE workflows: library compatibility, Solidity integers, working with time, and next steps for production deployment." + datePublished: "2026-02-04" + lastModified: "2026-02-04" +--- + +import { Aside } from "@components" + +You've completed the Getting Started guide and built a workflow that fetches offchain data, reads from a smart contract, performs calculations, and writes results onchain. You're ready to build your own workflows. + +Before you do, take two minutes to understand how CRE differs from typical development. These tips will save you debugging time. + +## Library compatibility + +Your TypeScript code compiles to WebAssembly and runs in a QuickJS environment, **not Node.js**. Some NPM packages won't work if they rely on Node.js-specific APIs like `node:crypto` or `node:fs`. + +**Before using a third-party package:** + +1. Check if it relies on Node.js built-in modules +1. Test with `cre workflow simulate` — simulation uses the same WASM environment as production, so compatibility issues surface immediately + +{/* prettier-ignore */} + + +## Working with Solidity integers + +When sending values to smart contracts, always use `bigint` (with the `n` suffix) in your workflow code. JavaScript `number` loses precision for large values, causing **silent precision loss**. + +```typescript +// WRONG - silent precision loss +const amount = 10000000000000001 // 10 quadrillion + 1 +// Silently becomes 10000000000000000 (the +1 vanishes) + +// CORRECT - use bigint +const amount = 10000000000000001n // Stays exactly 10000000000000001 +``` + +{/* prettier-ignore */} + + +## Working with time + +If your workflow uses timestamps (e.g., for API authentication or time-based queries), use `runtime.now()` instead of `Date.now()`. This ensures all nodes in the DON use the same timestamp and can reach consensus. + +{/* prettier-ignore */} + + +{/* prettier-ignore */} + + +## What's next? + +Here are resources to help you go from simulation to production. + +### Learn from examples + +- **[Run the Custom Data Feed Demo](/cre/templates/running-demo-workflow)** — A starter template you can run locally and customize +- **[Browse all Templates](/cre/templates)** — Building blocks for specific patterns (secrets, HTTP auth, streams) and starter templates +- **[AI-Powered Prediction Market](/cre/demos/prediction-market)** — Full end-to-end demo integrating CRE with Gemini AI and Firebase + +### Deploy to production + +{/* prettier-ignore */} + + +1. **[Link a Wallet Key](/cre/organization/linking-keys)** — Connect your wallet to your organization +1. **[Deploy Your Workflow](/cre/guides/operations/deploying-workflows)** — Push your workflow live +1. **[Monitor Your Workflow](/cre/guides/operations/monitoring-workflows)** — Watch it execute and debug issues + +### Explore different triggers + +You used a Cron trigger. Most production workflows react to events: + +- **[HTTP Trigger](/cre/guides/workflow/using-triggers/http-trigger/overview)** — Trigger via API calls +- **[EVM Log Trigger](/cre/guides/workflow/using-triggers/evm-log-trigger)** — React to onchain events + +### Add secrets + +Real workflows need API keys and sensitive data: + +- **[Using Secrets in Simulation](/cre/guides/workflow/secrets/using-secrets-simulation)** — Local development +- **[Using Secrets with Deployed Workflows](/cre/guides/workflow/secrets/using-secrets-deployed)** — Store secrets in the Vault DON for production +- **[Managing Secrets with 1Password](/cre/guides/workflow/secrets/managing-secrets-1password)** — Best practice: inject secrets at runtime + +### Build your own consumer contract + +- **[Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts)** — Create contracts that receive CRE data + +## Reference + +Dive deeper into concepts from this guide: + +| Topic | Resources | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **Workflow structure** | [Core SDK](/cre/reference/sdk/core), [Triggers Overview](/cre/guides/workflow/using-triggers/overview) | +| **HTTP & offchain data** | [API Interactions](/cre/guides/workflow/using-http-client), [Consensus & Aggregation](/cre/reference/sdk/consensus) | +| **EVM interactions** | [EVM Client Overview](/cre/guides/workflow/using-evm-client/overview), [Onchain Read](/cre/guides/workflow/using-evm-client/onchain-read), [Onchain Write](/cre/guides/workflow/using-evm-client/onchain-write/overview) | +| **Configuration** | [Project Configuration](/cre/reference/project-configuration), [Secrets Guide](/cre/guides/workflow/secrets) | +| **All capabilities** | [Capabilities Overview](/cre/capabilities) | diff --git a/src/content/cre/getting-started/conclusion.mdx b/src/content/cre/getting-started/conclusion.mdx deleted file mode 100644 index 7d62e3c1910..00000000000 --- a/src/content/cre/getting-started/conclusion.mdx +++ /dev/null @@ -1,115 +0,0 @@ ---- -section: cre -title: "Conclusion & Next Steps" -date: Last Modified -metadata: - description: "Getting started conclusion: next steps after completing the tutorial - deploy to production, explore triggers, and build custom contracts." - datePublished: "2025-11-04" - lastModified: "2025-11-04" ---- - -import { Aside } from "@components" - -You've built a complete, end-to-end CRE workflow from scratch. - -You started with an empty project and progressively built a workflow that: - -- Fetches data from an offchain API with consensus -- Reads values from a smart contract -- Performs calculations combining onchain and offchain data -- Writes results back to the blockchain - -**This is no small achievement.** You've mastered the core pattern that powers most CRE workflows: the trigger-and-callback model with capabilities for HTTP, EVM, and consensus. - -## What's next? - -Now that you have a working workflow, here's your natural progression from simulation to production and beyond. - -### 1. See a complete example - -Ready to see all these concepts in a more complex, real-world scenario? - -- **[Run the Custom Data Feed Demo](/cre/templates/running-demo-workflow)** - Explore an advanced template that combines multiple capabilities - -**Why this matters:** Templates show production-ready patterns. - -### 2. Deploy your Calculator workflow to Production - -You've simulated your workflow locally. **The logical next step is to deploy it to the CRE production environment** so it runs across a Decentralized Oracle Network (DON). - -{/* prettier-ignore */} - - -**Follow this deployment sequence:** - -1. **[Link a Wallet Key](/cre/organization/linking-keys)** - Connect your wallet address to your organization (required before deployment) -1. **[Deploy Your Workflow](/cre/guides/operations/deploying-workflows)** - Push your calculator workflow live -1. **[Monitor Your Workflow](/cre/guides/operations/monitoring-workflows)** - Watch it execute in production and debug any issues - -**Why this matters:** Deploying moves your workflow from local simulation to production execution across a DON. - -### 3. Explore different triggers - -You used a **Cron trigger** (time-based). **Most production workflows react to real-world events.** - -**Try these next:** - -- **[HTTP Trigger](/cre/guides/workflow/using-triggers/http-trigger/overview)** - Let external systems trigger your workflow via API calls -- **[EVM Log Trigger](/cre/guides/workflow/using-triggers/evm-log-trigger)** - React to onchain events (e.g., token transfers, contract events) - -**Why this matters:** Event-driven workflows are more powerful than scheduled ones. They respond instantly to real-world changes. - -### 4. Add secrets - -Your calculator used a public API. **Real workflows often need API keys and other sensitive data.** - -**Learn how to secure your secrets:** - -- **[Using Secrets in Simulation](/cre/guides/workflow/secrets/using-secrets-simulation)** - Store secrets in your local environment for development -- **[Using Secrets with Deployed Workflows](/cre/guides/workflow/secrets/using-secrets-deployed)** - Store secrets in the Vault DON for production -- **[Managing Secrets with 1Password](/cre/guides/workflow/secrets/managing-secrets-1password)** - Best practice: inject secrets at runtime - -**Why this matters:** Hardcoded credentials are a security risk. CRE's secrets management lets you safely use authenticated APIs and private keys. - -### 5. Build your own consumer contract - -You used a **pre-deployed consumer contract**. **For production workflows, you'll create custom contracts tailored to your use case.** - -**Learn the secure pattern:** - -- **[Building Consumer Contracts](/cre/guides/workflow/using-evm-client/onchain-write/building-consumer-contracts)** - Create contracts that safely receive CRE data - -**Why this matters:** Consumer contracts enforce business logic and validation onchain, enabling trustless and verifiable execution. - -## Reference: Deepen Your Understanding - -Want to dive deeper into specific concepts from the Getting Started guide? Use this section as a quick reference. - -**Workflow Structure & Triggers** - -- **[Core SDK Reference](/cre/reference/sdk/core/)** - Fundamental building blocks (`InitWorkflow`, `Handler`, `Runtime`) -- **[Triggers Overview](/cre/guides/workflow/using-triggers/overview)** - Compare all available event sources - -**HTTP & Offchain Data** - -- **[API Interactions Guide](/cre/guides/workflow/using-http-client/)** - Complete patterns for HTTP requests -- **[Consensus & Aggregation](/cre/reference/sdk/consensus)** - All aggregation methods (median, mode, custom) -- **[Consensus Computing Concept](/cre/concepts/consensus-computing)** - How CRE's consensus-based execution works - -**EVM & Onchain Interactions** - -- **[EVM Client Overview](/cre/guides/workflow/using-evm-client/overview)** - Introduction to smart contract interactions -- **[Onchain Read Guide](/cre/guides/workflow/using-evm-client/onchain-read)** - Reading from a smart contract -- **[Onchain Write Guide](/cre/guides/workflow/using-evm-client/onchain-write/overview)** - Complete write patterns and report generation - -**Configuration & Secrets** - -- **[Project Configuration](/cre/reference/project-configuration/)** - Complete guide to `project.yaml`, `workflow.yaml`, and targets -- **[Secrets Guide](/cre/guides/workflow/secrets)** - All secrets management patterns - -**All Capabilities** - -- **[Capabilities Overview](/cre/capabilities/)** - See the full list of CRE capabilities and how they work together diff --git a/src/content/cre/getting-started/part-4-writing-onchain-go.mdx b/src/content/cre/getting-started/part-4-writing-onchain-go.mdx index 2dc7b2d5ba5..145ef82f504 100644 --- a/src/content/cre/getting-started/part-4-writing-onchain-go.mdx +++ b/src/content/cre/getting-started/part-4-writing-onchain-go.mdx @@ -204,4 +204,4 @@ To learn more about implementing consumer contracts and the secure write process You've now mastered the complete CRE development workflow! -- **[Conclusion & Next Steps](/cre/getting-started/conclusion)**: Review what you've learned and find resources for advanced topics. +- **[Before You Build](/cre/getting-started/before-you-build-go)**: Don't skip this — critical tips before building your own workflows. diff --git a/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx b/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx index 226b8719fef..8f890d953cf 100644 --- a/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx +++ b/src/content/cre/getting-started/part-4-writing-onchain-ts.mdx @@ -205,4 +205,4 @@ To learn more about implementing consumer contracts and the secure write process You've now mastered the complete CRE development workflow! -- **[Conclusion & Next Steps](/cre/getting-started/conclusion)**: Review what you've learned and find resources for advanced topics. +- **[Before You Build](/cre/getting-started/before-you-build-ts)**: Don't skip this — critical tips before building your own workflows. diff --git a/src/content/cre/guides/workflow/using-evm-client/onchain-write/writing-data-onchain.mdx b/src/content/cre/guides/workflow/using-evm-client/onchain-write/writing-data-onchain.mdx index ee480ef131e..ac97779cba8 100644 --- a/src/content/cre/guides/workflow/using-evm-client/onchain-write/writing-data-onchain.mdx +++ b/src/content/cre/guides/workflow/using-evm-client/onchain-write/writing-data-onchain.mdx @@ -88,9 +88,21 @@ const reportData = encodeAbiParameters(parseAbiParameters("address"), ["0x123456 const reportData = encodeAbiParameters(parseAbiParameters("bool"), [true]) ``` -
{metadata.docs.shutdownDate && (
@@ -288,30 +306,40 @@ const DefaultTr = ({ network, metadata, showExtraDetails, batchedCategoryData, d )}
-
- - - {metadata.proxyAddress ?? metadata.transmissionsAccount} - -
+ {isTokenizedEquity ? ( + // Tokenized equity feeds show a contact email instead of proxy address + + Contact us:{" "} + + {TOKENIZED_EQUITY_CONTACT_EMAIL} + + + ) : ( +
+ + + {metadata.proxyAddress ?? metadata.transmissionsAccount} + +
+ )}
{metadata.assetName && ( @@ -353,31 +381,43 @@ const DefaultTr = ({ network, metadata, showExtraDetails, batchedCategoryData, d {isAaveSVR(metadata) ? "AAVE SVR Proxy:" : "SVR Proxy:"}
- - - {metadata.secondaryProxyAddress} - + {isTokenizedEquity ? ( + // Tokenized equity feeds show a contact email instead of SVR proxy address + + Contact us:{" "} + + {TOKENIZED_EQUITY_CONTACT_EMAIL} + + + ) : ( + <> + + + {metadata.secondaryProxyAddress} + + + )}
- {isAaveSVR(metadata) && ( + {isAaveSVR(metadata) && !isTokenizedEquity && (
⚠️ Aave Dedicated Feed: This SVR proxy feed is dedicated exclusively for use by the Aave protocol. Learn more about{" "} @@ -387,7 +427,7 @@ const DefaultTr = ({ network, metadata, showExtraDetails, batchedCategoryData, d .
)} - {isSharedSVR(metadata) && ( + {isSharedSVR(metadata) && !isTokenizedEquity && (
🔗 SVR Feed: This SVR proxy feed is usable by any protocol. Learn more about{" "} @@ -1195,6 +1235,7 @@ export const MainnetTable = ({ currentPage, paginate, searchValue, + tokenizedEquityProvider, }: { network: ChainNetwork showExtraDetails: boolean @@ -1214,6 +1255,7 @@ export const MainnetTable = ({ currentPage: number paginate searchValue: string + tokenizedEquityProvider?: string }) => { if (!network.metadata) return null @@ -1278,6 +1320,7 @@ export const MainnetTable = ({ streamCategoryFilter, rwaSchemaFilter, showOnlyMVRFeeds, + tokenizedEquityProvider, }) }) .filter((metadata) => { @@ -1459,6 +1502,7 @@ export const TestnetTable = ({ streamCategoryFilter, show24x5Feeds, tradingHoursFilter, + tokenizedEquityProvider, }: { network: ChainNetwork showExtraDetails: boolean @@ -1476,6 +1520,7 @@ export const TestnetTable = ({ streamCategoryFilter?: "all" | "datalink" | "equities" | "forex" show24x5Feeds?: boolean tradingHoursFilter?: "all" | "regular" | "extended" | "overnight" + tokenizedEquityProvider?: string }) => { if (!network.metadata) return null @@ -1531,6 +1576,7 @@ export const TestnetTable = ({ streamCategoryFilter, rwaSchemaFilter, showOnlyMVRFeeds, + tokenizedEquityProvider, }) }) .filter((metadata) => { diff --git a/src/features/feeds/utils/feedVisibility.ts b/src/features/feeds/utils/feedVisibility.ts index ab42620dd13..2eaa09556b8 100644 --- a/src/features/feeds/utils/feedVisibility.ts +++ b/src/features/feeds/utils/feedVisibility.ts @@ -37,6 +37,7 @@ export interface FeedVisibilityOptions { streamCategoryFilter?: string rwaSchemaFilter?: string showOnlyMVRFeeds?: boolean + tokenizedEquityProvider?: string // Filter tokenized equity feeds by provider (e.g., "ondo") } /** @@ -58,7 +59,10 @@ export function isFeedVisible( // =========================================================================== // 1. Universal Exclusions // =========================================================================== - if (feed.docs?.hidden) return false + // 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 = @@ -112,6 +116,10 @@ export function isFeedVisible( isVisible = feed.docs?.productTypeCode === "RefMacro" } else if (isRates) { isVisible = feed.docs?.productType === "Rates" || feed.docs?.productSubType === "Realized Volatility" + } else if (isTokenizedEquity) { + // Tokenized equity feeds (Ondo and other providers) + // Filter by assetClass "Equities" for Data Feeds (not Streams verifier contracts) + isVisible = feed.docs?.assetClass === "Equities" && feed.contractType !== "verifier" } else { // Default data feeds (Standard Price Feeds) // Exclude all special types to leave only the standard feeds @@ -154,5 +162,22 @@ export function isFeedVisible( 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/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" + + From 661895c25ce1056c7c0e8ad5192ba3337eab1b07 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Wed, 11 Feb 2026 13:23:58 -0500 Subject: [PATCH 196/214] httpConf capability & CLI v1.0.10 (#3452) --- public/changelog.json | 21 + src/components/DownloadButton.tsx | 2 +- src/config/sidebar.ts | 27 + .../cre/capabilities/confidential-http-go.mdx | 117 +++ .../cre/capabilities/confidential-http-ts.mdx | 117 +++ src/content/cre/capabilities/index.mdx | 3 +- .../cli-installation/macos-linux.mdx | 14 +- .../cli-installation/windows.mdx | 14 +- .../using-confidential-http-client/index.mdx | 25 + .../making-requests-go.mdx | 400 ++++++++ .../making-requests-ts.mdx | 319 +++++++ src/content/cre/llms-full-go.txt | 885 +++++++++++++++++- src/content/cre/llms-full-ts.txt | 841 ++++++++++++++++- src/content/cre/reference/cli/index.mdx | 6 +- src/content/cre/reference/cli/utilities.mdx | 4 +- .../sdk/confidential-http-client-go.mdx | 284 ++++++ .../sdk/confidential-http-client-ts.mdx | 321 +++++++ src/content/cre/reference/sdk/overview-go.mdx | 1 + src/content/cre/reference/sdk/overview-ts.mdx | 1 + src/content/cre/release-notes.mdx | 44 +- 20 files changed, 3382 insertions(+), 64 deletions(-) create mode 100644 src/content/cre/capabilities/confidential-http-go.mdx create mode 100644 src/content/cre/capabilities/confidential-http-ts.mdx create mode 100644 src/content/cre/guides/workflow/using-confidential-http-client/index.mdx create mode 100644 src/content/cre/guides/workflow/using-confidential-http-client/making-requests-go.mdx create mode 100644 src/content/cre/guides/workflow/using-confidential-http-client/making-requests-ts.mdx create mode 100644 src/content/cre/reference/sdk/confidential-http-client-go.mdx create mode 100644 src/content/cre/reference/sdk/confidential-http-client-ts.mdx diff --git a/public/changelog.json b/public/changelog.json index b45786a54a8..5f5cb2f37fd 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -397,6 +397,13 @@ "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", @@ -617,6 +624,20 @@ "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", diff --git a/src/components/DownloadButton.tsx b/src/components/DownloadButton.tsx index bdf896037a3..43c45239725 100644 --- a/src/components/DownloadButton.tsx +++ b/src/components/DownloadButton.tsx @@ -15,7 +15,7 @@ export const DownloadButton = () => { } const handleClick = () => { - window.open("https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.7", "_blank", "noopener,noreferrer") + window.open("https://github.com/smartcontractkit/cre-cli/releases/tag/v1.0.10", "_blank", "noopener,noreferrer") } const handleMouseOver = (e) => { diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index a5b3dd23a7c..1e984dbf1d2 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -296,6 +296,20 @@ export const SIDEBAR: Partial> = { }, ], }, + { + title: "Confidential API Interactions (Experimental)", + url: "cre/guides/workflow/using-confidential-http-client", + children: [ + { + title: "Making Confidential Requests", + url: "cre/guides/workflow/using-confidential-http-client/making-requests", + highlightAsCurrent: [ + "cre/guides/workflow/using-confidential-http-client/making-requests-ts", + "cre/guides/workflow/using-confidential-http-client/making-requests-go", + ], + }, + ], + }, { title: "Secrets", url: "cre/guides/workflow/secrets", @@ -409,6 +423,11 @@ export const SIDEBAR: Partial> = { { title: "Overview", url: "cre/capabilities" }, { title: "Triggers", url: "cre/capabilities/triggers" }, { title: "HTTP", url: "cre/capabilities/http" }, + { + title: "Confidential HTTP (Experimental)", + url: "cre/capabilities/confidential-http", + highlightAsCurrent: ["cre/capabilities/confidential-http-ts", "cre/capabilities/confidential-http-go"], + }, { title: "EVM Read & Write", url: "cre/capabilities/evm-read-write" }, ], }, @@ -533,6 +552,14 @@ export const SIDEBAR: Partial> = { url: "cre/reference/sdk/http-client", highlightAsCurrent: ["cre/reference/sdk/http-client-ts", "cre/reference/sdk/http-client-go"], }, + { + title: "Confidential HTTP Client (Experimental)", + url: "cre/reference/sdk/confidential-http-client", + highlightAsCurrent: [ + "cre/reference/sdk/confidential-http-client-ts", + "cre/reference/sdk/confidential-http-client-go", + ], + }, { title: "Consensus & Aggregation", url: "cre/reference/sdk/consensus", diff --git a/src/content/cre/capabilities/confidential-http-go.mdx b/src/content/cre/capabilities/confidential-http-go.mdx new file mode 100644 index 00000000000..8980d625c47 --- /dev/null +++ b/src/content/cre/capabilities/confidential-http-go.mdx @@ -0,0 +1,117 @@ +--- +section: cre +title: "The Confidential HTTP Capability (Experimental)" +date: Last Modified +sdkLang: "go" +pageId: "confidential-http" +metadata: + description: "CRE Confidential HTTP capability: make privacy-preserving API calls with enclave execution, secret injection, and optional response encryption." + datePublished: "2026-02-06" + lastModified: "2026-02-06" +--- + +import { Aside } from "@components" + + + +The **Confidential HTTP** capability is a privacy-preserving HTTP service powered by the Chainlink Privacy Standard. It enables your workflow to interact with external APIs while keeping sensitive data—such as API credentials, request body fields, and response data—confidential. + +## The problem it solves + +Traditional consensus mechanisms require all nodes to see and agree on the same data. While this provides strong reliability and tamper resistance, it creates challenges for use cases with strict privacy requirements: + +- **Regulatory compliance:** Some industries require that sensitive data never be exposed to multiple parties. +- **Credential security:** High-risk API credentials could cause damage if compromised or exposed in node memory. +- **Response privacy:** API responses may contain sensitive fields that should not be visible to the decentralized network. + +Confidential HTTP addresses these challenges by executing requests inside a **secure enclave** and offering optional **response encryption**. + +## How it works + +Confidential HTTP operates differently from the [regular HTTP capability](/cre/capabilities/http): + +1. **Request consensus:** Nodes in the Confidential HTTP DON reach quorum on the request parameters (forwarded by each Workflow DON node). +1. **Secret retrieval:** The Confidential HTTP DON fetches encrypted secrets from the [Vault DON](/cre/guides/workflow/secrets/using-secrets-deployed). +1. **Enclave execution:** Secrets are decrypted and injected into the request inside a secure enclave. The HTTP request executes from the enclave—credentials never exist in accessible memory. +1. **Response:** The response is returned to your workflow. If `EncryptOutput` is enabled, the response body is encrypted before leaving the enclave. + +This approach ensures: + +- **Credential isolation:** Secrets are encrypted at rest and in transit, and are decrypted only inside the enclave—never in node memory. +- **Response privacy:** You can optionally encrypt the full response body so that it leaves the enclave encrypted and can be decrypted only in your own backend service. +- **Single execution:** Exactly one API call is made, not one per node. + +## What's kept confidential + +| Component | How it's protected | +| :----------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Secrets** (API keys, tokens) | Fully confidential. Stored in the Vault DON, decrypted only inside the enclave. | +| **Request body** | Template-based injection: secrets referenced in the request body (e.g., `{{.myApiKey}}`) are resolved inside the enclave, so sensitive values never appear in workflow memory. | +| **Response body** | Optionally encrypted. When `EncryptOutput` is enabled, the full response is [AES-GCM](https://en.wikipedia.org/wiki/Galois/Counter_Mode) encrypted before leaving the enclave. | + +## Use cases + +### Credential isolation + +A SaaS service fetches user data from an e-commerce provider API. The same credential could also modify user data if misused. Confidential HTTP ensures the credential is decrypted only inside the enclave, never accessible in node memory. + +### Response encryption + +A workflow calls a payment processor API to execute a transaction. The API response includes the transaction ID and success status, but also returns sensitive data like the user's account balance and an internal risk score. With Confidential HTTP and `EncryptOutput` enabled, the full response is encrypted before leaving the enclave—it can only be decrypted using the encryption key, for example in your own backend service. + +### Processing sensitive request data + +A workflow processes card transactions where the request contains card details and the API key provides processor access. Confidential HTTP keeps both the credentials and card details private through template-based injection, returning only the encrypted response to the workflow. + +### Guaranteed single execution + +An API endpoint cannot tolerate duplicate requests (e.g., initiating a payment or creating a unique transaction). + +With the [regular HTTP capability](/cre/capabilities/http), each node in the DON executes the request independently to reach consensus on the response. For non-idempotent operations, [`cacheSettings` mitigates](/cre/guides/workflow/using-http-client/post-request-go#1-understanding-single-execution-with-cachesettings) this by enabling nodes to share cached responses, reducing duplicate calls in most cases. + +Confidential HTTP takes a different approach: by design, only one request is ever made from the enclave after quorum is reached on the request parameters. This provides an **architectural guarantee** of single execution. + +## When to use Confidential HTTP vs. regular HTTP + +### Use Confidential HTTP when: + +- The API response contains sensitive data that should not be visible to the network +- API credentials must never be accessible in node memory (enclave-only access) +- You need exactly one API call with zero tolerance for duplicates +- Regulatory or compliance requirements mandate data confidentiality + +### Use regular HTTP when: + +- **Querying multiple APIs and combining results**: For example, fetching prices from 3 different sources and computing a median. Each node calls all APIs, aggregates locally, then nodes reach consensus on the final value. + +- **Transforming data before consensus**: For example, parsing a complex API response, filtering fields, or performing calculations on the data before nodes agree on the result. + +- **Computing with a secret before the request**: For example, generating an HMAC signature for API authentication — use the [`runInNodeMode` pattern](/cre/guides/workflow/using-http-client/post-request-go#2-the-creruninnodemode-pattern-alternative) to access secrets and perform computations before making the request. + +- **No confidentiality requirements**: The API response doesn't contain sensitive data, and you don't need enclave-level protection for credentials. + +## Key differences from regular HTTP + +| Aspect | Regular HTTP | Confidential HTTP | +| :------------------------ | :------------------------------------ | :----------------------------- | +| **API calls** | One per node (multiple)\* | Exactly one (single) | +| **Consensus target** | Response data | Request parameters | +| **Execution environment** | Each node individually | Secure enclave | +| **Secrets exposure** | Decrypted in Workflow DON node memory | Decrypted only in the enclave | +| **Response handling** | Full response to all nodes | Optionally encrypted (AES-GCM) | +| **Data transformation** | Supported in workflow code | Not yet supported in enclave | + +\*For non-idempotent operations (POST, PUT, PATCH, DELETE), [`cacheSettings`](/cre/guides/workflow/using-http-client/post-request#1-understanding-single-execution-with-cachesettings) enables nodes to share cached responses, reducing multiple calls to a single execution in most cases. + + + +## Learn more + +- **[Confidential API Interactions Guide](/cre/guides/workflow/using-confidential-http-client)**: Learn how to use the SDK to invoke the Confidential HTTP capability. +- **[Confidential HTTP Client SDK Reference](/cre/reference/sdk/confidential-http-client)**: See the detailed API reference for the `confidentialhttp.Client`. diff --git a/src/content/cre/capabilities/confidential-http-ts.mdx b/src/content/cre/capabilities/confidential-http-ts.mdx new file mode 100644 index 00000000000..5a58ad9b1f8 --- /dev/null +++ b/src/content/cre/capabilities/confidential-http-ts.mdx @@ -0,0 +1,117 @@ +--- +section: cre +title: "The Confidential HTTP Capability (Experimental)" +date: Last Modified +sdkLang: "ts" +pageId: "confidential-http" +metadata: + description: "CRE Confidential HTTP capability: make privacy-preserving API calls with enclave execution, secret injection, and optional response encryption." + datePublished: "2026-02-06" + lastModified: "2026-02-06" +--- + +import { Aside } from "@components" + + + +The **Confidential HTTP** capability is a privacy-preserving HTTP service powered by the Chainlink Privacy Standard. It enables your workflow to interact with external APIs while keeping sensitive data—such as API credentials, request body fields, and response data—confidential. + +## The problem it solves + +Traditional consensus mechanisms require all nodes to see and agree on the same data. While this provides strong reliability and tamper resistance, it creates challenges for use cases with strict privacy requirements: + +- **Regulatory compliance:** Some industries require that sensitive data never be exposed to multiple parties. +- **Credential security:** High-risk API credentials could cause damage if compromised or exposed in node memory. +- **Response privacy:** API responses may contain sensitive fields that should not be visible to the decentralized network. + +Confidential HTTP addresses these challenges by executing requests inside a **secure enclave** and offering optional **response encryption**. + +## How it works + +Confidential HTTP operates differently from the [regular HTTP capability](/cre/capabilities/http): + +1. **Request consensus:** Nodes in the Confidential HTTP DON reach quorum on the request parameters (forwarded by each Workflow DON node). +1. **Secret retrieval:** The Confidential HTTP DON fetches encrypted secrets from the [Vault DON](/cre/guides/workflow/secrets/using-secrets-deployed). +1. **Enclave execution:** Secrets are decrypted and injected into the request inside a secure enclave. The HTTP request executes from the enclave—credentials never exist in accessible memory. +1. **Response:** The response is returned to your workflow. If `EncryptOutput` is enabled, the response body is encrypted before leaving the enclave. + +This approach ensures: + +- **Credential isolation:** Secrets are encrypted at rest and in transit, and are decrypted only inside the enclave—never in node memory. +- **Response privacy:** You can optionally encrypt the full response body so that it leaves the enclave encrypted and can be decrypted only in your own backend service. +- **Single execution:** Exactly one API call is made, not one per node. + +## What's kept confidential + +| Component | How it's protected | +| :----------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Secrets** (API keys, tokens) | Fully confidential. Stored in the Vault DON, decrypted only inside the enclave. | +| **Request body** | Template-based injection: secrets referenced in the request body (e.g., `{{.myApiKey}}`) are resolved inside the enclave, so sensitive values never appear in workflow memory. | +| **Response body** | Optionally encrypted. When `EncryptOutput` is enabled, the full response is [AES-GCM](https://en.wikipedia.org/wiki/Galois/Counter_Mode) encrypted before leaving the enclave. | + +## Use cases + +### Credential isolation + +A SaaS service fetches user data from an e-commerce provider API. The same credential could also modify user data if misused. Confidential HTTP ensures the credential is decrypted only inside the enclave, never accessible in node memory. + +### Response encryption + +A workflow calls a payment processor API to execute a transaction. The API response includes the transaction ID and success status, but also returns sensitive data like the user's account balance and an internal risk score. With Confidential HTTP and `EncryptOutput` enabled, the full response is encrypted before leaving the enclave—it can only be decrypted using the encryption key, for example in your own backend service. + +### Processing sensitive request data + +A workflow processes card transactions where the request contains card details and the API key provides processor access. Confidential HTTP keeps both the credentials and card details private through template-based injection, returning only the encrypted response to the workflow. + +### Guaranteed single execution + +An API endpoint cannot tolerate duplicate requests (e.g., initiating a payment or creating a unique transaction). + +With the [regular HTTP capability](/cre/capabilities/http), each node in the DON executes the request independently to reach consensus on the response. For non-idempotent operations, [`cacheSettings` mitigates](/cre/guides/workflow/using-http-client/post-request-ts#1-understanding-single-execution-with-cachesettings) this by enabling nodes to share cached responses, reducing duplicate calls in most cases. + +Confidential HTTP takes a different approach: by design, only one request is ever made from the enclave after quorum is reached on the request parameters. This provides an **architectural guarantee** of single execution. + +## When to use Confidential HTTP vs. regular HTTP + +### Use Confidential HTTP when: + +- The API response contains sensitive data that should not be visible to the network +- API credentials must never be accessible in node memory (enclave-only access) +- You need exactly one API call with zero tolerance for duplicates +- Regulatory or compliance requirements mandate data confidentiality + +### Use regular HTTP when: + +- **Querying multiple APIs and combining results**: For example, fetching prices from 3 different sources and computing a median. Each node calls all APIs, aggregates locally, then nodes reach consensus on the final value. + +- **Transforming data before consensus**: For example, parsing a complex API response, filtering fields, or performing calculations on the data before nodes agree on the result. + +- **Computing with a secret before the request**: For example, generating an HMAC signature for API authentication — use the [`runInNodeMode` pattern](/cre/guides/workflow/using-http-client/post-request-ts#2-the-low-level-runinnodemode-pattern) to access secrets and perform computations before making the request. + +- **No confidentiality requirements**: The API response doesn't contain sensitive data, and you don't need enclave-level protection for credentials. + +## Key differences from regular HTTP + +| Aspect | Regular HTTP | Confidential HTTP | +| :------------------------ | :------------------------------------ | :----------------------------- | +| **API calls** | One per node (multiple)\* | Exactly one (single) | +| **Consensus target** | Response data | Request parameters | +| **Execution environment** | Each node individually | Secure enclave | +| **Secrets exposure** | Decrypted in Workflow DON node memory | Decrypted only in the enclave | +| **Response handling** | Full response to all nodes | Optionally encrypted (AES-GCM) | +| **Data transformation** | Supported in workflow code | Not yet supported in enclave | + +\*For non-idempotent operations (POST, PUT, PATCH, DELETE), [`cacheSettings`](/cre/guides/workflow/using-http-client/post-request#1-understanding-single-execution-with-cachesettings) enables nodes to share cached responses, reducing multiple calls to a single execution in most cases. + + + +## Learn more + +- **[Confidential API Interactions Guide](/cre/guides/workflow/using-confidential-http-client)**: Learn how to use the SDK to invoke the Confidential HTTP capability. +- **[Confidential HTTP Client SDK Reference](/cre/reference/sdk/confidential-http-client)**: See the detailed API reference for the `confidentialhttp.Client`. diff --git a/src/content/cre/capabilities/index.mdx b/src/content/cre/capabilities/index.mdx index 9af7b805f2d..d613ee4e3e7 100644 --- a/src/content/cre/capabilities/index.mdx +++ b/src/content/cre/capabilities/index.mdx @@ -30,6 +30,7 @@ This section provides a high-level, conceptual overview of the capabilities curr - **[Triggers](/cre/capabilities/triggers)**: Event sources that start your workflow executions. - **[HTTP](/cre/capabilities/http)**: Fetch and post data from external APIs with decentralized consensus. +- **[Confidential HTTP](/cre/capabilities/confidential-http)** _(Experimental)_: Make privacy-preserving API calls with enclave execution, secret injection, and optional response encryption. - **[EVM Read & Write](/cre/capabilities/evm-read-write)**: Interact with smart contracts on EVM-compatible blockchains with decentralized consensus. -All execution capabilities (HTTP, EVM) automatically use [built-in consensus](/cre/concepts/consensus-computing) to validate results across multiple nodes, ensuring security and reliability. +All execution capabilities (HTTP, Confidential HTTP, EVM) automatically use [built-in consensus](/cre/concepts/consensus-computing) to validate results across multiple nodes, ensuring security and reliability. diff --git a/src/content/cre/getting-started/cli-installation/macos-linux.mdx b/src/content/cre/getting-started/cli-installation/macos-linux.mdx index f9dcabb27a0..0818e7fca63 100644 --- a/src/content/cre/getting-started/cli-installation/macos-linux.mdx +++ b/src/content/cre/getting-started/cli-installation/macos-linux.mdx @@ -5,13 +5,13 @@ title: "Installing the CRE CLI on macOS and Linux" metadata: description: "Install the CRE CLI on macOS or Linux: choose automatic script or manual setup, verify integrity, and get ready to build workflows." datePublished: "2025-11-04" - lastModified: "2026-01-29" + lastModified: "2026-02-10" --- import { Aside, CopyText, PageTabs } from "@components" import { DownloadButton } from "~/components/DownloadButton.tsx" -This page explains how to install the CRE CLI on macOS or Linux. The recommended version at the time of writing is **v1.0.7**. +This page explains how to install the CRE CLI on macOS or Linux. The recommended version at the time of writing is **v1.0.10**. If you see warnings about "unrecognized developer/source" on macOS, run:{" "} @@ -120,11 +120,11 @@ shasum -a 256 cre_darwin_arm64.zip Compare the output with the official checksum from the [CRE CLI releases page](https://github.com/smartcontractkit/cre-cli/releases): 1. Go to https://github.com/smartcontractkit/cre-cli/releases -1. Find the release version you downloaded (e.g., v1.0.7) +1. Find the release version you downloaded (e.g., v1.0.10) 1. Under the **Assets** section, locate your downloaded file 1. Compare the SHA-256 checksum shown next to the file with your command output -**Example:** For `cre_darwin_arm64.zip` in release v1.0.7, you'll see something like: +**Example:** For `cre_darwin_arm64.zip` in release v1.0.10, you'll see something like: ``` cre_darwin_arm64.zip @@ -154,7 +154,7 @@ If the checksums match, the file is authentic and safe to install. If they don't 1. **Rename the extracted binary to `cre`** ```bash - mv cre_v1.0.7_darwin_arm64 cre + mv cre_v1.0.10_darwin_arm64 cre ``` 1. **Make it executable**: @@ -227,7 +227,7 @@ cre version **Expected output:** -You should see version information: `cre version v1.0.7`. +You should see version information: `cre version v1.0.10`. **If it doesn't work:** diff --git a/src/content/cre/getting-started/cli-installation/windows.mdx b/src/content/cre/getting-started/cli-installation/windows.mdx index 374b2cf6a71..26230ee64ef 100644 --- a/src/content/cre/getting-started/cli-installation/windows.mdx +++ b/src/content/cre/getting-started/cli-installation/windows.mdx @@ -5,13 +5,13 @@ title: "Installing the CRE CLI on Windows" metadata: description: "Install the CRE CLI on Windows: use PowerShell for quick setup or manual installation, verify integrity, and start building workflows." datePublished: "2025-11-04" - lastModified: "2026-01-29" + lastModified: "2026-02-10" --- import { Aside, CopyText, PageTabs } from "@components" import { DownloadButton } from "~/components/DownloadButton.tsx" -This page explains how to install the Chainlink Developer Platform CLI (also referred to as the CRE CLI) on Windows. The recommended version at the time of writing is **v1.0.7**. +This page explains how to install the Chainlink Developer Platform CLI (also referred to as the CRE CLI) on Windows. The recommended version at the time of writing is **v1.0.10**. + Confidential HTTP is an **experimental** capability available for `cre workflow simulate` only. It cannot be used with + `cre workflow deploy` at this time. + + +The CRE SDK provides a Confidential HTTP client that allows your workflows to interact with external APIs while keeping sensitive data private. Requests execute inside a secure enclave, secrets are injected via templates, and responses can optionally be encrypted. + +For a conceptual overview of what Confidential HTTP is and how it differs from the regular HTTP capability, see [The Confidential HTTP Capability](/cre/capabilities/confidential-http). + +## Guides + +- **[Making Confidential Requests](/cre/guides/workflow/using-confidential-http-client/making-requests)**: Learn how to make a confidential HTTP request with secret injection and optional response encryption. diff --git a/src/content/cre/guides/workflow/using-confidential-http-client/making-requests-go.mdx b/src/content/cre/guides/workflow/using-confidential-http-client/making-requests-go.mdx new file mode 100644 index 00000000000..5b862910c94 --- /dev/null +++ b/src/content/cre/guides/workflow/using-confidential-http-client/making-requests-go.mdx @@ -0,0 +1,400 @@ +--- +section: cre +title: "Making Confidential Requests" +date: Last Modified +sdkLang: "go" +pageId: "guides-workflow-confidential-http-making-requests" +metadata: + description: "Make confidential HTTP requests in Go: learn to use enclave execution, secret injection, and optional response encryption in your workflows." + datePublished: "2026-02-10" + lastModified: "2026-02-10" +--- + +import { Aside } from "@components" + + + +The `confidentialhttp.Client` is the SDK's interface for the underlying [Confidential HTTP Capability](/cre/capabilities/confidential-http). It allows your workflow to make privacy-preserving API calls where secrets are injected inside a secure enclave and responses can be optionally encrypted. + +Unlike the regular [`http.Client`](/cre/reference/sdk/http-client), the Confidential HTTP client: + +- Executes the request in a secure **enclave** (not on each node individually) +- Injects secrets from the **Vault DON** using template syntax +- Optionally **encrypts the response** before returning it to your workflow + +## Prerequisites + +This guide assumes you have: + +- A basic understanding of CRE. If you are new, complete the [Getting Started tutorial](/cre/getting-started/overview) first. +- Familiarity with [secrets management](/cre/guides/workflow/secrets) in CRE. + +## Step-by-step example + +This example shows a workflow that makes a confidential POST request to an API, injecting an API secret into both the request body and headers using template syntax. + +### Step 1: Configure your workflow + +Add the API URL to your `config.json` file. + +```json +{ + "schedule": "0 */5 * * * *", + "url": "https://api.example.com/data" +} +``` + +### Step 2: Set up secrets for simulation + +Confidential HTTP uses the `secrets.yaml` file. If you've already set up secrets for your project, you can reuse the same file. For a full walkthrough, see [Using Secrets in Simulation](/cre/guides/workflow/secrets/using-secrets-simulation). + +Add the secrets your confidential request needs to your `secrets.yaml`: + +```yaml +# secrets.yaml +secretsNames: + myApiKey: + - MY_API_KEY_ALL +``` + +Provide the actual value via an environment variable or `.env` file: + +```bash +export MY_API_KEY_ALL="your-secret-api-key" +``` + + + +### Step 3: Build the confidential request + +The key difference from regular HTTP is how you construct the request. You provide: + +- An `HTTPRequest` with template placeholders (`{{.secretName}}`) in the body and/or headers +- A list of `VaultDonSecrets` identifying which secrets to fetch from the Vault DON +- An optional `EncryptOutput` flag to encrypt the response + +```go +import ( + "github.com/smartcontractkit/cre-sdk-go/capabilities/networking/confidentialhttp" + "github.com/smartcontractkit/cre-sdk-go/cre" +) + +type Config struct { + Schedule string `json:"schedule"` + URL string `json:"url"` +} + +type Result struct { + TransactionID string `json:"transactionId" consensus:"identical"` + Status string `json:"status" consensus:"identical"` +} +``` + +### Step 4: Implement the request logic + +Use `cre.RunInNodeMode` to make the confidential request. The `confidentialhttp.Client` requires a `NodeRuntime`: + +```go +func makeConfidentialRequest(config Config, nodeRuntime cre.NodeRuntime) (Result, error) { + // 1. Define the request body with secret template placeholders + payload := `{"auth": "{{.myApiKey}}", "action": "getTransaction", "id": "tx-123"}` + + // 2. Define headers with secret template placeholders + headers := map[string]*confidentialhttp.HeaderValues{ + "Content-Type": { + Values: []string{"application/json"}, + }, + "Authorization": { + Values: []string{"Basic {{.myApiKey}}"}, + }, + } + + // 3. Create the client and send the request + client := confidentialhttp.Client{} + resp, err := client.SendRequest(nodeRuntime, &confidentialhttp.ConfidentialHTTPRequest{ + Request: &confidentialhttp.HTTPRequest{ + Url: config.URL, + Method: "POST", + Body: &confidentialhttp.HTTPRequest_BodyString{BodyString: payload}, + MultiHeaders: headers, + }, + VaultDonSecrets: []*confidentialhttp.SecretIdentifier{ + {Key: "myApiKey"}, + }, + EncryptOutput: false, + }).Await() + if err != nil { + return Result{}, fmt.Errorf("confidential HTTP request failed: %w", err) + } + + // 4. Parse the response + var result Result + if err := json.Unmarshal(resp.Body, &result); err != nil { + return Result{}, fmt.Errorf("failed to parse response: %w", err) + } + + return result, nil +} +``` + +### Step 5: Wire it into your workflow + +Call the request function from your trigger handler using `cre.RunInNodeMode`: + +```go +func onCronTrigger(config *Config, runtime cre.Runtime, outputs *cron.Payload) (string, error) { + result, err := cre.RunInNodeMode(*config, runtime, + makeConfidentialRequest, + cre.ConsensusIdenticalAggregation[Result](), + ).Await() + if err != nil { + return "", fmt.Errorf("failed to get result: %w", err) + } + + runtime.Logger().Info("Transaction result", "id", result.TransactionID, "status", result.Status) + return result.TransactionID, nil +} +``` + +### Step 6: Simulate + +Run the simulation: + +```bash +cre workflow simulate +``` + +## Template syntax for secrets + +Secrets are injected into request bodies and headers using Go template syntax: `{{.secretName}}`. The placeholder name must match the `Key` in your `VaultDonSecrets` list. + +**In the request body:** + +```json +{ "auth": "{{.myApiKey}}", "data": "public-data" } +``` + +**In headers:** + +```go +headers := map[string]*confidentialhttp.HeaderValues{ + "Authorization": { + Values: []string{"Basic {{.myCredential}}"}, + }, +} +``` + +The template placeholders are resolved inside the enclave. The actual secret values never appear in your workflow code or in node memory. + +## Response encryption + +By default, the API response is returned unencrypted (`EncryptOutput: false`). To encrypt the response body before it leaves the enclave, set `EncryptOutput: true` and provide an AES-256 encryption key as a Vault DON secret. + +### Setting up response encryption + +1. **Store an AES-256 key** as a Vault DON secret with the identifier `san_marino_aes_gcm_encryption_key`: + + ```yaml + # secrets.yaml + secretsNames: + san_marino_aes_gcm_encryption_key: + - AES_KEY_ALL + ``` + + The key must be a 256-bit (32 bytes) hex-encoded string: + + ```bash + export AES_KEY_ALL="your-256-bit-hex-encoded-key" + ``` + +1. **Include the key in your `VaultDonSecrets`** and set `EncryptOutput: true`: + + ```go + resp, err := client.SendRequest(nodeRuntime, &confidentialhttp.ConfidentialHTTPRequest{ + Request: &confidentialhttp.HTTPRequest{ + Url: config.URL, + Method: "POST", + Body: &confidentialhttp.HTTPRequest_BodyString{BodyString: payload}, + MultiHeaders: headers, + }, + VaultDonSecrets: []*confidentialhttp.SecretIdentifier{ + {Key: "myApiKey"}, + {Key: "san_marino_aes_gcm_encryption_key"}, + }, + EncryptOutput: true, + }).Await() + ``` + +1. **Decrypt the response** in your own secure backend using AES-GCM. The encrypted response body is structured as `nonce || ciphertext || tag`: + + ```go + import ( + "crypto/aes" + "crypto/cipher" + "encoding/hex" + ) + + func AESGCMDecrypt(blob []byte, key []byte) ([]byte, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + gcm, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + + nonceSize := gcm.NonceSize() + if len(blob) < nonceSize { + return nil, fmt.Errorf("ciphertext too short") + } + + nonce, ciphertext := blob[:nonceSize], blob[nonceSize:] + return gcm.Open(nil, nonce, ciphertext, nil) + } + ``` + + {/* prettier-ignore */} + + +## Complete example + +Here's the full workflow code for a confidential HTTP request with response encryption: + +```go +package main + +import ( + "crypto/aes" + "crypto/cipher" + "encoding/hex" + "encoding/json" + "fmt" + "log/slog" + "os" + + "github.com/smartcontractkit/cre-sdk-go/capabilities/networking/confidentialhttp" + "github.com/smartcontractkit/cre-sdk-go/capabilities/scheduler/cron" + "github.com/smartcontractkit/cre-sdk-go/cre" +) + +type Config struct { + Schedule string `json:"schedule"` + URL string `json:"url"` +} + +type Result struct { + TransactionID string `json:"transactionId" consensus:"identical"` + Status string `json:"status" consensus:"identical"` +} + +func InitWorkflow(config *Config, logger *slog.Logger, secretsProvider cre.SecretsProvider) (cre.Workflow[*Config], error) { + cronTriggerCfg := &cron.Config{ + Schedule: config.Schedule, + } + + workflow := cre.Workflow[*Config]{ + cre.Handler( + cron.Trigger(cronTriggerCfg), + onCronTrigger, + ), + } + + return workflow, nil +} + +func onCronTrigger(config *Config, runtime cre.Runtime, outputs *cron.Payload) (string, error) { + result, err := cre.RunInNodeMode(*config, runtime, + makeConfidentialRequest, + cre.ConsensusIdenticalAggregation[Result](), + ).Await() + if err != nil { + return "", fmt.Errorf("failed to get result: %w", err) + } + + runtime.Logger().Info("Transaction result", "id", result.TransactionID, "status", result.Status) + return result.TransactionID, nil +} + +func makeConfidentialRequest(config Config, nodeRuntime cre.NodeRuntime) (Result, error) { + payload := `{"auth": "{{.myApiKey}}", "action": "getTransaction", "id": "tx-123"}` + + headers := map[string]*confidentialhttp.HeaderValues{ + "Content-Type": { + Values: []string{"application/json"}, + }, + "Authorization": { + Values: []string{"Basic {{.myApiKey}}"}, + }, + } + + client := confidentialhttp.Client{} + resp, err := client.SendRequest(nodeRuntime, &confidentialhttp.ConfidentialHTTPRequest{ + Request: &confidentialhttp.HTTPRequest{ + Url: config.URL, + Method: "POST", + Body: &confidentialhttp.HTTPRequest_BodyString{BodyString: payload}, + MultiHeaders: headers, + }, + VaultDonSecrets: []*confidentialhttp.SecretIdentifier{ + {Key: "myApiKey"}, + {Key: "san_marino_aes_gcm_encryption_key"}, + }, + EncryptOutput: true, + }).Await() + if err != nil { + return Result{}, fmt.Errorf("confidential HTTP request failed: %w", err) + } + + // In a real workflow, you would forward the encrypted body to your + // secure backend for decryption. This inline decryption is shown + // for demonstration purposes only. + keyHex := os.Getenv("AES_KEY_ALL") // your 256-bit hex-encoded key + keyBytes, _ := hex.DecodeString(keyHex) + decrypted, err := AESGCMDecrypt(resp.Body, keyBytes) + if err != nil { + return Result{}, fmt.Errorf("failed to decrypt response: %w", err) + } + + var result Result + if err := json.Unmarshal(decrypted, &result); err != nil { + return Result{}, fmt.Errorf("failed to parse response: %w", err) + } + + return result, nil +} + +func AESGCMDecrypt(blob []byte, key []byte) ([]byte, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + gcm, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + + nonceSize := gcm.NonceSize() + if len(blob) < nonceSize { + return nil, fmt.Errorf("ciphertext too short") + } + + nonce, ciphertext := blob[:nonceSize], blob[nonceSize:] + return gcm.Open(nil, nonce, ciphertext, nil) +} +``` + +## API reference + +For the full list of types and methods available on the Confidential HTTP client, see the [Confidential HTTP Client SDK Reference](/cre/reference/sdk/confidential-http-client-go). diff --git a/src/content/cre/guides/workflow/using-confidential-http-client/making-requests-ts.mdx b/src/content/cre/guides/workflow/using-confidential-http-client/making-requests-ts.mdx new file mode 100644 index 00000000000..6ac9f386e16 --- /dev/null +++ b/src/content/cre/guides/workflow/using-confidential-http-client/making-requests-ts.mdx @@ -0,0 +1,319 @@ +--- +section: cre +title: "Making Confidential Requests" +date: Last Modified +sdkLang: "ts" +pageId: "guides-workflow-confidential-http-making-requests" +metadata: + description: "Make confidential HTTP requests in TypeScript: learn to use enclave execution, secret injection, and optional response encryption in your workflows." + datePublished: "2026-02-10" + lastModified: "2026-02-10" +--- + +import { Aside } from "@components" + + + +The `ConfidentialHTTPClient` is the SDK's interface for the underlying [Confidential HTTP Capability](/cre/capabilities/confidential-http). It allows your workflow to make privacy-preserving API calls where secrets are injected inside a secure enclave and responses can be optionally encrypted. + +Unlike the regular [`HTTPClient`](/cre/reference/sdk/http-client), the Confidential HTTP client: + +- Executes the request in a secure **enclave** (not on each node individually) +- Injects secrets from the **Vault DON** using template syntax +- Optionally **encrypts the response** before returning it to your workflow + +## Prerequisites + +This guide assumes you have: + +- A basic understanding of CRE. If you are new, complete the [Getting Started tutorial](/cre/getting-started/overview) first. +- Familiarity with [secrets management](/cre/guides/workflow/secrets) in CRE. + +## Step-by-step example + +This example shows a workflow that makes a confidential GET request to an API, injecting a secret into the request headers using template syntax. + +### Step 1: Configure your workflow + +Add the API URL to your `config.json` file. + +```json +{ + "schedule": "0 */5 * * * *", + "url": "https://api.example.com/data", + "owner": "" +} +``` + +### Step 2: Set up secrets for simulation + +Confidential HTTP uses the `secrets.yaml` file. If you've already set up secrets for your project, you can reuse the same file. For a full walkthrough, see [Using Secrets in Simulation](/cre/guides/workflow/secrets/using-secrets-simulation). + +Add the secrets your confidential request needs to your `secrets.yaml`: + +```yaml +# secrets.yaml +secretsNames: + myApiKey: + - MY_API_KEY_ALL +``` + +Provide the actual value via an environment variable or `.env` file: + +```bash +export MY_API_KEY_ALL="your-secret-api-key" +``` + + + +### Step 3: Define your types + +```typescript +import { z } from "zod" + +const configSchema = z.object({ + schedule: z.string(), + url: z.string(), + owner: z.string(), +}) + +type Config = z.infer + +type TransactionResult = { + transactionId: string + status: string +} +``` + +### Step 4: Implement the fetch function + +Create the function that will be passed to `sendRequest()`. This function receives a `ConfidentialHTTPSendRequester` and your config as parameters: + +```typescript +import { type ConfidentialHTTPSendRequester, ok, json } from "@chainlink/cre-sdk" + +const fetchTransaction = (sendRequester: ConfidentialHTTPSendRequester, config: Config): TransactionResult => { + // 1. Send the confidential request + const response = sendRequester + .sendRequest({ + request: { + url: config.url, + method: "GET", + multiHeaders: { + Authorization: { values: ["Basic {{.myApiKey}}"] }, + }, + }, + vaultDonSecrets: [{ key: "myApiKey", owner: config.owner }], + }) + .result() + + // 2. Check the response status + if (!ok(response)) { + throw new Error(`HTTP request failed with status: ${response.statusCode}`) + } + + // 3. Parse and return the result + return json(response) as TransactionResult +} +``` + +### Step 5: Wire it into your workflow + +In your trigger handler, call `confHTTPClient.sendRequest()` with your fetch function and a consensus method: + +```typescript +import { + CronCapability, + ConfidentialHTTPClient, + handler, + consensusIdenticalAggregation, + type Runtime, + Runner, +} from "@chainlink/cre-sdk" + +const onCronTrigger = (runtime: Runtime): string => { + const confHTTPClient = new ConfidentialHTTPClient() + + const result = confHTTPClient + .sendRequest(runtime, fetchTransaction, consensusIdenticalAggregation())(runtime.config) + .result() + + runtime.log(`Transaction result: ${result.transactionId} — ${result.status}`) + return result.transactionId +} +``` + +### Step 6: Simulate + +Run the simulation: + +```bash +cre workflow simulate +``` + +## Template syntax for secrets + +Secrets are injected into request bodies and headers using Go template syntax: `{{.secretName}}`. The placeholder name must match the `key` in your `vaultDonSecrets` list. + +**In the request body:** + +```json +{ "auth": "{{.myApiKey}}", "data": "public-data" } +``` + +**In headers:** + +```typescript +multiHeaders: { + "Authorization": { values: ["Basic {{.myCredential}}"] }, +} +``` + +The template placeholders are resolved inside the enclave. The actual secret values never appear in your workflow code or in node memory. + +## Response encryption + +By default, the API response is returned unencrypted (`encryptOutput: false`). To encrypt the response body before it leaves the enclave, set `encryptOutput: true` and provide an AES-256 encryption key as a Vault DON secret. + +### Setting up response encryption + +1. **Store an AES-256 key** as a Vault DON secret with the identifier `san_marino_aes_gcm_encryption_key`: + + ```yaml + # secrets.yaml + secretsNames: + san_marino_aes_gcm_encryption_key: + - AES_KEY_ALL + ``` + +The key must be a 256-bit (32 bytes) hex-encoded string: + +```bash +export AES_KEY_ALL="your-256-bit-hex-encoded-key" +``` + +1. **Include the key in your `vaultDonSecrets`** and set `encryptOutput: true`: + + ```typescript + const response = sendRequester + .sendRequest({ + request: { + url: config.url, + method: "GET", + multiHeaders: { + Authorization: { values: ["Basic {{.myApiKey}}"] }, + }, + }, + vaultDonSecrets: [{ key: "myApiKey", owner: config.owner }, { key: "san_marino_aes_gcm_encryption_key" }], + encryptOutput: true, + }) + .result() + ``` + +1. **Decrypt the response** in your own backend service. The encrypted response body is structured as `nonce || ciphertext || tag` and uses AES-GCM encryption. + +{/* prettier-ignore */} + + +## Response helper functions + +The SDK response helpers `ok()`, `text()`, and `json()` work with Confidential HTTP responses just as they do with regular HTTP responses. For full documentation, see the [HTTP Client SDK Reference](/cre/reference/sdk/http-client-ts#helper-functions). + +## Complete example + +Here's the full workflow code for a confidential HTTP request with secret injection: + +```typescript +import { + CronCapability, + ConfidentialHTTPClient, + handler, + consensusIdenticalAggregation, + ok, + json, + type ConfidentialHTTPSendRequester, + type Runtime, + Runner, +} from "@chainlink/cre-sdk" +import { z } from "zod" + +// Config schema +const configSchema = z.object({ + schedule: z.string(), + url: z.string(), + owner: z.string(), +}) + +type Config = z.infer + +// Result type +type TransactionResult = { + transactionId: string + status: string +} + +// Fetch function — receives a ConfidentialHTTPSendRequester and config +const fetchTransaction = (sendRequester: ConfidentialHTTPSendRequester, config: Config): TransactionResult => { + const response = sendRequester + .sendRequest({ + request: { + url: config.url, + method: "GET", + multiHeaders: { + Authorization: { values: ["Basic {{.myApiKey}}"] }, + }, + }, + vaultDonSecrets: [{ key: "myApiKey", owner: config.owner }], + }) + .result() + + if (!ok(response)) { + throw new Error(`HTTP request failed with status: ${response.statusCode}`) + } + + return json(response) as TransactionResult +} + +// Main workflow handler +const onCronTrigger = (runtime: Runtime): string => { + const confHTTPClient = new ConfidentialHTTPClient() + + const result = confHTTPClient + .sendRequest(runtime, fetchTransaction, consensusIdenticalAggregation())(runtime.config) + .result() + + runtime.log(`Transaction result: ${result.transactionId} — ${result.status}`) + return result.transactionId +} + +// Initialize workflow +const initWorkflow = (config: Config) => { + return [ + handler( + new CronCapability().trigger({ + schedule: config.schedule, + }), + onCronTrigger + ), + ] +} + +export async function main() { + const runner = await Runner.newRunner({ configSchema }) + await runner.run(initWorkflow) +} +``` + +## API reference + +For the full list of types and methods available on the Confidential HTTP client, see the [Confidential HTTP Client SDK Reference](/cre/reference/sdk/confidential-http-client-ts). diff --git a/src/content/cre/llms-full-go.txt b/src/content/cre/llms-full-go.txt index 043e7261ef0..683eb5939d6 100644 --- a/src/content/cre/llms-full-go.txt +++ b/src/content/cre/llms-full-go.txt @@ -442,10 +442,52 @@ To help us assist you faster, please include: # Release Notes Source: https://docs.chain.link/cre/release-notes -Last Updated: 2026-02-03 +Last Updated: 2026-02-10 This page provides detailed release notes for CRE. It includes information on new features, significant changes, and known limitations. +## CLI v1.0.10 - February 9, 2026 + +**CRE CLI version 1.0.10 is now available.** + +- **Bug Fix**: Fixed secret injection for the [Confidential HTTP](/cre/capabilities/confidential-http) capability in the simulator — template placeholders (`{{.secretName}}`) now resolve correctly during `cre workflow simulate` +- **Bug Fix**: Fixed project context not being set before writing changeset files + +**How to update:** + +- **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. +- **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). + +[See all changes on GitHub](https://github.com/smartcontractkit/cre-cli/compare/v1.0.9...v1.0.10) + +## CLI v1.0.9 - February 6, 2026 + +**CRE CLI version 1.0.9 is now available.** + +- **Confidential HTTP (Experimental)**: Added [Confidential HTTP](/cre/capabilities/confidential-http) capability support in the simulator. You can now simulate workflows that use privacy-preserving API calls with secret injection and optional response encryption. + +**How to update:** + +- **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. +- **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). + +[See all changes on GitHub](https://github.com/smartcontractkit/cre-cli/compare/v1.0.8...v1.0.9) + +## CLI v1.0.8 - February 6, 2026 + +**CRE CLI version 1.0.8 is now available.** + +- Changed `chain-id` to `chain-selector` in simulator settings +- Support for longer workflow names +- Fixed a logic bug in the template contract `MessageEmitter.sol` + +**How to update:** + +- **Automatic update**: When you run any CRE command, the CLI will automatically detect if a newer version is available and prompt you to update. Simply run `cre update` to install the latest version. +- **Fresh installation**: If you're installing the CLI for the first time, follow the [CLI Installation guide](/cre/getting-started/cli-installation). + +[See all changes on GitHub](https://github.com/smartcontractkit/cre-cli/compare/v1.0.7...v1.0.8) + ## New Networks Support - January 29, 2026 CRE now supports additional testnets for workflow simulation and production deployment: @@ -646,9 +688,9 @@ These guides explain how to install the Chainlink Developer Platform CLI (also r # Installing the CRE CLI on macOS and Linux Source: https://docs.chain.link/cre/getting-started/cli-installation/macos-linux -Last Updated: 2026-01-29 +Last Updated: 2026-02-10 -This page explains how to install the CRE CLI on macOS or Linux. The recommended version at the time of writing is **v1.0.7**. +This page explains how to install the CRE CLI on macOS or Linux. The recommended version at the time of writing is **v1.0.10**. ## Installation @@ -679,7 +721,7 @@ After the script completes, verify the installation: cre version ``` -**Expected output:** `cre version v1.0.7` +**Expected output:** `cre version v1.0.10`
- {isAaveSVR(metadata) && !isTokenizedEquity && ( + {isAaveSVR(metadata) && !isTokenizedEquityFeed && (
⚠️ Aave Dedicated Feed: This SVR proxy feed is dedicated exclusively for use by the Aave protocol. Learn more about{" "} @@ -427,7 +426,7 @@ const DefaultTr = ({ network, metadata, showExtraDetails, batchedCategoryData, d .
)} - {isSharedSVR(metadata) && !isTokenizedEquity && ( + {isSharedSVR(metadata) && !isTokenizedEquityFeed && (
🔗 SVR Feed: This SVR proxy feed is usable by any protocol. Learn more about{" "} From 7fc5d20afd809b5f248193416b68d114a6337a81 Mon Sep 17 00:00:00 2001 From: "Mark S. Shenouda" <49324987+markshenouda@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:58:32 +0200 Subject: [PATCH 198/214] fix: remove clickable functionality from network names in token drawer (#226) - Convert button element to div in TokenDrawer.tsx to remove click functionality - Remove cursor pointer style from ccip-table__network-name CSS class - Maintains visual styling while preventing unintended navigation - Part of token drawer navigation improvements --- src/components/CCIP/Drawer/TokenDrawer.tsx | 25 ++-------------------- src/components/CCIP/Tables/Table.css | 1 - 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/src/components/CCIP/Drawer/TokenDrawer.tsx b/src/components/CCIP/Drawer/TokenDrawer.tsx index ac32df98710..82f6b640eaf 100644 --- a/src/components/CCIP/Drawer/TokenDrawer.tsx +++ b/src/components/CCIP/Drawer/TokenDrawer.tsx @@ -341,29 +341,8 @@ function TokenDrawer({ return (
{verifiers.length === 0 ? ( - ) : ( @@ -259,16 +267,15 @@ function TokenDrawer({ ) : (
- {" "}
VerifierVerifier addressVerifier typeThreshold amount + Verifier name + + Verifier address + + Verifier type + + Threshold amount +
- No verifiers configured + No verifiers found for this network.
@@ -236,8 +245,12 @@ function TokenDrawer({ endLength={4} /> {getVerifierTypeDisplay(verifier.type)}N/A + {getVerifierTypeDisplay(verifier.type)} + + N/A +
- + Date: Thu, 12 Feb 2026 15:19:19 +0200 Subject: [PATCH 199/214] [FEAT] Add expandable verifiers section in TokenDrawer and update table styles (#224) * [FEAT] Add expandable verifiers section in TokenDrawer and update table styles * refactor: remove unused imports from TokenDrawer component * fix: remove opacity change on paused row hover effect --- src/components/CCIP/Drawer/TokenDrawer.tsx | 244 +++++++++++++++------ src/components/CCIP/Tables/Table.css | 169 +++++++++++++- 2 files changed, 346 insertions(+), 67 deletions(-) diff --git a/src/components/CCIP/Drawer/TokenDrawer.tsx b/src/components/CCIP/Drawer/TokenDrawer.tsx index 82f6b640eaf..eb58b345a2a 100644 --- a/src/components/CCIP/Drawer/TokenDrawer.tsx +++ b/src/components/CCIP/Drawer/TokenDrawer.tsx @@ -1,5 +1,4 @@ import "../Tables/Table.css" -import { drawerContentStore, drawerWidthStore, DrawerWidth } from "../Drawer/drawerStore.ts" import TokenDetailsHero from "../ChainHero/TokenDetailsHero.tsx" import { Environment, @@ -7,7 +6,6 @@ import { getNetwork, SupportedTokenConfig, Version, - LaneFilter, determineTokenMechanism, PoolType, getTokenData, @@ -19,7 +17,6 @@ import { useState, useMemo } from "react" import { ChainType, ExplorerInfo, SupportedChain } from "~/config/index.ts" import { getExplorerAddressUrl } from "~/features/utils/index.ts" import Address from "~/components/AddressReact.tsx" -import LaneDrawer from "../Drawer/LaneDrawer.tsx" import TableSearchInput from "../Tables/TableSearchInput.tsx" import Tabs from "../Tables/Tabs.tsx" import { Tooltip } from "~/features/common/Tooltip/Tooltip.tsx" @@ -68,6 +65,17 @@ function TokenDrawer({ }) { const [search, setSearch] = useState("") const [activeTab, setActiveTab] = useState(TokenTab.Outbound) + const [expandedRows, setExpandedRows] = useState>(new Set()) + + const toggleRowExpansion = (networkName: string) => { + const newExpandedRows = new Set(expandedRows) + if (newExpandedRows.has(networkName)) { + newExpandedRows.delete(networkName) + } else { + newExpandedRows.add(networkName) + } + setExpandedRows(newExpandedRows) + } // Get verifiers for the current network const verifiers = getVerifiersByNetwork({ @@ -220,8 +228,8 @@ function TokenDrawer({
- No verifiers found for this network. + + No verifiers found for this network.
- - - {/* */} + + + @@ -338,58 +345,165 @@ function TokenDrawer({ // Token is paused if standard rate limit capacity is 0 const tokenPaused = allLimits.standard?.capacity === "0" + // Get verifiers for the destination network + const destinationVerifiers = getVerifiersByNetwork({ + networkId: destinationChain, + environment, + version: Version.V1_2_0, + }) + + const isExpanded = expandedRows.has(networkDetails.name) + return ( - - toggleRowExpansion(networkDetails.name)} + role="button" + tabIndex={0} + aria-expanded={isExpanded} + aria-label={`${isExpanded ? "Hide" : "Show"} verifiers for ${networkDetails?.name}`} + onKeyDown={(e) => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault() + toggleRowExpansion(networkDetails.name) + } + }} + > + + + - - - - - - {/* */} - + + + + + + + {isExpanded && ( + + + + )} + ) })} diff --git a/src/components/CCIP/Tables/Table.css b/src/components/CCIP/Tables/Table.css index 221a491f07a..3c0368d1d4d 100644 --- a/src/components/CCIP/Tables/Table.css +++ b/src/components/CCIP/Tables/Table.css @@ -5,6 +5,48 @@ width: 100%; } +.ccip-table--verifiers thead th:nth-child(1) { + /* Verifier name */ + width: 15% !important; +} + +/* Column width specifications for main accordion table only */ +.ccip-table thead th:nth-child(1) { + /* Destination/Source network */ + width: 25%; +} + +.ccip-table thead th:nth-child(2) { + /* Mechanism */ + width: 15%; +} + +.ccip-table thead th:nth-child(3) { + /* Rate limit capacity */ + width: 15%; +} + +.ccip-table thead th:nth-child(4) { + /* Rate limit refill rate */ + width: 15%; +} + +.ccip-table thead th:nth-child(5) { + /* FTF Rate limit capacity */ + width: 15%; +} + +.ccip-table thead th:nth-child(6) { + /* FTF Rate limit refill rate */ + width: 15%; +} + +.ccip-table thead th:nth-child(7) { + /* Verifiers */ + width: 10%; + text-align: center !important; +} + .ccip-table tbody tr:first-child { border: none; } @@ -32,11 +74,14 @@ /* identical to box height, or 157% */ text-align: start; background-color: transparent; - padding: 0 var(--space-4x) var(--space-4x) 0; color: var(--gray-700); align-content: baseline; } +.ccip-table thead th:first-child { + padding-left: var(--space-6x); +} + .ccip-table tbody td { text-align: start; color: var(--gray-900); @@ -266,7 +311,6 @@ } .ccip-table__row--paused:hover { - opacity: 0.8; background-color: var(--gray-100); } @@ -303,3 +347,124 @@ text-decoration: none; pointer-events: none; } + +/* Table-based accordion styles for lane rows */ +.ccip-table__accordion-row { + cursor: pointer; + transition: background-color 0.2s ease; +} + +.ccip-table__accordion-row:hover { + background-color: var(--gray-50); +} + +.ccip-table__accordion-row--expanded { + border-bottom: 1px solid var(--Page-Border-Border, #e4e8ed); + background: var(--Page-Accent-Accent, #f5f7fa); + border-left: 4px solid var(--blue-600) !important; +} + +.ccip-table__accordion-row td { + padding-left: var(--space-6x); +} + +.ccip-table__accordion-row td:first-child { + padding-left: var(--space-6x); +} + +.ccip-table__verifier-toggle { + display: flex; + align-items: center; + justify-content: flex-end; + gap: var(--space-2x); + font-family: inherit; + font-size: inherit; + color: var(--gray-700); + pointer-events: none; +} + +/* Align verifiers column content to the right - main table only */ +.ccip-table:not(.ccip-table--verifiers) tbody td:nth-child(7) { + text-align: right; +} + +.ccip-table__verifier-count { + font-size: 14px; + color: var(--gray-600); +} + +.ccip-table__expand-icon { + transition: transform 0.2s ease; + color: var(--gray-500); +} + +.ccip-table__expand-icon--expanded { + transform: rotate(180deg); +} + +.ccip-table__verifier-row { + background: var(--gray-50); + border-left: 4px solid var(--blue-600); +} + +.ccip-table__verifier-row td { + border-top: 1px solid var(--gray-200); +} + +.ccip-table__verifier-content { + background: white; + border-radius: var(--space-2x); + border: 1px solid var(--gray-200); +} + +.ccip-table--verifiers { + border-collapse: separate; + border-spacing: 0; + background: var(--background-alt); +} + +.ccip-table--verifiers thead th { + padding: var(--space-3x) var(--space-6x) var(--space-3x) 0; + font-size: 14px; + font-weight: 600; + color: var(--Page-Foreground-Muted, #6c7585); + text-transform: none; + letter-spacing: normal; + border-bottom: 1px solid var(--gray-200); +} + +.ccip-table--verifiers thead th:first-child { + padding-left: var(--space-4x); +} + +.ccip-table--verifiers tbody td { + padding: var(--space-4x) var(--space-6x); + font-size: 14px; + color: var(--gray-900); + border-bottom: 1px solid var(--gray-100); + vertical-align: middle; +} + +.ccip-table--verifiers tbody td:first-child { + padding-left: var(--space-4x); +} + +.ccip-table--verifiers tbody tr:last-child td { + border-bottom: none; +} + +.ccip-table--verifiers tbody tr:hover { + background-color: var(--gray-25); +} + +.ccip-table--verifiers .ccip-table__logo { + width: 24px; + height: 24px; + border-radius: 4px; + flex-shrink: 0; +} + +.ccip-table__paused-badge { + margin-left: var(--space-2x); + font-size: 12px; +} From adee404431a1d2fcdc2f9f1e0436ead6dfe2e3b7 Mon Sep 17 00:00:00 2001 From: Simone Cuomo Date: Thu, 12 Feb 2026 13:31:29 +0000 Subject: [PATCH 200/214] Remove extra changelog page --- src/pages/changelog/index.astro | 103 -------------------------------- 1 file changed, 103 deletions(-) delete mode 100644 src/pages/changelog/index.astro 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) => )} -
-
-
- - From fa6df9ac8929f3a7e6a58dfa377b70c327f85204 Mon Sep 17 00:00:00 2001 From: Simone Cuomo Date: Thu, 12 Feb 2026 13:39:37 +0000 Subject: [PATCH 201/214] Fix left sidebar styles --- .../LeftSidebar/leftSidebar.module.css | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/components/LeftSidebar/leftSidebar.module.css b/src/components/LeftSidebar/leftSidebar.module.css index 8f0b448ed8f..167692c3240 100644 --- a/src/components/LeftSidebar/leftSidebar.module.css +++ b/src/components/LeftSidebar/leftSidebar.module.css @@ -114,3 +114,75 @@ details[open] > .navGroupTitle { :global(:root.theme-dark) .navLink[aria-current="page"] { color: hsla(var(--color-base-white), 100%, 1); } + +.link { + display: flex; + align-items: center; + padding: var(--space-3x) var(--space-2x); + gap: var(--space-2x); + margin-right: var(--space-2x); + + color: var(--gray-900, #141921); + font-weight: 600; + line-height: 24px; /* 150% */ +} + +.quickLinks { + margin-top: 60px; + display: flex; + flex-direction: column; + gap: var(--space-2x); +} + +.headerLink { + font-size: 14px; + color: var(--color-text-link); + padding: var(--space-1x) var(--space-2x); +} + +.headerLink * { + margin: 0; + max-width: 100%; + color: inherit; + font: inherit; +} + +.headerLink.active, +.headerLink:hover, +.headerLink:focus { + color: var(--theme-accent); + fill: var(--theme-accent); +} + +.headerLink:focus-within { + color: var(--theme-text-light); + fill: var(--theme-text-light); +} + +.headerLink a { + display: inline-flex; + gap: var(--space-2x); + width: 100%; + padding: 0.15em 0 0.15em 0; + text-decoration: none; +} + +.headerLink { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.25rem; +} + +/* Language Switcher for tablet screens (800px-1200px) */ +.languageSwitcherTablet { + padding: var(--space-6x) 0; + display: none; +} + +/* Show on tablet/medium screens where left sidebar is visible but right sidebar is hidden */ +@media (min-width: 50em) and (max-width: 1199px) { + .languageSwitcherTablet { + display: block; + } +} From f8ebaa5c2dea509264bf537eca5574f123fa92ed Mon Sep 17 00:00:00 2001 From: "Mark S. Shenouda" <49324987+markshenouda@users.noreply.github.com> Date: Thu, 12 Feb 2026 17:46:00 +0200 Subject: [PATCH 202/214] [Grace's branch] content/link updates, dynamic buttons (#225) * content/link updates, dynamic buttons * fix: correct formatting and fix tests * fix: update import path for AggregatorV3Interface * remove package.json and package-lock.json from the PR --------- Co-authored-by: Grace Fletcher --- public/samples/CRE/basic-functionality.ts | 18 ++++ .../DataFeeds/SVR/import-aggregatorV3.sol | 20 ++++ .../samples/DataStreams/FetchSingleStream.ts | 55 +++++++++++ src/components/LandingHero/LandingHero.astro | 5 +- .../LandingHero/landingHero.module.css | 16 ++++ src/components/TryItOut/TryItOut.astro | 95 +++++++++++++------ src/components/TryItOut/styles.module.css | 29 ++++++ src/pages/index.astro | 58 +++++++---- 8 files changed, 250 insertions(+), 46 deletions(-) create mode 100644 public/samples/CRE/basic-functionality.ts create mode 100644 public/samples/DataFeeds/SVR/import-aggregatorV3.sol create mode 100644 public/samples/DataStreams/FetchSingleStream.ts diff --git a/public/samples/CRE/basic-functionality.ts b/public/samples/CRE/basic-functionality.ts new file mode 100644 index 00000000000..5a25e8e51a6 --- /dev/null +++ b/public/samples/CRE/basic-functionality.ts @@ -0,0 +1,18 @@ +import { cre } from "@chainlink/cre-sdk" + +cre.handler( + cron.trigger({ schedule: "0 */5 * * *" }), // Every 5 minutes + (runtime) => { + // Fetch data from API + const price = httpClient.get(url).result() + + // Read from EVM blockchain + const threshold = evmClient.read(contract).result() + + // Make any computation + const shouldUpdate = price > threshold + + // Write result onchain + return evmClient.write(contract, price).result() + } +) diff --git a/public/samples/DataFeeds/SVR/import-aggregatorV3.sol b/public/samples/DataFeeds/SVR/import-aggregatorV3.sol new file mode 100644 index 00000000000..229601df65f --- /dev/null +++ b/public/samples/DataFeeds/SVR/import-aggregatorV3.sol @@ -0,0 +1,20 @@ +import "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; + +contract SVRConsumer { + AggregatorV3Interface internal svrFeed; + + constructor( + address _svrFeedAddress + ) { + svrFeed = AggregatorV3Interface(_svrFeedAddress); + } + + function getLatestPrice() public view returns (int256) { + (, /* uint80 roundID */ + int256 price, /* uint256 startedAt */ + /* uint256 timeStamp */ + /* uint80 answeredInRound */,, + ) = svrFeed.latestRoundData(); + return price; + } +} diff --git a/public/samples/DataStreams/FetchSingleStream.ts b/public/samples/DataStreams/FetchSingleStream.ts new file mode 100644 index 00000000000..36830885458 --- /dev/null +++ b/public/samples/DataStreams/FetchSingleStream.ts @@ -0,0 +1,55 @@ +import { createClient, decodeReport, LogLevel, getReportVersion, formatReport } from "@chainlink/data-streams-sdk" +import "dotenv/config" + +async function main() { + if (process.argv.length < 3) { + console.error("Please provide a feed ID as an argument") + console.error("Example: npx tsx singleStream.ts 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782") + process.exit(1) + } + + const feedId = process.argv[2] + const version = getReportVersion(feedId) + + try { + const config = { + apiKey: process.env.API_KEY || "YOUR_API_KEY", + userSecret: process.env.USER_SECRET || "YOUR_USER_SECRET", + endpoint: "https://api.testnet-dataengine.chain.link", + wsEndpoint: "wss://ws.testnet-dataengine.chain.link", + // Comment to disable SDK logging: + logging: { + logger: console, + logLevel: LogLevel.INFO, + }, + } + + const client = createClient(config) + console.log(`\nFetching latest report for feed ${feedId} (${version})...\n`) + + // Get raw report data + const report = await client.getLatestReport(feedId) + console.log(`Raw Report Blob: ${report.fullReport}`) + + // Decode the report + const decodedData = decodeReport(report.fullReport, report.feedID) + + // Combine decoded data with report metadata + const decodedReport = { + ...decodedData, + feedID: report.feedID, + validFromTimestamp: report.validFromTimestamp, + observationsTimestamp: report.observationsTimestamp, + } + console.log(formatReport(decodedReport, version)) + } catch (error) { + if (error instanceof Error) { + console.error("Error:", error.message) + } else { + console.error("Unknown error:", error) + } + process.exit(1) + } +} + +main() diff --git a/src/components/LandingHero/LandingHero.astro b/src/components/LandingHero/LandingHero.astro index 4303beed5ea..5e3f9f1b18e 100644 --- a/src/components/LandingHero/LandingHero.astro +++ b/src/components/LandingHero/LandingHero.astro @@ -6,7 +6,10 @@ import styles from "./landingHero.module.css"
- Explore docs & resources +
+ Build on the Chainlink Platform +
+
diff --git a/src/components/LandingHero/landingHero.module.css b/src/components/LandingHero/landingHero.module.css index c7a64507745..9d2b6e5b2ee 100644 --- a/src/components/LandingHero/landingHero.module.css +++ b/src/components/LandingHero/landingHero.module.css @@ -16,6 +16,17 @@ .title { font-weight: 400; margin-bottom: var(--space-8x); + white-space: nowrap; +} + +.title br { + display: none; +} + +@media (min-width: 768px) { + .title br { + display: inline; + } } .wrapper { @@ -46,6 +57,11 @@ height: 100%; } +.heroText { + max-width: 880px; /* wide enough for one line */ + padding-right: var(--space-16x); /* optical buffer from seam */ +} + @media screen and (max-width: 991px) { .wrapper { background-color: transparent; diff --git a/src/components/TryItOut/TryItOut.astro b/src/components/TryItOut/TryItOut.astro index c015f66c5bf..1100ae2d050 100644 --- a/src/components/TryItOut/TryItOut.astro +++ b/src/components/TryItOut/TryItOut.astro @@ -11,12 +11,18 @@ interface CTA { variant?: "primary" | "secondary" } +interface Tab { + title: string + text: string + codeSampleSrc: string + ctas?: CTA[] +} + interface Props { - accordionTabs: Array<{ title: string; text: string; codeSampleSrc: string }> - ctas: CTA[] + accordionTabs: Tab[] } -const { accordionTabs, ctas } = Astro.props +const { accordionTabs } = Astro.props ---
+ {/* Mobile CTAs (dynamic per active tab) */} @@ -102,5 +128,20 @@ const { accordionTabs, ctas } = Astro.props ;(activeCodeSample as HTMLElement).style.display = "block" ;(activeCodeSample as HTMLElement).setAttribute("aria-hidden", "false") } + + // Hide all CTA groups + const allCtas = document.querySelectorAll("[data-cta-index]") + allCtas.forEach((el) => { + ;(el as HTMLElement).style.display = "none" + ;(el as HTMLElement).setAttribute("aria-hidden", "true") + }) + + // Show the active CTA group(s) + // IMPORTANT: remove inline display so CSS (flex) can apply + const activeCtas = document.querySelectorAll(`[data-cta-index="${newIndex}"]`) + activeCtas.forEach((el) => { + ;(el as HTMLElement).style.removeProperty("display") // ✅ key fix + ;(el as HTMLElement).setAttribute("aria-hidden", "false") + }) }) diff --git a/src/components/TryItOut/styles.module.css b/src/components/TryItOut/styles.module.css index 2a3ec8b7684..e02874ae434 100644 --- a/src/components/TryItOut/styles.module.css +++ b/src/components/TryItOut/styles.module.css @@ -19,6 +19,35 @@ margin-top: 55px; } +/* NEW: CTA group wrapper should behave like the old footer (buttons as direct children) */ +.contentFooter :global(.cta-item), +.contentFooterMobile :global(.cta-item-mobile) { + display: flex; + gap: var(--space-6x); /* match footer spacing */ + align-items: center; +} + +/* Optional: ensure hidden groups don't occupy space (extra-safe) */ +.contentFooter :global(.cta-item[aria-hidden="true"]), +.contentFooterMobile :global(.cta-item-mobile[aria-hidden="true"]) { + display: none; +} + +/* prevent CTA row reflow across tabs */ +.contentFooter, +.contentFooterMobile { + min-height: 56px; /* keeps vertical stability too */ +} + +/* apply to actual anchor buttons inside the active CTA group */ +.contentFooter :global(.cta-item) a, +.contentFooterMobile :global(.cta-item-mobile) a { + width: 280px; /* tune */ + justify-content: center; /* centers text inside button */ + text-align: center; + white-space: nowrap; /* avoid wrapping */ +} + .content { display: grid; grid-template-columns: 1fr 1fr; diff --git a/src/pages/index.astro b/src/pages/index.astro index 3ea40693d4d..3acfe1b9141 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -24,36 +24,58 @@ const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.titl
- -
From b584675d340c98ac5a38f408648669bfe5595325 Mon Sep 17 00:00:00 2001 From: Mark Shenouda Date: Fri, 13 Feb 2026 08:57:15 +0200 Subject: [PATCH 203/214] Revert landing page redesign back to main version - Restored original index.astro with ProductTabs - Reverted to simple landing page without new components - Kept all other feature improvements (CCIP, Cards, etc.) --- .../landing/sections/ProductTabs.astro | 8 ++ .../landing/sections/ProductTabs.module.css | 4 + src/pages/index.astro | 133 ++++-------------- 3 files changed, 39 insertions(+), 106 deletions(-) create mode 100644 src/features/landing/sections/ProductTabs.astro create mode 100644 src/features/landing/sections/ProductTabs.module.css 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/pages/index.astro b/src/pages/index.astro index 3acfe1b9141..0c08784a072 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,99 +1,35 @@ --- -import JourneyCards from "~/components/JourneyCards/JourneyCards.astro" -import TechnicalStandards from "~/components/TechnicalStandards/TechnicalStandards.astro" +import ProductTabs from "../features/landing/sections/ProductTabs.astro" +import LandingLayout from "../layouts/LandingLayout.astro" +import HeroCTA from "../features/landing/sections/HeroCTA.astro" import BaseLayout from "~/layouts/BaseLayout.astro" import * as CONFIG from "../config" -import Demos from "~/components/Demos.astro" -import { Typography } from "@chainlink/blocks" -import LandingHero from "~/components/LandingHero/LandingHero.astro" -import TryItOut from "~/components/TryItOut/TryItOut.astro" -import CommunityEvents from "~/components/CommunityEvents/CommunityEvents.astro" const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.title}` ---
- - -
- -
- - - -
- +
+
+

Chainlink Developer Docs

+

What are you building?

+ +
- - - -
@@ -198,15 +134,6 @@ const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.titl background-color: var(--blue-100); } - .wrapper { - display: flex; - flex-direction: column; - max-width: var(--fullwidth-max-width); - padding: 0 var(--space-10x); - gap: 36px; - } - - /*800px*/ @media (min-width: 50em) { .hero { max-width: var(--fullwidth-max-width); @@ -232,6 +159,11 @@ const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.titl font-weight: 600; } + .recommended { + margin: var(--space-16x) auto; + max-width: var(--fullwidth-max-width); + } + .heroContainer { background: linear-gradient(180deg, #f1f5fe 0%, white 100%); } @@ -246,14 +178,8 @@ const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.titl line-height: var(--space-6x); margin-bottom: var(--space-2x); } - - .wrapper { - gap: 82px; - } } - - /* 992px */ - @media (min-width: 62em) { + @media (min-width: 72em) { .hero { max-width: min(1200px, calc(100% - 2 * var(--space-16x))); padding: 0; @@ -263,10 +189,5 @@ const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.titl max-width: min(1200px, calc(100% - 2 * var(--space-16x))); padding: 0; } - - .wrapper { - margin: 0 auto; - margin-top: 60px; - } } From 440f476e5634248bed4814fe9fc36f3d80fd3bc8 Mon Sep 17 00:00:00 2001 From: Mark Shenouda Date: Fri, 13 Feb 2026 09:05:01 +0200 Subject: [PATCH 204/214] Refactor Product Navigation and MegaMenu for Improved Usability and Mobile Support - Updated ProductNavigation component to change "Docs" to "Resources" and adjusted associated links. - Removed MegaMenuContainer and simplified MegaMenu rendering logic. - Created a new Mobile MegaMenu component for better mobile navigation experience. - Enhanced styling for MegaMenu and ProductNavigation components to improve layout and responsiveness. - Updated CSS styles for both desktop and mobile versions of MegaMenu. - Cleaned up unused imports and optimized component structure for maintainability. - Revised content in CCIP documentation to streamline information and improve clarity. --- .../ProductNavigation/Desktop/MegaMenu.tsx | 467 ++++++++++-------- .../Desktop/ProductNavigation.tsx | 26 +- .../Desktop/megaMenu.module.css | 146 +++--- .../Desktop/productNavigation.module.css | 13 + .../Nav/ProductNavigation/Mobile/MegaMenu.tsx | 94 ++++ .../Mobile/ProductNavigation.tsx | 18 +- .../Mobile/megaMenu.module.css | 142 ++++++ .../Mobile/productNavigation.module.css | 3 +- src/content/ccip/index.mdx | 355 +++---------- 9 files changed, 687 insertions(+), 577 deletions(-) create mode 100644 src/components/Header/Nav/ProductNavigation/Mobile/MegaMenu.tsx create mode 100644 src/components/Header/Nav/ProductNavigation/Mobile/megaMenu.module.css diff --git a/src/components/Header/Nav/ProductNavigation/Desktop/MegaMenu.tsx b/src/components/Header/Nav/ProductNavigation/Desktop/MegaMenu.tsx index a8a65f8f984..b13f9e55827 100644 --- a/src/components/Header/Nav/ProductNavigation/Desktop/MegaMenu.tsx +++ b/src/components/Header/Nav/ProductNavigation/Desktop/MegaMenu.tsx @@ -1,244 +1,305 @@ +import { evmProducts } from "~/features/landing/data/index.ts" import styles from "./megaMenu.module.css" -import ccipLogo from "../../../../../assets/product-logos/ccip-logo.svg" -import dataFeedsLogo from "../../../../../assets/product-logos/data-feeds-logo.svg" -import dataStreamsLogo from "../../../../../assets/product-logos/data-streams-logo.svg" -import dataLinkLogo from "../../../../../assets/product-logos/datalink-logo.svg" -import functionsLogo from "../../../../../assets/product-logos/functions-logo.svg" -import automationLogo from "../../../../../assets/product-logos/automation-logo.svg" -import vrfLogo from "../../../../../assets/product-logos/vrf-logo.svg" -import dtaLogo from "../../../../../assets/product-logos/dta-logo.svg" -import generalGlobeLogo from "../../../../../assets/product-logos/general-globe-logo.svg" -import nodesLogo from "../../../../../assets/product-logos/nodes-logo.svg" -import chainlinkLocalLogo from "../../../../../assets/product-logos/chainlink-local-2-logo.svg" -import creLogo from "../../../../../assets/product-logos/cre-logo.svg" -import { Typography } from "@chainlink/blocks" -import { clsx } from "../../utils.ts" +import resourcesLogo from "../../../../../assets/product-logos/data-resources-logo.svg" +import { Fragment } from "react/jsx-runtime" +import { useEffect } from "react" -const BlueSquare = () => { - return ( -
- ) +interface MegaMenuProps { + cancel: () => void + id?: string } -interface GroupItem { - title: string - description: string - icon: ImageMetadata - link: string +interface BottomLink { + label: string + href: string } -const GroupItem = ({ data }: { data: GroupItem }) => { - return ( - - {data.title} -
- - {data.title} - - - {data.description} - -
-
- ) +interface Link { + label: string + href?: string } -const GroupTitle = ({ children }: { children: React.ReactNode }) => { - return ( - - {children} - - ) +interface MenuItem { + title?: string + image?: { src: string } + description?: string + learnMoreLink?: string + docsLandingLink?: string + links: Link[] } -export const megaMenuSections = { - interoperability: { - title: "Interoperability", - items: [ - { - icon: ccipLogo, - title: "Cross-Chain Communication", - description: "Move data and value across any blockchain", - link: "/ccip", - }, - ], - }, - data: { - title: "Data", - items: [ - { - icon: dataStreamsLogo, - title: "Data Streams", - description: "Access high-frequency market data for next-gen DeFi", - link: "/data-streams", - }, - { - icon: dataFeedsLogo, - title: "Market and Data Feeds", - description: "Utilize ultra-secure onchain data for smart contracts", - link: "/data-feeds", - }, +interface SubSection { + title: string + items: MenuItem[] + bottomLinks?: BottomLink[] +} + +interface MegaMenuSection { + title: string + isMultiSection?: boolean + sections?: SubSection[] + items?: MenuItem[] + bottomLinks?: BottomLink[] +} + +export const megaMenuSections: MegaMenuSection[] = [ + { + title: "Orchestration & Cross-Chain", + isMultiSection: true, + sections: [ { - icon: dataLinkLogo, - title: "DataLink", - description: "Publish and commercialize institutional data across...", - link: "/datalink", + title: "Orchestration", + items: [ + { + ...(evmProducts.find((product) => product.title === "CRE") || {}), + links: [ + { + label: "Docs", + href: (evmProducts.find((product) => product.title === "CRE") || {})?.docsLandingLink, + }, + ], + }, + ], }, - ], - }, - assetManagement: { - title: "Asset Management", - items: [ { - icon: dtaLogo, - title: "Digital Transfer Agent (DTA) Technical Standard", - description: "Unlock streamlined tokenized fund operations", - link: "/dta-technical-standard", + title: "Cross-Chain", + items: [ + { + ...(evmProducts.find((product) => product.title === "CCIP") || {}), + links: [ + { + label: "Docs", + href: (evmProducts.find((product) => product.title === "CCIP") || {})?.docsLandingLink, + }, + { + label: "Learn", + href: (evmProducts.find((product) => product.title === "CCIP") || {})?.learnMoreLink, + }, + ], + }, + ], + bottomLinks: [ + { + label: "View all resources", + href: "https://dev.chain.link/resources", + }, + { + label: "Learn about Chainlink", + href: "https://dev.chain.link/products/general", + }, + ], }, ], }, - compute: { - title: "Compute", + { + title: "Data", items: [ { - icon: functionsLogo, - title: "Functions", - description: "Connect smart contracts to any API", - link: "/chainlink-functions", - }, - { - icon: automationLogo, - title: "Automation", - description: "Automate smart contracts via decentralized triggers", - link: "/chainlink-automation", + ...evmProducts.find((product) => product.title === "Data Feeds"), + title: "Data Feeds", + links: [ + { + label: "Docs", + href: (evmProducts.find((product) => product.title === "Data Feeds") || {})?.docsLandingLink, + }, + { + label: "Learn", + href: (evmProducts.find((product) => product.title === "Data Feeds") || {})?.learnMoreLink, + }, + ], }, + { - icon: vrfLogo, - title: "VRF", - description: "Ensure fair outcomes in games, NFTs, and more", - link: "/vrf", + ...evmProducts.find((product) => product.title === "Data Streams"), + title: "Data Streams", + links: [ + { + label: "Docs", + href: (evmProducts.find((product) => product.title === "Data Streams") || {})?.docsLandingLink, + }, + { + label: "Learn", + href: (evmProducts.find((product) => product.title === "Data Streams") || {})?.learnMoreLink, + }, + ], }, - ], - }, - orchestration: { - title: "Orchestration", - items: [ + { - icon: creLogo, - title: "Chainlink Runtime Environment (CRE)", - description: "The global orchestration layer", - link: "/cre", + title: "Data resources", + image: resourcesLogo, + description: "Global standard for building secure cross-chain applications.", + learnMoreLink: "data-feeds", + links: [ + { + label: "Learn", + href: "https://dev.chain.link/products/data", + }, + ], }, ], }, - other: { - title: "More", + { + title: "Compute", items: [ { - icon: generalGlobeLogo, - title: "General", - description: "Foundational Chainlink knowledge", - link: "/getting-started/conceptual-overview", + ...evmProducts.find((product) => product.title === "Automation"), + links: [ + { + label: "Docs", + href: (evmProducts.find((product) => product.title === "Automation") || {})?.docsLandingLink, + }, + { + label: "Learn", + href: (evmProducts.find((product) => product.title === "Automation") || {})?.learnMoreLink, + }, + ], }, { - icon: nodesLogo, - title: "Nodes", - description: "Be part of the Chainlink Network", - link: "/", + ...evmProducts.find((product) => product.title === "Functions"), + links: [ + { + label: "Docs", + href: (evmProducts.find((product) => product.title === "Functions") || {})?.docsLandingLink, + }, + { + label: "Learn", + href: (evmProducts.find((product) => product.title === "Functions") || {})?.learnMoreLink, + }, + ], }, { - icon: chainlinkLocalLogo, - title: "Chainlink local", - description: "Run services locally before transitioning to a testnet", - link: "/chainlink-local", + ...evmProducts.find((product) => product.title === "VRF"), + links: [ + { + label: "Docs", + href: (evmProducts.find((product) => product.title === "VRF") || {})?.docsLandingLink, + }, + { + label: "Learn", + href: (evmProducts.find((product) => product.title === "VRF") || {})?.learnMoreLink, + }, + ], }, ], }, -} +] + +function MegaMenu({ cancel, id }: MegaMenuProps) { + useEffect(() => { + const onESC = (ev: KeyboardEvent) => { + if (ev.key === "Escape") { + cancel() + } + } + window.addEventListener("keyup", onESC, false) + return () => { + window.removeEventListener("keyup", onESC, false) + } + }, []) -function MegaMenu({ cancel, isMobile }: { cancel?: () => void; isMobile?: boolean }) { return ( -
-
-
-
- - {megaMenuSections.orchestration.title} -
-
  • - {megaMenuSections.orchestration.items.map((link) => ( - - ))} -
  • +
    +
    +
    + {megaMenuSections.map((section) => ( +
    + {section.isMultiSection && section.sections ? ( + <> + {section.sections.map((subSection) => ( + +

    {subSection.title}

    + {subSection.items.map((item, index) => ( + +
    + {item?.image?.src && {item.title}} +

    {item.title}

    +
    +
    +

    {item.description}

    + {item.links.map((link, linkIndex) => ( + + + {link.label} + + {linkIndex < item.links.length - 1 && } + + ))} +
    +
    + ))} + {subSection.bottomLinks && ( +
    + {subSection.bottomLinks.map((link, linkIndex) => ( + + ))} +
    + )} +
    + ))} + + ) : ( + <> +

    {section.title}

    + {section.items?.map((item, index) => ( + +
    + {item?.image?.src && {item.title}} +

    {item.title}

    +
    +
    +

    {item.description}

    + {item.links.map((link, linkIndex) => ( + + + {link.label} + + {linkIndex < item.links.length - 1 && } + + ))} +
    +
    + ))} + {"bottomLinks" in section && section.bottomLinks && ( +
    + {section.bottomLinks.map((link, linkIndex) => ( + + ))} +
    + )} + + )} +
    + ))}
    -
    -
    - - {megaMenuSections.interoperability.title} -
    -
  • - {megaMenuSections.interoperability.items.map((link) => ( - - ))} -
  • -
    -
    -
    - - {megaMenuSections.assetManagement.title} -
    -
  • - {megaMenuSections.assetManagement.items.map((link) => ( - - ))} -
  • -
    -
    +
    +

    Featured

    + + + +
    -
    -
    -
    - - {megaMenuSections.data.title} -
    -
  • - {megaMenuSections.data.items.map((link) => ( - - ))} -
  • -
    -
    -
    - - {megaMenuSections.compute.title} -
    -
  • - {megaMenuSections.compute.items.map((link) => ( - - ))} -
  • -
    -
    -
    - - {megaMenuSections.other.title} -
    -
  • - {megaMenuSections.other.items.map((link) => ( - - ))} -
  • +

    Hardhat CLI for Data Streams

    + +

    Try out Chainlink Automation

    +
    diff --git a/src/components/Header/Nav/ProductNavigation/Desktop/ProductNavigation.tsx b/src/components/Header/Nav/ProductNavigation/Desktop/ProductNavigation.tsx index ffc10e66500..c6e0768cb9f 100644 --- a/src/components/Header/Nav/ProductNavigation/Desktop/ProductNavigation.tsx +++ b/src/components/Header/Nav/ProductNavigation/Desktop/ProductNavigation.tsx @@ -6,7 +6,6 @@ import { extendRadixComponent } from "../extendRadixComponent.ts" import styles from "./productNavigation.module.css" import { CaretIcon } from "../CaretIcon.tsx" import MegaMenu from "./MegaMenu.tsx" -import MegaMenuContainer from "./MegaMenuContainer.tsx" type Props = { setNavMenuOpen: (navMenuOpen: boolean) => void @@ -43,20 +42,27 @@ export const ProductNavigation = ({ setNavMenuOpen, showMegaMenu, isMegamenuOpen <> - + - Docs + Resources + + + Docs + + Demos @@ -68,21 +74,17 @@ export const ProductNavigation = ({ setNavMenuOpen, showMegaMenu, isMegamenuOpen - + Changelog - + Get Certified - {isMegamenuOpen && ( - - - - )} + {isMegamenuOpen && } ) diff --git a/src/components/Header/Nav/ProductNavigation/Desktop/megaMenu.module.css b/src/components/Header/Nav/ProductNavigation/Desktop/megaMenu.module.css index f586d708886..83ba42a3509 100644 --- a/src/components/Header/Nav/ProductNavigation/Desktop/megaMenu.module.css +++ b/src/components/Header/Nav/ProductNavigation/Desktop/megaMenu.module.css @@ -9,8 +9,15 @@ justify-content: center; } -/* applies shadow to dropdown version of mega-menu */ -.megaMenuContainer > .wrapper { +.wrapper { + max-width: 1360px; + width: 100%; + background-color: white; + height: fit-content; + border-radius: 0.5rem; + display: grid; + grid-template-columns: 3fr 1fr; + overflow: hidden; box-shadow: 4.6px 9.3px 54px 1px rgba(152, 160, 185, 0.04), 2.1px 4.3px 32px -0.7px rgba(152, 160, 185, 0.31), @@ -18,105 +25,108 @@ 0.3px 0.5px 0.8px 0px rgba(152, 160, 185, 0.12); } -.wrapper { - max-width: 1500px; - width: 100%; - background-color: white; - height: fit-content; - overflow: hidden; - display: flex; - flex-direction: column; +.wrapper h2 { + padding-bottom: var(--space-4x); + color: var(--gray-500); + text-transform: uppercase; + border-bottom: 1px solid var(--gray-200); + margin-bottom: var(--space-8x); +} - border: 1px solid var(--border); +.wrapper h3 { + font-family: var(--font-family-text); + color: var(--gray-900); } -.row { - display: grid; - grid-template-columns: repeat(3, 1fr); +.wrapper p { + color: var(--gray-500); + margin-top: var(--space-2x); + margin-bottom: var(--space-3x); + line-height: var(--space-6x); } -.row:last-child { - border-bottom: none; +.resourcesMenuContentMain { + padding-top: var(--space-16x); + padding-left: var(--space-16x); + padding-bottom: var(--space-16x); + padding-right: var(--space-8x); + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: var(--space-16x); } -.wrapper header { +.resourcesMenuContentRow { display: flex; - align-items: center; - gap: var(--space-3x); - padding: var(--space-4x) var(--space-6x); + flex-direction: column; } -.wrapper p { - margin-bottom: 0; +.verticalDivider { + border-left: 1px solid var(--gray-300); + margin: 0 var(--space-3x); } -.section { - display: flex; - flex-direction: column; - border-right: 1px solid var(--border); +.links { + margin-bottom: var(--space-10x); } -.section:last-child { - border-right: none; +.links a { + font-weight: var(--font-weight-medium); + color: var(--color-text-link); } -.section header { - border-bottom: 1px solid var(--border); +.resourcesMenuContentFeatured { + padding-top: var(--space-16x); + padding-left: var(--space-8x); + padding-bottom: var(--space-16x); + padding-right: var(--space-16x); + background-color: var(--gray-100); } -.groupItem { +.megaMenuLink { display: flex; align-items: center; - padding: var(--space-4x) var(--space-6x); - gap: var(--space-4x); - text-decoration: none; - transition: background-color 0.2s; + gap: var(--space-2x); } -.groupItem:hover { - background-color: var(--muted); +.megaMenuLink h3 { + margin-bottom: 0; } -.groupItemIcon { - width: 24px; - height: 24px; - flex-shrink: 0; +.megaMenuLink img { + width: var(--space-5x); + height: var(--space-5x); } -.itemList { - display: flex; - flex-direction: column; - padding: var(--space-2x); +.featuredImage { + width: 100%; } -.groupItemTitle { - font-size: 18px; - font-weight: 500; +.divider { + border-bottom: 1px solid var(--gray-200); + margin: var(--space-8x) auto; } -.wrapper.mobile { - border: none; - overflow: unset; - - & .row { - grid-template-columns: 1fr; - border-bottom: none; - } +.bottomLinks { + margin-top: auto; + display: flex; + flex-direction: column; + gap: var(--space-3x); +} - & .section header { - border-bottom: 1px solid var(--border); - border-top: 1px solid var(--border); - } +.bottomLinks div { + display: flex; + align-items: center; + gap: var(--space-2x); + line-height: var(--space-6x); +} - & .section { - border-right: none; - } +.bottomLinks a { + color: var(--gray-900); +} - & .itemList { - padding-top: var(--space-0); - padding-left: var(--space-0); - padding-right: var(--space-0); - } +/* TODO: change with a var when available in the chainlink repo */ +.bottomLink a:hover { + color: #0847f7; } @media screen and (min-width: 768px) { diff --git a/src/components/Header/Nav/ProductNavigation/Desktop/productNavigation.module.css b/src/components/Header/Nav/ProductNavigation/Desktop/productNavigation.module.css index 048809c260c..4057b7ac853 100644 --- a/src/components/Header/Nav/ProductNavigation/Desktop/productNavigation.module.css +++ b/src/components/Header/Nav/ProductNavigation/Desktop/productNavigation.module.css @@ -57,6 +57,19 @@ opacity: 1; } +.megaMenu::after { + content: ""; + position: absolute; + bottom: -35px; + right: 35%; + transform: translateX(-50%) rotate(45deg); + width: 20px; + height: 20px; + z-index: 100; + background-color: white; + padding: var(--space-2x); +} + @media screen and (min-width: 992px) { .root { display: flex; diff --git a/src/components/Header/Nav/ProductNavigation/Mobile/MegaMenu.tsx b/src/components/Header/Nav/ProductNavigation/Mobile/MegaMenu.tsx new file mode 100644 index 00000000000..bbab4ffc7ce --- /dev/null +++ b/src/components/Header/Nav/ProductNavigation/Mobile/MegaMenu.tsx @@ -0,0 +1,94 @@ +import styles from "./megaMenu.module.css" +import { Fragment } from "react/jsx-runtime" +import { megaMenuSections } from "../Desktop/MegaMenu.tsx" +import { useState } from "react" + +function MegaMenu() { + return ( +
    +
    + {megaMenuSections.map((section) => ( +
    +

    {section.title}

    + {section.items?.map((item, index) => ( + + ))} +
    + ))} + + +
    +
    +

    Featured

    + +
    + +

    Blockchain 101

    +
    + Docs + + SDK +
    +
    +
    + ) +} + +function MegaMenuItem({ + image, + title, + description, + links, +}: { + image?: string + title?: string + description?: string + links: { label: string; href?: string }[] +}) { + const [open, setOpen] = useState(false) + return ( + <> + + {open && ( +
    +

    {description}

    + {links.map((link, index) => ( + + + {link.label} + + {index < links.length - 1 && } + + ))} +
    + )} + + ) +} + +export default MegaMenu diff --git a/src/components/Header/Nav/ProductNavigation/Mobile/ProductNavigation.tsx b/src/components/Header/Nav/ProductNavigation/Mobile/ProductNavigation.tsx index d1e89e453e6..dc0f0371d88 100644 --- a/src/components/Header/Nav/ProductNavigation/Mobile/ProductNavigation.tsx +++ b/src/components/Header/Nav/ProductNavigation/Mobile/ProductNavigation.tsx @@ -6,7 +6,7 @@ import styles from "./productNavigation.module.css" import { MenuIcon } from "./MenuIcon.tsx" import { BackArrowIcon } from "./BackArrowIcon.tsx" import { CaretRightIcon } from "./CaretRightIcon.tsx" -import MegaMenu from "../Desktop/MegaMenu.tsx" +import MegaMenu from "./MegaMenu.tsx" const Trigger = extendRadixComponent(Dialog.Trigger) const Close = extendRadixComponent(Dialog.Close) @@ -71,22 +71,24 @@ export function ProductNavigation() { className={styles.productContentLink} onClick={() => setProductsSlidePosition("submenu")} data-testid="sub-product-navigation-trigger-mobile" - aria-label="Open Docs submenu" + aria-label="Open Resources submenu" > - Docs + Resources - + + Docs + Demos Tools - + Changelog - + Get Certified @@ -101,11 +103,11 @@ export function ProductNavigation() { > - Docs + Resources {/* Spacer */}
    - +
    diff --git a/src/components/Header/Nav/ProductNavigation/Mobile/megaMenu.module.css b/src/components/Header/Nav/ProductNavigation/Mobile/megaMenu.module.css new file mode 100644 index 00000000000..cf8382f3d30 --- /dev/null +++ b/src/components/Header/Nav/ProductNavigation/Mobile/megaMenu.module.css @@ -0,0 +1,142 @@ +.wrapper { + width: 100%; + border-radius: 0.5rem; + display: flex; + flex-direction: column; + max-height: calc(100vh - 68px); +} + +.wrapper h2 { + padding-bottom: var(--space-3x); + color: var(--gray-500); + text-transform: uppercase; + + border-bottom: 1px solid var(--gray-200); +} + +.wrapper h3 { + font-family: var(--font-family-text); + color: var(--gray-900); +} + +.wrapper p { + color: var(--gray-500); + margin-top: var(--space-2x); + margin-bottom: var(--space-3x); + line-height: var(--space-6x); +} + +.resourcesMenuContentMain { + padding: var(--space-6x) var(--space-8x) var(--space-4x) var(--space-8x); + display: flex; + flex-direction: column; + gap: var(--space-6x); +} + +.resourcesMenuContentRow { + display: flex; + flex-direction: column; +} + +.verticalDivider { + border-left: 1px solid var(--gray-300); + margin: 0 var(--space-3x); +} + +.links { + margin-bottom: var(--space-6x); + margin-left: var(--space-8x); +} + +.links a { + font-weight: var(--font-weight-medium); + color: var(--color-text-link); +} + +.resourcesMenuContentFeatured { + padding-top: var(--space-16x); + padding-left: var(--space-8x); + padding-bottom: var(--space-16x); + padding-right: var(--space-16x); + background-color: var(--gray-100); +} + +.megaMenuButton { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--space-4x) var(--space-1x); + cursor: pointer; +} + +.megaMenuButton span { + font-size: var(--space-6x); + font-weight: var(--font-weight-medium); + color: var(--gray-500); +} + +.megaMenuLink { + display: flex; + align-items: center; + gap: var(--space-2x); +} + +.megaMenuLink h3 { + margin-bottom: 0; +} + +.megaMenuLink img { + width: var(--space-5x); + height: var(--space-5x); +} + +.featuredImage { + width: 100%; +} + +.divider { + border-bottom: 1px solid var(--gray-200); + margin: var(--space-8x) auto; +} + +.bottomLinks { + padding: var(--space-6x) 0; + display: flex; + flex-direction: column; + gap: var(--space-8x); + border-top: 1px solid var(--gray-200); +} + +.bottomLinks div { + display: flex; + align-items: center; + gap: var(--space-2x); + line-height: var(--space-6x); +} + +.bottomLinks a { + color: var(--gray-900); +} + +/* TODO: change with a var when available in the chainlink repo */ +.bottomLink a:hover { + color: #0847f7; +} + +@media screen and (min-width: 768px) { + .megaMenuContainer { + display: flex; + } +} + +@media screen and (min-width: 1280px) { + .wrapper::before { + left: 31%; + } +} + +@media screen and (min-width: 1565px) { + .wrapper::before { + left: 35%; + } +} diff --git a/src/components/Header/Nav/ProductNavigation/Mobile/productNavigation.module.css b/src/components/Header/Nav/ProductNavigation/Mobile/productNavigation.module.css index b3bb2b4c22c..5994b36a9e4 100644 --- a/src/components/Header/Nav/ProductNavigation/Mobile/productNavigation.module.css +++ b/src/components/Header/Nav/ProductNavigation/Mobile/productNavigation.module.css @@ -34,7 +34,6 @@ width: 200vw; display: flex; transition: transform 0.3s; - height: 100%; } .main { @@ -72,11 +71,11 @@ overflow: scroll; list-style: none; width: 100vw; + padding-bottom: 56px; } .subProductContent { display: flex; flex-direction: column; - height: 100%; } .subProductContentTitle { diff --git a/src/content/ccip/index.mdx b/src/content/ccip/index.mdx index 1f107d208cc..a2bc305caff 100644 --- a/src/content/ccip/index.mdx +++ b/src/content/ccip/index.mdx @@ -8,293 +8,31 @@ metadata: datePublished: "2023-08-03" lastModified: "2025-05-19" isIndex: true -disableDefaultStyles: true -hideTitle: true +whatsnext: + "Complete the Getting Started guide to learn the basics": "/ccip/getting-started" + "CCIP Directory": "/ccip/directory" + "Learn how to transfer tokens": "/ccip/tutorials/evm/transfer-tokens-from-contract" + "Learn more about CCIP architecture": "/ccip/concepts/architecture" --- -import LayoutHero from "@components/LayoutHero/LayoutHero.astro" -import { ChainAwareTabGrid } from "@components/TabGrid/ChainAwareTabGrid.tsx" -import ResourceSection from "@components/Resource/ResourceSection.astro" -import QuickLinkCard from "@components/QuickLinkCard/QuickLinkCard.astro" -import ToolsUtilitiesGrid from "@components/ToolsUtilitiesGrid/ToolsUtilitiesGrid.astro" -import MediaSection from "@components/MediaSection/MediaSection.astro" -import CardsWrapper from "@components/Cards/CardsWrapper.astro" -import OverviewWrapper from "@components/OverviewWrapper.astro" -import ChangelogSnippet from "@components/ChangelogSnippet/ChangelogSnippet.astro" -import { - SvgEyeOptic, - SvgTransactionRepeatRecurring, - SvgWaveSignal, - SvgStartup, - SvgCrossChain, - SvgBulletList, -} from "@chainlink/blocks" -import { ClickToZoom } from "@components" - -export const toolsAndUtilities = [ - { - image: "/images/ccip-logo.svg", - imageAlt: "CCIP API icon", - label: "CCIP API", - link: "/ccip/api-reference", - description: "An API for message retrieval and lane latency information.", - }, - { - image: "/images/js-logo.svg", - imageAlt: "JavaScript SDK icon", - label: "Javascript SDK", - link: "https://github.com/smartcontractkit/ccip-javascript-sdk", - description: "Integrate CCIP functionality directly into your web applications for EVM-compatible chains.", - }, - { - image: "/images/ts-logo.svg", - imageAlt: "CLI icon", - label: "CLI", - link: "https://github.com/smartcontractkit/ccip-tools-ts", - description: "TypeScript command-line interface and library designed for interacting with deployed CCIP contracts.", - }, - { - image: "/images/hardhat-logo.svg", - imageAlt: "Hardhat icon", - label: "Hardhat Starter Kit", - link: "https://github.com/smartcontractkit/hardhat-starter-kit", - description: - "Ready-to-go boilerplate for basic CCIP use cases that help you get started building quickly with Hardhat.", - }, - { - image: "/images/foundry-logo.svg", - imageAlt: "Foundry icon", - label: "Foundry Starter Kit", - link: "https://github.com/smartcontractkit/foundry-starter-kit", - description: - "Ready-to-go boilerplate for basic CCIP use cases that help you get started building quickly with Foundry.", - }, - { - image: "/images/npm-logo.png", - imageAlt: "NPM icon", - label: "CCIP Contracts NPM", - link: "https://www.npmjs.com/package/@chainlink/contracts-ccip", - description: - "An npm package providing Solidity smart contract implementations to integrate CCIP into your EVM-based project.", - }, - { - image: "/images/direct-stacking-logo.svg", - imageAlt: "Direct Staking icon", - label: "Direct Staking", - link: "https://github.com/Aphyla/chainlink-csr", - description: - "Stake native tokens on supported L2 networks and receive liquid staked tokens directly on the same chain.", - }, -] - -export const exampleResources = [ - { - label: "Token Pool Types", - description: - "Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs. Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs...", - link: "/", - type: "article", - }, - { - label: "Token Pool Types", - description: - "Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs. Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs...", - link: "/", - type: "article", - }, - { - label: "Token Pool Types", - description: - "Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs. Explore the various token pool types supported by the Cross-Chain Token (CCT) standard with Chainlink Labs...", - link: "/", - type: "article", - }, -] - -export const exampleTutorials = [ - { - name: "EVM", - links: [ - { - title: "Acquire Test Tokens", - description: "Get test tokens in minutes; build and test cross-chain apps with zero friction.", - link: "/ccip/test-tokens", - }, - { - title: "Transfer Tokens", - description: "Unlock seamless token transfers from contracts; learn, code, and deploy.", - link: "/ccip/tutorials/evm/transfer-tokens-from-contract", - }, - { - title: "Transfer Tokens with Data", - description: "Go beyond basic transfers with logic-infused token movements in your EVM contracts.", - link: "/ccip/tutorials/evm/programmable-token-transfers", - }, - { - title: "Using the Token Manager", - description: "Effortlessly manage CCTs by tracking, importing and organizing tokens from your dashboard.", - link: "/ccip/tutorials/evm/token-manager", - }, - { - title: "Using the JS SDK", - description: "Integrate CCIP in your frontend or backend effortlessly with JavaScript SDK.", - link: "/ccip/ccip-javascript-sdk", - }, - { - title: "Check Message Status", - description: "Retrieve real-time status of your offchain transaction from EVM.", - link: "/ccip/tutorials/evm/offchain/get-status-offchain", - }, - { - title: "Transfer Tokens Between EOAs", - description: "Send tokens offchain from an Externally Owned Account with clear steps.", - link: "/ccip/tutorials/evm/offchain/transfer-tokens-from-eoa", - }, - { - title: "Using the CLI", - description: "Use offchain tools from CCIP to simplify your Ethereum workflows.", - link: "/ccip/tutorials/evm/offchain/ccip-tools", - }, - { - title: "Deploy and Register a CCT", - description: "Use RemixIDE to launch and configure tokens for cross-chain transfers on CCIP.", - link: "/ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-remix", - }, - { - title: "Register CCT Burn & Mint EOA", - description: "Implement burn-mint cross-chain token logic with CCIP using Hardhat or Foundry.", - link: "/ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-burn-mint-hardhat", - }, - { - title: "Register CCT Lock & Mint EOA", - description: "Implement a lock-mint token registration workflow with CCIP and Hardhat or Foundry.", - link: "/ccip/tutorials/evm/cross-chain-tokens/register-from-eoa-lock-mint-hardhat", - }, - { - title: "Set Token Pool Rate Limits", - description: "Update rate limiter settings for your cross-chain tokens using Hardhat or Foundry.", - link: "/ccip/tutorials/evm/cross-chain-tokens/update-rate-limiters-hardhat", - }, - ], - }, - { - name: "Solana", - links: [ - { - title: "Getting Started with Solana", - description: "Learn the basics of building on Solana blockchain.", - link: "/ccip/tutorials/svm", - }, - { - title: "Solana Token Transfers", - description: "Transfer tokens on the Solana blockchain.", - link: "/ccip/tutorials/svm/source/token-transfers", - }, - ], - }, - { - name: "Aptos", - links: [ - { - title: "Getting Started with Aptos", - description: "Start building on the Aptos blockchain.", - link: "/ccip/tutorials/aptos", - }, - ], - }, -] - -export const quickLinks = [ - { - icon: SvgEyeOptic, - label: "View Network Configs", - link: "https://docs.chain.link/ccip/directory/mainnet", - }, - { - icon: SvgTransactionRepeatRecurring, - label: "Check Transaction Status", - link: "https://ccip.chain.link/", - }, - { - icon: SvgWaveSignal, - label: "View Lane Status", - link: "https://ccip.chain.link/status", - }, - { - icon: SvgStartup, - label: "Get Testnet Tokens", - link: "https://tokenmanager.chain.link/", - }, - { - icon: SvgCrossChain, - label: "Convert Chainlink tokens", - link: "https://www.transporter.io/", - }, - { - icon: SvgBulletList, - label: "View the Changelog", - link: "https://dev.chain.link/changelog?product=CCIP", - }, -] - -export const cardLinks = [ - { - title: "Deploy/enable a token across multiple chains", - description: - "Create a new Cross-Chain-Token or enable an established one that can be launched on 50+ chains, providing unparalleled interoperability and reach.", - links: [ - { - icon: "token", - href: "https://example.com", - label: "View Token Manager", - }, - { - icon: "remix", - href: "https://example.com", - label: "Open in Remix", - }, - ], - }, - { - title: "Bridge a token", - description: - "Securely transfer tokens - including ETH, USDC, LINK - and messages between different blockchain networks.", - links: [ - { - icon: "token", - href: "https://example.com", - label: "View Token Manager", - }, - { - icon: "remix", - href: "https://example.com", - label: "Open in Remix", - }, - ], - }, - { - title: "Send a token with data", - description: - "Build token transfers that do more than move value, letting you embed business logic directly into your cross-chain workflows.", - links: [ - { - icon: "remix", - href: "https://example.com", - label: "Open in Remix", - }, - ], - }, -] +import { ClickToZoom, Aside } from "@components" +import CcipCommon from "@features/ccip/CcipCommon.astro" + + + +Blockchain interoperability protocols are important for the Web3 ecosystem and traditional systems that need to interact with different blockchains. These protocols are the foundation for building blockchain abstraction layers, allowing traditional backends and dApps to interact with any blockchain network through a single middleware solution. Without a blockchain interoperability protocol, Web2 systems and dApps would need to build separate in-house implementations for each cross-chain interaction that they want to use, which is a time-consuming, resource-intensive, and complex process. + +Blockchain interoperability protocols provide the following capabilities: + +- You can transfer assets and information across multiple blockchains. +- Application developers can leverage the strengths and benefits of different chains. +- Collaboration between developers from diverse blockchain ecosystems enables the building of cross-chain applications to serve more users and provide additional features or products for them. + +The _Chainlink Cross-Chain Interoperability Protocol (CCIP)_ provides these capabilities and enables a variety of [use cases](#common-use-cases). ## What is Chainlink CCIP? - - - - - - - +Chainlink CCIP is a blockchain interoperability protocol that enables developers to build secure applications that can transfer tokens, messages (data), or both tokens and messages across chains. Given the [inherent risks of cross-chain interoperability](/resources/bridge-risks), CCIP features [defense-in-depth security](https://blog.chain.link/five-levels-cross-chain-security/#level_5__defense-in-depth) and is powered by Chainlink's industry-standard oracle networks which have a proven track record of securing tens of billions of dollars and enabling over $14 trillion in onchain transaction value. @@ -306,9 +44,58 @@ CCIP's robust security framework is built upon several core components: - **High-Quality, Sybil-Resistant Node Operators**: The system is secured by the same globally distributed, security-reviewed, public node operators that secure other Chainlink services, validate leading blockchain networks, and operate traditional Web2 infrastructure. Each independent CCIP node is run by a distinct organization with extensive DevOps expertise and rigorous private key management security practices. -To understand how Chainlink CCIP works, refer to the [architecture](/ccip/concepts/architecture/overview) section. If you are new to using Chainlink CCIP, read these guides before you deploy any contracts that use CCIP. +To understand how Chainlink CCIP works, refer to the [architecture](/ccip/concepts/architecture) section. If you are new to using Chainlink CCIP, read these guides before you deploy any contracts that use CCIP. + +## Chainlink CCIP core capabilities + +Chainlink CCIP supports three main capabilities: + +### Arbitrary Messaging + +The ability to send arbitrary data (encoded as bytes) to a receiving smart contract on a different blockchain. The developer is free to encode any data they wish to send. + +Typically, developers use arbitrary messaging to trigger an informed action on the receiving smart contract, such as rebalancing an index, minting a specific NFT, or calling an arbitrary function with the sent data as custom parameters. Developers can encode multiple instructions in a single message, enabling them to orchestrate complex, multi-step, multi-chain tasks. + +### Token Transfer + +The ability to transfer tokens to an account on a different blockchain. This capability enables the seamless movement of assets across chains. + +### Programmable Token Transfer + +The ability to simultaneously transfer tokens and arbitrary data (encoded as bytes) within a single transaction. This mechanism allows users to transfer tokens and send instructions on what to do with those tokens. + +For example, a user could transfer tokens to a lending protocol with instructions to leverage those tokens as collateral for a loan, borrowing another asset to be sent back to the user. + +### Receiving account types + +With CCIP, you send transactions with data (arbitrary messaging), tokens, or both data and tokens (programmable token transfer). The receiver of a CCIP transaction varies by blockchain family: + +| CCIP capability | What is sent | Receiving account types | +| --------------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| Arbitrary Messaging | Data | EVM: Smart contracts only
    SVM: Programs only
    Aptos: Modules only | +| Token Transfer | Tokens | EVM: Smart contracts and EOAs
    SVM: User wallets or program-controlled PDAs
    Aptos: User accounts or modules deployed to resource accounts | +| Programmable Token Transfer | Data and tokens | EVM: Smart contracts only
    SVM: Data to programs, tokens to program-controlled PDAs
    Aptos: Modules deployed to resource accounts | + +**Note**: On EVM chains, EOAs cannot receive messages. On Solana (SVM), programs work with Program Derived Addresses (PDAs) to manage token reception. + +## Common use cases + +Chainlink CCIP enables a variety of use cases: + +- **Cross-chain lending:** Chainlink CCIP enables users to lend and borrow a wide range of crypto assets across multiple DeFi platforms running on independent chains. +- **Low-cost transaction computation:** Chainlink CCIP can help offload the computation of transaction data on cost-optimized chains. +- **Optimizing cross-chain yield:** Users can leverage Chainlink CCIP to move collateral to new DeFi protocols to maximize yield across chains. +- **Creating new kinds of dApps:** Chainlink CCIP enables users to take advantage of network effects on certain chains while harnessing compute and storage capabilities of other chains. + +Read [What Are Cross-Chain Smart Contracts](https://chain.link/education-hub/cross-chain-smart-contracts) to learn about cross-chain smart contracts and examples of use cases they enable. + +## CCIP Directory + +See the [CCIP Directory](/ccip/directory) page for a list of supported networks, tokens, and contract addresses. + +To learn about tokens, token pools, and the token onboarding process, see the [CCIP Architecture](/ccip/concepts/cross-chain-token/evm/token-pools) page. From cca7e2a6b3134a8f68f182e63b709c538f7a27b2 Mon Sep 17 00:00:00 2001 From: Mark Shenouda Date: Fri, 13 Feb 2026 09:13:39 +0200 Subject: [PATCH 205/214] Add DocsPickerDesktop component and integrate into DocsNavigationDesktop; update layout files to include DocsNavigation --- .../DocsNavigationDesktop.tsx | 6 +- .../DocsPickerDesktop.tsx | 63 +++++++++++++++++++ src/components/Header/Nav/navBar.module.css | 1 + src/layouts/BaseLayout.astro | 2 - src/layouts/DocsLayout.astro | 15 ++++- src/layouts/TutorialLayout.astro | 2 + 6 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 src/components/DocsNavigation/DocsNavigationDesktop/DocsPickerDesktop.tsx diff --git a/src/components/DocsNavigation/DocsNavigationDesktop/DocsNavigationDesktop.tsx b/src/components/DocsNavigation/DocsNavigationDesktop/DocsNavigationDesktop.tsx index bf09832475c..f1a88b5395f 100644 --- a/src/components/DocsNavigation/DocsNavigationDesktop/DocsNavigationDesktop.tsx +++ b/src/components/DocsNavigation/DocsNavigationDesktop/DocsNavigationDesktop.tsx @@ -1,5 +1,6 @@ import { clsx } from "~/lib/clsx/clsx.ts" import { useNavBar } from "../../Header/useNavBar/useNavBar.ts" +import DocsPickerDesktop from "./DocsPickerDesktop.tsx" import styles from "./docsNavigationDesktop.module.css" import QuickLinksModal from "../../Header/Nav/QuickLinksModal.tsx" import { useState } from "react" @@ -28,7 +29,10 @@ function DocsNavigationDesktop({ })} >
    -
    {children}
    +
    + + {children} +
    {isCcipPage ? ( /* Custom links for CCIP Directory pages */ diff --git a/src/components/DocsNavigation/DocsNavigationDesktop/DocsPickerDesktop.tsx b/src/components/DocsNavigation/DocsNavigationDesktop/DocsPickerDesktop.tsx new file mode 100644 index 00000000000..feb8d80bcfb --- /dev/null +++ b/src/components/DocsNavigation/DocsNavigationDesktop/DocsPickerDesktop.tsx @@ -0,0 +1,63 @@ +import { useState } from "react" +import { isMatchedPath } from "../../Header/Nav/isMatchedPath.ts" +import { getNavigationProps } from "../../Header/getNavigationProps.ts" +import styles from "./docsPickerDesktop.module.css" +import { clsx } from "../../Header/Nav/utils.ts" +import defaultLogo from "../../../assets/product-logos/default-logo.svg" + +function DocsPickerDesktop({ pathname }: { pathname: string }) { + const [productMenuOpen, setProductMenuOpen] = useState(false) + const { subProductsNav } = getNavigationProps() + + const subProductTrigger = subProductsNav?.find(({ href }) => isMatchedPath(pathname, href)) + + const label = subProductTrigger?.label || "Resources" + const icon = subProductTrigger?.label ? subProductTrigger.icon : defaultLogo.src + + return ( +
    setProductMenuOpen(true)} + onMouseLeave={() => setProductMenuOpen(false)} + > + + {label} +
    + +
    + {productMenuOpen && ( +
    +
      + {subProductsNav + .filter((item) => !item.hideFromDropdown && item.col === 1) + .map((item) => ( +
    • + + + {item.label} + +
    • + ))} +
    +
      + {subProductsNav + .filter((item) => !item.hideFromDropdown && item.col === 2) + .map((item) => ( +
    • + + + {item.label} + +
    • + ))} +
    +
    + )} +
    + ) +} + +export default DocsPickerDesktop diff --git a/src/components/Header/Nav/navBar.module.css b/src/components/Header/Nav/navBar.module.css index 643ac110ed9..cd830ad0652 100644 --- a/src/components/Header/Nav/navBar.module.css +++ b/src/components/Header/Nav/navBar.module.css @@ -96,6 +96,7 @@ display: flex; justify-content: center; align-items: center; + z-index: 999; } .modalContentWrapper { diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 2a8ae9cfa79..73f06501528 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -6,8 +6,6 @@ import Header from "~/components/Header/Header.astro" import { NewsletterCTA } from "~/components/Footer/NewsletterCTA" import Footer from "~/components/Footer/Footer.astro" import { Metadata, QuickstartsFrontmatter } from "~/content.config.ts" -import "@chainlink/blocks/src/theme/globals.css" - // interface Props { diff --git a/src/layouts/DocsLayout.astro b/src/layouts/DocsLayout.astro index b877a0763c9..3693d42a46a 100644 --- a/src/layouts/DocsLayout.astro +++ b/src/layouts/DocsLayout.astro @@ -8,9 +8,9 @@ import WhatsNext from "~/components/PageContent/WhatsNext.astro" import type { MarkdownHeading } from "astro" import StickyHeader from "~/components/StickyHeader/StickyHeader" import BaseLayout from "./BaseLayout.astro" +import DocsNavigation from "~/components/DocsNavigation" import { VersionSelector } from "~/components/VersionSelector/index.js" import { detectApiReference } from "@components/VersionSelector/utils/versions" -import CardsWrapper from "~/components/Cards/CardsWrapper.astro" import { LanguageSwitcherDropdown } from "~/components/LanguageSwitcherDropdown" import { ChainTypeSelector } from "~/components/ChainSelector" import { isChainAwareSection } from "~/config/chainTypes" @@ -67,6 +67,7 @@ const howToSteps = initialHeadings > +
    @@ -95,7 +96,12 @@ const howToSteps = initialHeadings {whatsNext && }
    @@ -139,6 +145,11 @@ const howToSteps = initialHeadings max-width: 1505px; } + #grid-left, + #left-bg { + background: #fafbfd; + } + #grid-left, #grid-right { display: flex; diff --git a/src/layouts/TutorialLayout.astro b/src/layouts/TutorialLayout.astro index c968d9cf957..6c572bb9647 100644 --- a/src/layouts/TutorialLayout.astro +++ b/src/layouts/TutorialLayout.astro @@ -7,6 +7,7 @@ import WhatsNext from "~/components/PageContent/WhatsNext.astro" import type { MarkdownHeading } from "astro" import StickyHeader from "~/components/StickyHeader/StickyHeader" import BaseLayout from "./BaseLayout.astro" +import DocsNavigation from "~/components/DocsNavigation" import { TutorialProgress } from "~/components/CCIP/TutorialProgress/TutorialProgress" interface Props { @@ -31,6 +32,7 @@ const formattedContentTitle = `${frontmatter.title} | ${SITE.title}` +
    From 033385c9cc9fb69af42278e330d1201b7d79b4a5 Mon Sep 17 00:00:00 2001 From: Mark Shenouda Date: Fri, 13 Feb 2026 09:26:03 +0200 Subject: [PATCH 206/214] Refactor LeftSidebar and styles for improved layout and accessibility --- src/components/LeftSidebar/LeftSidebar.astro | 53 +++------- .../LeftSidebar/leftSidebar.module.css | 97 ++++--------------- .../LeftSidebar/recursiveSidebar.module.css | 50 ++++------ 3 files changed, 49 insertions(+), 151 deletions(-) diff --git a/src/components/LeftSidebar/LeftSidebar.astro b/src/components/LeftSidebar/LeftSidebar.astro index 960265a8aac..78f691d9717 100644 --- a/src/components/LeftSidebar/LeftSidebar.astro +++ b/src/components/LeftSidebar/LeftSidebar.astro @@ -6,9 +6,9 @@ import RecursiveSidebar from "./RecursiveSidebar.astro" import { LanguageSwitcherDropdown } from "~/components/LanguageSwitcherDropdown" import { ChainTypeSelector } from "~/components/ChainSelector" import { isChainAwareSection } from "~/config/chainTypes" +import { filterContentByChainType } from "~/utils/chainType" +import type { ChainType } from "~/config/types" import styles from "./leftSidebar.module.css" -import DocsHeaderTitle from "../DocsHeaderTitle/DocsHeaderTitle.astro" -import * as CONFIG from "../../config" type SectionEntryWithParent = SectionEntry & { parentSection?: string } @@ -83,10 +83,14 @@ const sidebarSections = getSidebarSections(section) --- @@ -153,7 +124,7 @@ const sidebarSections = getSidebarSections(section)
    {activeTab === TokenTab.Inbound ? "Source" : "Destination"} network - Rate limit capacity + Mechanism - Rate limit refill rate + Rate limit capacity FTF Rate limit capacityFTF Rate limit refill rate - Mechanism + Rate limit refill rate StatusFTF Rate limit capacityFTF Rate limit refill rateVerifiers
    -
    - {`${networkDetails?.name} +
    +
    + {`${networkDetails?.name} + {networkDetails?.name} + {tokenPaused && ( + + ⏸️ + + )} +
    +
    + {activeTab === TokenTab.Outbound + ? determineTokenMechanism(network.tokenPoolType, destinationPoolType) + : determineTokenMechanism(destinationPoolType, network.tokenPoolType)} + + - {networkDetails?.name} - {tokenPaused && ( - - ⏸️ - - )} - - - - - - - - - - - {activeTab === TokenTab.Outbound - ? determineTokenMechanism(network.tokenPoolType, destinationPoolType) - : determineTokenMechanism(destinationPoolType, network.tokenPoolType)} - - - - - - Operational - -
    + + + + + + +
    + + + +
    +
    +
    + {destinationVerifiers.length === 0 ? ( +
    + No verifiers found for this network. +
    + ) : ( + + + + + + + + + + + {destinationVerifiers.map((verifier) => ( + + + + + + + ))} + +
    VerifierSource verifier addressDestination verifier addressThreshold amount
    +
    + {`${verifier.name} + {verifier.name} +
    +
    +
    +
    +
    +
    + 150,000 +
    + )} +
    +

    >p`ncdRc7Ks#gg+U=y>`Lz68 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 literal 0 HcmV?d00001 diff --git a/public/images/certification/Tailless--Arrow-Down.svg b/public/images/certification/Tailless--Arrow-Down.svg new file mode 100644 index 00000000000..2a3ca0873aa --- /dev/null +++ b/public/images/certification/Tailless--Arrow-Down.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/certification/image-1.png b/public/images/certification/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..850eff21ee00bd53adea911b1a67e491571ba787 GIT binary patch literal 30293 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 I55u7U1CE>?kpKVy literal 0 HcmV?d00001 diff --git a/public/images/certification/image-200.png b/public/images/certification/image-200.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf069cc5e1013fef017ab50c74b78a11c562d66 GIT binary patch literal 207526 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�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 BF-iac literal 0 HcmV?d00001 diff --git a/public/images/certification/image-201.png b/public/images/certification/image-201.png new file mode 100644 index 0000000000000000000000000000000000000000..5975fc2082d3a8c0b2bb146bd5f6c51e6674ab12 GIT binary patch literal 73109 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 Sn-2B>0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/certification/image-learnings.svg b/public/images/certification/image-learnings.svg new file mode 100644 index 00000000000..4d6df7915c3 --- /dev/null +++ b/public/images/certification/image-learnings.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/code-sample.png b/public/images/code-sample.png new file mode 100644 index 0000000000000000000000000000000000000000..89aa34475dfd197f22b04881c8697b055bf16bae GIT binary patch literal 76453 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